Давно меня терзали мысли перевести интерфейс (отображение информации и управление) Ардуины в Андроид-телефон, уж больно он разросся, но как подумаешь, что для этого Java штурмовать придется, желание делать это как-то сразу пропадало.
И вот на днях набрел случайно на совершенно потрясную штуку -
MIT App Inventor 2.
Написание Андроид-программы для людей, совсем не знакомых с программированием. Очень похоже на хорошо мне знакомый
Scratch (с дочкой занимаюсь).
Среда разработки - онлайн в браузере.
Как и во "взрослой" Android Studio, написание состоит из двух частей, в первом окне с помощью драг&дропа набрасываем компоненты, вторая - написание логики. Просто до неприличия.
В общем стряхнул я пыль с давно валявшегося
HC-05 уже практически через полчаса в телефон пошла первая информация с Ардуины.
Подключается он по Serial, все стандартно, передаю данные с Ардуины в таком виде:
<24.5, 40, 200, 14:10:08, 12, 10, 1, 1>
Данные, разделенные запятыми, т.н. CSV-формат. Температура, влажность, текущее время, люксы, количество часов красных диодов, и то же для синих, включен ли красный, и синий. Ну и по краям символы начала и конца строки, чтоб можно было проверить ее целостность.
Сначала накидали компонентов:
Подключаемся, MAC-адрес сразу прописал, чтоб не заморачиваться с поиском-выбором устройств. Повесил на таймер, срабатывающий через полсекунды после старта программы.
Раз в секунду считываем все байты, стоящие в очереди и отправляем на обработку в функцию trim_start.
Поскольку полученные данные могут быть повреждены, в функции trim_start делаем простейшую проверку (проверяем наличие символов начала и конца строки, чтобы символ начала шел впереди символа конца)
Разбиваем строку на элементы и наполняем ими массив data_list.
И затем раз в секунду разносим наши данные по нужным компонентам (в температуре и влажности вычисляем угол поворота стрелки)
Ну и параллельно проверяем и меняем состояние кнопок (включено/выключено, ставит соотв. картинку).
Отправлять данные в Ардуину будем в следующем формате:
R_12>
Первый символ, что именно меняем (R-для красных диодов, B-для синих, T-для времени).
Вот к примеру для красных (формируем строку для отправки и выставляем флаг transmit, показыающий, что есть что оправить):
Собственно отправка:
Теперь принимаем их в Ардуине:
char reb_array[20] ;
int lll=0;
while (Serial1.available() > 0) { //если пришли данные
reb_array[lll]=Serial1.read(); // считываем байты и заполняем ими массив reb_array
lll++;
}
Далее парсим строку и в зависимости от первой буквы меняем нужные переменные:
char * pch;
pch = strtok (reb_array,"_");
String pp = (String)pch;
if(pp == "R"){ pch = strtok (NULL, ">");
String r1=(String)pch;
time_red_duration = r1.toInt();}
if(pp == "B"){pch = strtok (NULL, ">");
String r1=(String)pch;
time_blue_duration=r1.toInt();}
Вот итоговый вид программы (пока сделал только основное, мелоча потом добавлю):
Сверху два "спидометра" температуры и влажности, ниже люксометр, далее кнопки красных и синих диодов (выполняют три функции: 1 - показывают включены или нет, 2-текущий режим, 3-при нажатии принудительно включают/выключают их). Ниже время, далее слайдеры установки режима работы диодов. И в самом низу кнопка установки времени на Ардуине, т.е. его синхронизации со временем телефона (у меня сгорел модуль часов, поэтому после каждого включения приходилось вручную его устанавливать, теперь я лишен этой "радости").
В общем архиудобная штука, теперь нет необходимости тулить громоздкое каскадное меню для отображения и управление (они уже сейчас занимают около 60% кода в Ардуине), намного удобнее, можно проверять, управлять дистанционно, значительно красивше, здорово экономит время при написании кода, возможно деньги (управляющие элементы и дисплей теперь не обязательно покупать и тулить к устройству), громадный простор для фантазии (построение графиков, передача в интернет, сложная логика на стороне телефона и т.д. и т.п.). И на удивление о такой интересной штуке довольно мало информации в интернете. Надеюсь кому пригодится, здесь уже не только я Ардуиной страдаю