77 проектов Arduino
.pdf
Эксперимент 75 |
341 |
Подписчики могут получать разные данные от множества издателей в зависимости от подписки на соответствующие топики.
Топики представляют собой символы с кодировкой UTF-8. Иерархическая структура топиков имеет формат "дерева", что упрощает их организацию и доступ к данным. Топики состоят из одного или нескольких уровней, которые разделены между собой символом "/".
/home/living /living-room1/temperature
Устройства MQTT используют определенные типы сообщений для взаимодействия
сброкером, ниже представлены основные:
Connect – установить соединение с брокером;
Disconnect – разорвать соединение с брокером;
Publish – опубликовать данные в топик на брокере;
Subscribe – подписаться на топик на брокере;
Unsubscribe – отписаться от топика.
Схема взаимодействия между подписчиком, издателем и брокером показана на рис. 75.1.
Рис.75.1.Схема взаимодействия по протоколу MQTT
Однако MQTT требует наличие своего собственного сервера брокера. Тут есть два выхода: либо создавать свой сервер, либо использовать сторонние сервисы. Например, удобный сервис www.cloudmqtt.com, у которого есть бесплатный тарифный план (Cute Cat).
После регистрации, выбора тарифного плана, местоположения сервера (EU или USA) создается устройство, в котором можно посмотреть Ваши данные: адрес сервера, имя и пароль пользователя, порты подключения и ключ API key (hbc/ 75.2).
Настроим отправку данных брокеру с нашей домашней метеостанции (эксперимент 74). Мы оставим без изменений схему соединений и скетч для Arduino (можно только значительно уменьшить интервал отправки данных с датчиков из Arduino в последовательный порт). Изменяем скетч для модуля ESP8266. При написании скетча используем библиотеку PubSubClient. Необходимо из строки, получаемой из Arduino по последовательному порту выделить показания температуры, влажности и атмосферного давления:
int h1=inputString.indexOf("H1="); int h2=inputString.indexOf("&T1=");
Эксперимент 75 |
343 |
#define topich "/meteo/humidity" #define topict "/meteo/temperature" #define topicp "/meteo/pressure"
//данные, пришедшие из последовательного порта
String inputString = ""; String inputString1 = "";
//строка пришла
boolean stringComplete = false;
void setup(void){ delay(5000);
Serial.begin(115200); WiFi.begin(ssid, password); Serial.print("*");
// Подсоединение к точке доступа
while (WiFi.status() != WL_CONNECTED) { delay(500);
Serial.print(".");
}
Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.print("$");
client.setClient(wclient); client.setServer(mqtt_server, mqtt_port);
}
void loop(void){
if (!client.connected()) { reconnect();
}
client.loop();
// проверка данных по последовательному порту serialEvent1();
if (stringComplete) {
//публикация данных publishData(inputString);
//очистить строку inputString = ""; stringComplete = false;
}
}
// переподключение к mqtt
Эксперимент 75 |
345 |
client.publish(topich, String(h).c_str(), true); delay(500);
client.publish(topict, String(t).c_str(), true); delay(500);
client.publish(topicp, String(p).c_str(), true);
}
Скачать данный скетч можно на сайте Arduino-kit по ссылке https://arduino-kit.ru/scetches/exp_75_01.zip.
Переключатели на плате Arduino+WiFi необходимо установить следующим образом и загрузить скетч на ESP8266.
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
|
|
|
|
|
|
OFF |
OFF |
OFF |
OFF |
ON |
ON |
ON |
|
|
|
|
|
|
|
Открываем монитор последовательного порта, и пробуем отправлять строку вида:
/get?ID=440365430747&H1=45&T1=13&P1=713$
Идет выделение данных из строки и отправка данных на сервер в темы (рис. 75.3).
Рис.75.3.Получение строки данных по последовательному порту
Эксперимент 76.
Получение данных по протоколу MQTT
В этом эксперименте рассмотрим получение данных по протоколу MQTT
Вэксперименте мы будем использовать следующие компоненты из эксперимента
75.В эксперименте 75 мы рассмотрели отправку данных с нашей домашней метеостанции на брокер MQTT, расположенный по адресу www.cloudmqtt.com. В этом эксперименте рассмотрим получение данных по протоколу MQTT для управления исполнительными устройствами, подключенными к домашней метеостанции через Relay shield.
Отправить данные на метеостанцию можно из профиля на сайтеwww.cloudmqtt. com – пункт меню WEBSOCKET UI (рис. 76.1).
Рис.76.1.Отправка команд управления из профиля cloudmqtt.com
Отправлять данные будем в темы /meteo/relay1 и /meteo/relay2. Чтобы получать данные команды от сервера (брокера), наше устройство при подключении к брокеру должно подписаться на эти темы:
client.subscribe("/meteo/relay1");
client.subscribe("/meteo/relay2");
Теперь необходимо назначить функцию обратного вызова callback для обработки сообщений от брокера, которая формирует строку команд управления для отправки по последовательному порту на Arduino:
Эксперимент 76 |
349 |
Более удобный вариант – использование Android-приложения IoT MQTT Dashboard, который можно использовать в качестве пульта, а так же для отображения информации с датчиков домашней метеостанции. Приложение представляет собой готовый mqtt клиент с небольшим количеством очень удобных виджетов.
Скачиваем приложение на телефон. Сначала создаем новое соединение и прописываем данные из нашего профиля cloudmqtt (рис. 76.3).
Рис.76.3.Создание соединения
Выбираем созданное соединение и во вкладке PUBLISH создаем виджеты (switch) для отправки данных в темы /meteo/relay1 и /meteo/relay2 (рис. 76.4, 76.5, 76.6). Теперь можно проверить отправку сообщений в темы /meteo/relay1 и /meteo/relay2.
