
Переносим функции мониторинга и управления теплицей на телефон или планшет с ОС Android
Сегодня новое усовершенствование системы – мы перенесем функции мониторинга и управления теплицей на телефон (или планшет) с операционной системой Android. Во-первых, это очень удобно, во-вторых мы можем исключить из системы ряд деталей, а именно дисплей и кнопки. Эти функции на себя возьмет телефон (или планшет).
Напомним: в предыдущих статьях по Умной теплице (проект «Домашний цветок») «Умная теплица на Arduino- делаем первые шаги» и «Индикация показаний при проектировании Умной теплицы на Ардуино» и Организация полива, обдува и освещения в Умной теплице на Ардуиномы реализовали функции мониторинга и вывода данных на дисплей и светодиоды, а также функции управления — полив цветка, обдув, освещение нажатием соответствующих кнопок.
Связь Arduino с телефоном будем осуществлять по Bluetooth и нам понадобится одна деталь:
- Bluetooth-модуль HC-05 – 1 шт;
Bluetooth-модуль HC-05 (рисунок 1) позволяет наладить двунаправленную радиосвязь по протоколу bluetooth.
Рисунок 1. Bluetooth-модуль HC-05
Нам необходимо подключить bluetooth модуль HC-05 к arduino и получать или отправлять данные на arduino с помощью приложения на Android.
Подключение модуля к Arduino осуществляется по последовательному порту. Аппаратный последовательный порт Arduino у нас занят – мы используем его для отладки программы, поэтому для связи с Bluetooth-модулем будем использовать программный последовательный порт.
Библиотека SoftwareSerial позволяет реализовать последовательный интерфейс на любых цифровых выводах Ардуино с помощью программных средств, дублирующих функциональность UART.
Прежде чем использовать Bluetooth-модуль, его необходимо настроить. Настройка модуля осуществляется отправкой в него AT-команд. Для настройки модуля его необходимо перевести в режим программирования (подключить вывод 34 микросхемы модуля к 3,3В (припаять проводок)).
Подключение Bluetooth-модуля HC-05 к Arduino по схеме на рисунке 2. Заметьте что питание модуля 3,3 В! В качестве контактов программного последовательного интерфейса будем использовать цифровые выводы 17 и 18, которые освободятся после удаления из системы кнопок.
Рисунок 2. Схема подключения Bluetooth-модуля HC-05 для режима программирования
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 1 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.
Листинг 1.
// подключение библиотеки #include // указываем пины rx и tx соответственно SoftwareSerial mySerial(17, 18); void setup() { pinMode(17,INPUT); pinMode(18,OUTPUT); Serial.begin(9600); mySerial.begin(38400); Serial.println("start prg"); } void loop() { if (mySerial.available()) { char c = mySerial.read(); // читаем из software-порта Serial.print(c); // пишем в hardware-порт } if (Serial.available()) { char c = Serial.read(); // читаем из hardware-порта mySerial.write(c); // пишем в software-порт } }
После загрузки скетча на плату мы можем приступить к режиму программирования.
Вот список команд, которые нам понадобятся
Рисунок 3. Список основных команд модуля HC-05.
Отправим на плату следующие команды (см. рисунок 3).
Получить имя модуля:
AT+NAME?
Установить имя модуля:
AT+NAME=smarthouse1
Получить код доступа к модулю:
AT+PSWD?
Установить код доступа к модулю:
AT+PSWD=1234
Получить параметры обмена:
AT+UART?
Установить параметры обмена:
AT+UART=9600,0,0
Получить режим работы модуля:
AT+ROLE?
Установить режим работы модуля (slave)
AT+ROLE=0
И очень важный параметр, без которого наш модуль не будет виден Android-устройством – CLASS, значение которого должно быть равно 7936
AT+CLASS=7936
Отправим данные команды в последовательный порт (рисунок 4).
Рисунок 4. Программирование модуля HC-05.
После программирования модуля отсоединим вывод 34 от 3,3 В и попробуем подсоединиться к нему с телефона (или планшета) (см. рисунки 5, 6, 7).
Рисунок 5. Поиск на планшете Bluetooth-устройств.
Рисунок 6. Ввод кода авторизации.
Рисунок 7. Удачное подключение.
Новая схема соединений для нашей Умной теплицы (рисунок 8).
Рисунок 8. Схема соединений.
Теперь необходимо изменить предыдущий скетч. Нам надо удалить фрагменты кода, связанные с выводом данных на дисплей и обработкой нажатий клавиш. И добавить отправку данных в bluetooth-модуль HC-05 по SoftwareSerial, а также получение и обработку данных, поступающих по SoftwareSerial для команд включения/выключения насоса, вентилятора и лампы.
Формат отправления данных мониторинга в SoftwareSerial:
Команда
Описание
aH=\r\n
данные влажности dht11
SM=\r\n
данные увлажненности почвы Soil Moisture
aT=\r\n
данные температуры tmp36
Ph=\r\n
данные освещенности — фоторезистор
PM=\r\n
состояние реле включения/выключения (1/0) насоса
FN=\r\n
состояние реле включения/выключения (1/0) вентилятора
LM=\r\n
состояние реле включения/выключения (1/0) лампы
Формат команд управления из SoftwareSerial:
Команда
Описание
PM=1#
включение насоса
PM=0#
выключение насоса
FN=1#
включение вентилятора
FN=0#
выключение вентилятора
LM=1#
включение лампы
LM=0#
выключение лампы
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 2 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.
Листинг 2.
// подключение библиотеки SoftwareSerial #include // подключение библиотеки DHT #include "DHT.h" // тип датчика DHT #define DHTTYPE DHT11 // контакты подключения bluetooth-модуля HC-05 int pinBlRx=17; int pinBlTx=18; // контакт подключения входа данных модуля DHT11 int pinDHT11=9; // контакт подключения аналогового выхода модуля влажности почвы int pinSoilMoisture=A0; // контакт подключения аналогового выхода датчика температуры TMP36 int pinTMP36=A1; // контакт подключения аналогового выхода фоторезистора int pinPhotoresistor=A2; // пины светодиодов индикации #define LED_TEMP 5 #define LED_MOISTURE 6 #define LED_LIGHT 7 // значения для условий #define TEMP_DETECT 30 #define MOISTURE_DETECT 500 #define LIGHT_DETECT 250 // реле int pinRelays[]={2,3,4}; // статусы полива, освещения, вентилятора boolean statusRelays[]={false,false,false}; // создание экземпляра объекта SoftwareSerial SoftwareSerial HC05Serial(pinBlRx,pinBlTx); // создание экземпляра объекта DHT DHT dht(pinDHT11, DHTTYPE); unsigned long millisupdate=0; // для получения данных из SoftwareSerial String inputString0 = ""; // признак конца полученной строки boolean stringComplete0 = false; void setup() { // запуск последовательного порта Serial.begin(9600); // pinMode(LED_TEMP,OUTPUT);digitalWrite(LED_TEMP,LOW); pinMode(LED_MOISTURE,OUTPUT);digitalWrite(LED_MOISTURE,LOW); pinMode(LED_LIGHT,OUTPUT);digitalWrite(LED_LIGHT,LOW); // инициализация dht dht.begin(); // запуск SoftwareSerial HC05Serial.begin(9600); // резервирование 50 bytes для the inputString: inputString0.reserve(50); } void loop() { // ожидание конца строки для анализа поступившего запроса: serialEvent0(); if (stringComplete0) { Serial.println(inputString0); parse_string0(inputString0); // очистить : inputString0 = ""; stringComplete0 = false; } // каждые 5 сек - получение показаний датчиков // и вывод на дисплей if(millis()-millisupdate>5000) { millisupdate=millis(); // получение данных с DHT11 float h = dht.readHumidity(); if (isnan(h)) { Serial.println("Failed to read from DHT"); HC05Serial.println("H1=101"); delay(10); } else { Serial.print("HumidityDHT11= "); Serial.print(h);Serial.println(" %"); HC05Serial.print("aH=");HC05Serial.print(h);HC05Serial.println(); delay(10); } // получение значения с аналогового вывода модуля влажности почвы int val0=analogRead(pinSoilMoisture); Serial.print("SoilMoisture= "); Serial.println(val0); HC05Serial.print("SM=");HC05Serial.print(h);HC05Serial.println(); delay(10); // получение значения с аналогового вывода датчика температуры TMP36 int val1=analogRead(pinTMP36); // перевод в мВ int mV= val1*1000/1024; // перевод в градусы цельсия int t=(mV-500)/10+75;//t=23; Serial.print("TempTMP36= "); Serial.print(t);Serial.println(" C"); HC05Serial.print("aT=");HC05Serial.print(t);HC05Serial.println(); delay(10); // получение значения с аналогового вывода фоторезистора int val2=analogRead(pinPhotoresistor); Serial.print("Light= "); Serial.println(val2); HC05Serial.print("Ph=");HC05Serial.print(val2);HC05Serial.println(); delay(10); // обновить // вывод состояние полива, лампы, вентилятора Serial.print("pump - "); Serial.println(statusRelays[2]); Serial.print("fun - "); Serial.println(statusRelays[1]); Serial.print("lamp - "); Serial.println(statusRelays[0]); HC05Serial.print("PM=");HC05Serial.print(statusRelays[2]);HC05Serial.print(" "); delay(10); HC05Serial.print("FN=");HC05Serial.print(statusRelays[1]);HC05Serial.print(" "); delay(10); HC05Serial.print("LM=");HC05Serial.print(statusRelays[0]);HC05Serial.println(" "); delay(10); //// проверка условий // увлажненность почвы if(val0 > MOISTURE_DETECT) digitalWrite(LED_MOISTURE,HIGH); else digitalWrite(LED_MOISTURE,LOW); // температура воздуха if(t > TEMP_DETECT) digitalWrite(LED_TEMP,HIGH); else digitalWrite(LED_TEMP,LOW); // освещенность if(val2 < LIGHT_DETECT) digitalWrite(LED_LIGHT,HIGH); else digitalWrite(LED_LIGHT,LOW); // пауза 5 секунд Serial.println(); } } // SerialEvent для HC05 void serialEvent0() { while (HC05Serial.available()) { // получить очередной байт: char inChar = (char)HC05Serial.read(); // добавить в строку inputString0 += inChar; // /n - конец передачи if (inChar == '#') { stringComplete0 = true; } } } // парсинг строки из android void parse_string0(String inputString) { // длина строки int length1=inputString.length(); if(length1!=5) {Serial.println("ERROR1"); return;} if(inputString.charAt(2)!='=') {Serial.println("ERROR2"); return;} if(inputString.charAt(4)!='#') {Serial.println("ERROR3"); return;} String param1=inputString.substring(0,2); int param2=inputString.substring(3,4).toInt(); Serial.print("param1=");Serial.println(param1); Serial.print("param2=");Serial.println(param2); if(param1=="PM") doCommand(2,min(param2,1)); else if(param1=="FN") doCommand(1,min(param2,1)); else if(param1=="LM") doCommand(0,min(param2,1)); } // исполнение команды от смартфона void doCommand(int relay, int status1) { // изменить статус statusRelays[relay]=status1; // изменить состояние реле digitalWrite(pinRelays[relay],statusRelays[relay]); }
Т.к. нашего приложения под Android пока нет, отправлять и получать данные будем из приложения Bluetooth Terminal, которое скачаем в Play Market. Установим, подключимся из Bluetooth Terminal к нашему модулю (рисунки 10, 11, 12) и увидим отправку данных из Arduino на наш телефон (рисунок 13). Также отправляем команды управления – включения/выключения насоса, вентилятора и лампы (рисунок 14).
Рисунок 9. Установка программы Bluetooth Terminal из Play Market.
Рисунок 10, 11, 12. Подключение к устройству из программы Bluetooth Terminal.
Рисунок 13. Отправка данных мониторинга на планшет в программу Bluetooth Terminal.
Рисунок 14. Отправка данных мониторинга на планшет и команд на Arduino из программы Bluetooth Terminal.
Рисунок 15. Проект «Домашний цветок».
На следующем уроке мы займемся написанием приложения для телефона (или планшета) на операционной системе Android.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.