В данной главе рассмотрим управление исполнительными устройствами, подключенными к NodeMCU, из мобильного приложения IoT Manager. В скетч для NodeMCU необходимо внести следующие изменения. Изменяем количество виджетов для отображения (увеличение на количество исполнительных устройств):
const int nWidgets = 5;
В процедуре initVar() прописываем настройки для виджетов управления исполнительными устройствами, нам необходим виджет toggle. Параметру page[] присваиваем значение RelaysNodemcu, что позволит на экране мобильного приложения IoT Manager разделять датчики и исполнительные устройства по разным вкладкам.
id [2] = "2";
page [2] = "RelaysNodeMcu";
descr [2] = "Light";
widget[2] = "toggle";
//pin[0] = 4;
defaultVal[2] = 0;
inverted[2] = false;
sTopic[2] = prefix + "/" + deviceID + "/light";
color[2] = "\"color\":\"red\"";
id [3] = "3";
page [3] = "RelaysNodeMcu";
descr [3] = "Pump";
widget[3] = "toggle";
//pin[0] = 4;
defaultVal[3] = 0;
inverted[3] = false;
sTopic[3] = prefix + "/" + deviceID + "/pump";
color[3] = "\"color\":\"red\"";
id [4] = "4";
page [4] = "RelaysNodeMcu";
descr [4] = "Fun";
widget[4] = "toggle";
//pin[0] = 4;
defaultVal[4] = 0;
inverted[4] = false;
sTopic[4] = prefix + "/" + deviceID + "/fun";
color[4] = "\"color\":\"red
Добавляем параметры конфигурации отображения виджетов управления исполнительными устройствами, которые необходимо направить брокеру:
thing_config[2] = "{\"id\":\"" + id[2] + "\",\"page\":\"" + page[2]+"\",\"descr\":\"" + descr[2] + "\",\"widget\":\"" + widget[2] + "\",\"topic\":\"" + sTopic[2] + "\"," + color[2] + "}";
thing_config[3] = "{\"id\":\"" + id[3] + "\",\"page\":\"" + page[3]+"\",\"descr\":\"" + descr[3] + "\",\"widget\":\"" + widget[3] + "\",\"topic\":\"" + sTopic[3] + "\"," + color[3] + "}";
thing_config[4] = "{\"id\":\"" + id[4] + "\",\"page\":\"" + page[4]+"\",\"descr\":\"" + descr[4] + "\",\"widget\":\"" + widget[4] + "\",\"topic\":\"" + sTopic[4] + "\"," + color[4] + "}";
Необходимо обрабатывать получаемые из брокера сообщения об изменении статуса исполнительных устройств. Вносим изменения в функцию callback:
void callback(const MQTT::Publish& sub) {
Serial.print("Get data from subscribed topic ");
Serial.print(sub.topic());
Serial.print(" => ");
Serial.println(sub.payload_string());
if (sub.topic() == sTopic[2] + "/control") {
if (sub.payload_string() == "0") {
newValue = 1; // inverted
stat[2] = stat0;
} else {
newValue = 0; // inverted
stat[2] = stat1;
}
digitalWrite(pin[2],newValue);
pubStatus(sTopic[2], stat[2]);
} else if (sub.topic() == sTopic[0] + "/control") {
// ADC : nothing, display only
} else if (sub.topic() == sTopic[1] + "/control") {
// ADC : nothing, display only
} else if (sub.topic() == sTopic[2] + "/control") {
if (sub.payload_string() == "0") {
newValue = 1; // inverted
stat[2] = stat0;
} else {
newValue = 0; // inverted
stat[2] = stat1;
}
datarelays[0]= newValue;
set_status_relays();
pubStatus(sTopic[2], stat[2]);
} else if (sub.topic() == sTopic[3] + "/control") {
if (sub.payload_string() == "0") {
newValue = 1; // inverted
stat[3] = stat0;
} else {
newValue = 0; // inverted
stat[3] = stat1;
}
datarelays[1]= newValue;
set_status_relays();
pubStatus(sTopic[3], stat[3]);
} else if (sub.topic() == sTopic[4] + "/control") {
if (sub.payload_string() == "0") {
newValue = 1; // inverted
stat[4] = stat0;
} else {
newValue = 0; // inverted
stat[4] = stat1;
}
datarelays[2]= newValue;
set_status_relays();
pubStatus(sTopic[4], stat[4]);
} else if (sub.topic() == prefix) {
if (sub.payload_string() == "HELLO") {
pubConfig();
}
}
}
Функция set_status_relays() включает/выключает исполнительные устройства:
void set_status_relays() {
int relays=0;
for(int i=0;i<7;i++)
relays=relays +( datarelays[i]<<i);
// записать данные в PORT B
Wire.beginTransmission(0x20);
Wire.write(0x13); // address PORT B
Wire.write(leds); // PORT B
Wire.endTransmission();
delay(100); // пауза
}
Скачиваем полный скетч на сайте www.arduino-kit.ru по ссылке. Загружаем его на плату NodeMCU, открываем монитор последовательного порта и видим отправку данных с датчиков (рис. 9.15).
Рис. 9.15. Лог отправки в мониторе последовательного порта Arduino IDE.
И смотрим данные на смартфоне в приложении IoT Manager (рис. 9.16). Виджеты получения данных и управления исполнительными устройствами расположены в разных вкладках (рис. 9.17).
Рис. 9.16. Отображение виджетов на смартфоне в приложении IoT Manager (вкладка Все).
Рис. 9.17. Вкладка виджетов управления исполнительными устройствами.
Изменение состояния toggle к публикации измененных данных в тему /IoTmanager/SmarhouseNodemcu/xxx и плата NodeMCU, получая эти данные(см. рис. 9.18), изменяет состояние соответствующего исполнительного устройства.
Рис. 9.18. Получение данных платой NodeMCU.
Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке.