В прошлой статье мы рассмотрели способ отправки данных на MQTT сервер и увидели данные, которые приходят в окно браузера. Но это не очень удобно, поэтому скачаем клиент на телефон и сделаем красивую оболочку с отображением температуры. Обычно все разбирают установку на Android устройство – в iOs действительно не такой богатый выбор приложений. Я попробовал несколько и остановился на IoT OnOff.
Заходим в меню Configuration – Broker. И вводим основные параметры с нашего аккаунта в cloudMqtt. Вводим Host$ порт у меня заработал только “Websockets Port (TLS only)”, а в качестве директории я указал имя, потому что все топики начинаются с имени пользователя.
Далее переходим в authentication, где нужно поменять имя пользователя и пароль. В предыдущей статье мы создавали отдельного пользователя User1 с паролем и правами, в cloudMqtt его и будем вводить в это меню.
Возвращаемся в меню настроек, теперь снизу статус должен стать зелёным, с атрибутом “connected”.
Можно перейти в меню Dashboards – это наши странички с необходимой информацией с удалённых устройств. Здесь можно удалять и добавлять индикаторы, стрелочки и т.д. Я удалил стандартные, а добавить новые можно кнопкой edit, затем кнопкой “Add” снизу.
Теперь задаём имя для нашего нового дашборда.
Как только перейдём в дашборд, сверху справа жмём edit, потом снизу слева появляется иконка с плюсом, её и нажимаем. Так можно добавить новые виджеты.
Перед нами появляется список виджетов. Мне кажется, для температуры подходит такой прогресс-бар, его и выберу.
Отредактируем созданный индикатор – ему нужно задать имя, минимальную границу отображения значения и максимальную. Также я добавил 2 знака после запятой (Decimals) и указал C, как температуру в значениях (Unit).
Переходим в самое важное меню редактирования виджета – subscribe, это путь на топик, с которого мы будем считывать информацию. Его имя, как вы помните, мы задаём в ESP8266, в среде Arduino IDE. У меня был такой путь до температуры – первые два значения легко найти в самом cloudMqtt. Первая папка – имя/ вашего аккаунта, которое присвоил сервис mqtt; вторая будет одинаковая – feeds. Этот путь легко подсмотреть во вкладке WEBSOCKET UI, в самом онлайн сервисе.
Возвращаемся в главный экран дашборда и проверяем значения – должно отобразиться текущее значение температуры.
Теперь попробуем сделать переключатель, да не простой, а умный, который подписывается на текущее значение топика, отображает состояние и позволяет его поменять. Сначала вернёмся в Arduino IDE, и сделаем новый паблишер – состояние вывода – и опрос топика. Назовём statusLed, но вместо светодиода, понятное дело, можно подключить что угодно.
Adafruit_MQTT_Publish statusLed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/statusLed");
Далее сконфигурируем наш светодиод.
#define ACTION_LED 6 // Светодиод к 6 выводу
void setup() {
pinMode(ACTION_LED, OUTPUT); // Конфигурация на выход
Создадим отправку состояния светодиода для паблишера statusLed. Считывать текущее состояние светодиода будем командой digitalRead(ACTION_LED)
// Now we can publish stuff!
Serial.print(F("\nSending statusLed = "));
Serial.print(digitalRead(ACTION_LED));
Serial.print("...");
if (! statusLed.publish(digitalRead(ACTION_LED))) {
Serial.println(F("Failed"));
} else {
Serial.println(F("OK!"));
}
Теперь немного переделаем наш дашборд в приложении iot OnOff. Добавим следующий переключатель, как на скриншоте слева.
Обратим внимание на настройки, здесь есть интересный момент, где нужно указать какие значения переключатель считывает для отображения, а какие отправляет от пользователя. Изначально они установлены в true и false, я их для простоты обработки заменил на 0 и 1. Для чего вообще это нужно? Например, если к системе имеет доступ несколько человек, вы можете сразу увидеть текущее состояние исполнительного устройства (лампочки) и, если что, переключить его (её).
Теперь зададим имя топика в подменю subscribe – это тот путь, куда переключатель будет подписываться, т.е. на наше устройство, а оно будет отправлять статус светодиода; мы это запрограммировали выше, как statusLed. Заполняем.
Значение же, которое установил пользователь, будем отправлять также на MQTT сервер в виде топика statusClient. Желательно выключить Prefix device name, во всяком случае, у меня путь становился с ним некорректный.
Теперь создадим подписку на топик statusClient в самом устройстве.
Adafruit_MQTT_Subscribe statusClient = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/statusClient");
Для работоспособности подписки необходимо задать ещё один параметр с нашим именем.
// Setup MQTT subscription
mqtt.subscribe(&statusClient);
Также потребуется задать опрос в цикле loop(), где у нас опрашивается состояние топика.
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
if (subscription == &statusClient) {
Serial.print(F("Got: "));
Serial.println((char *)statusClient.lastread);
}
}
Теперь проверим отправку состояния светодиода и получение данных с программы. Я запустил устройство, и параллельно с клиента телефона переключал свитчер.
Отлично, данные плата получает, но действия никакого нет, поэтому светодиод остаётся не зажжённым, и на телефоне переключатель принимает прежнее положение, ведь устройство ему рапортует, что, мол, ничего не поменялось. Добавим действие для включения светодиода в обработчик события statusClient. Сразу после вывода в серийный порт списываем следующее условие включения светодиода.
if (atoi((char *)statusClient.lastread) == 1) {
digitalWrite(ACTION_LED, HIGH);
} else digitalWrite(ACTION_LED, LOW);
Здесь мы применили функцию atoi (ANSII To Integer) – преобразовали строковую переменную в число. Далее, сравниваем значение с 1, и если оно истинно, то включаем светодиод.
В итоге, мы разобрали основные моменты работы с MQTT протоколом, используя популярные платформы и среду программирования Arduino IDE – как получение информации с самого устройства, так и передачу данных с клиента на аппаратную часть.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.