cloudmqtt с esp8266 nodemcu

Отправка данных на cloudMQTT сервер с ESP8266

от автора

в

В следующих двух статья научимся отправлять данные на MQTT сервер, а также принимать их обратно, попутно выполняя команды на стороне устройства, с красочным отображением на вашем смартфоне. Первым делом нужно зарегистрироваться на сервере MQTT, мой выбор пал на популярный cloudmqtt. Чтобы долго не искать, переходим по прямой ссылке для регистрации нового аккаунта

https://customer.cloudmqtt.com/signup

Вводим почту, затем подтверждаем ссылку, которая быстро упадёт во входящие. В открывшейся странице нужно будет указать пароль, и подтвердить условия лицензионного соглашения

После авторизации, в главном меню можно выбрать любой из этих пунктов, так мы создадим новый брокер, куда будем отправлять топики с информацией

Далее задаём любое имя брокера, и самое главное – выбираем тарифный план Cute Cat, это бесплатно и подходит для нашей цели

Также можно выбрать сервер, но разницы никакой между ними нет для наших целей, я оставил тот, что стоит по умолчанию

Теперь, если перейти к нашему созданному брокеру, можно увидеть важную информацию для подключения. Эти параметры мы будем вводить в коде Arduino IDE

Ещё, я создал пользователя, которого буду использовать на клиентском устройстве. Переходим во вкладку USERS & ACL, пишем имя нового пользователя (я сделал User1) , пароль и жмём зелёную кнопку + ADD

Теперь самая важная часть – нужно назначить права пользователю, которого мы только что создали. Листаем ниже до вкладки ACLs , выбираем тип Topic, потом пользователя (в моём случае, User1) и в поле pattern пишем “#” (без кавычек), также отмечаем события Read Access/ Write Access, и снова жмём зелёную кнопку + ADD

Теперь перейдём к написанию программы на аппаратной части. Подготовим наш esp8266, и запустим среду Arduino IDE. Почти все примеры в сети используют библиотеку PubSubClient, но у меня как-раз таки не получилось завести эту либу вместе с cloudMqtt, поэтому я случайно обратился к примеру Adafruit, с которым у меня всё увенчалось успехом. Переходим в менеджер библиотек, вводим в поиске mqtt, и ищем библиотеку Adafruit MQTT Library. Устанавливаем

Ищем в примерах вкладку adafruit, а далее mqtt_esp8266, создаём новый проект на основе этого примера

Первым делом находим в тексте проекта и заполняем поля wi-fi, чтобы подключиться к активной сети интернета

#define WLAN_SSID       "Keenetic-8322"
#define WLAN_PASS       "*************"

Чуть ниже можно заметить 4 основных параметра для подключения к серверу MQTT. Наверное вы уже поняли, что они были перечислены в параметрах созданного брокера в cloudMqtt. Переписываем их из вашего аккаунта

#define AIO_SERVER      "tailor.cloudmqtt.com"
#define AIO_SERVERPORT  18989                   // use 8883 for SSL
#define AIO_USERNAME    "****xnmc"
#define AIO_KEY         "****kHFzzJdw"

После загрузки скетча, можно открыть терминал и убедиться в работоспособности отправки данных в MQTT. Надпись MQTT connected и успешная отправка в топик “…OK!”, означает что всё в порядке.

Данные, отправляемые примером (а это постоянный инкремент переменной “х”), это не так интересно, попробуем отправить температуру, а потом отобразить её на телефоне. Как подключить датчик DS18B20 к ESP8266 мы подробно рассматривали в статье, с этим сложностей возникнуть не должно. Нам даже не понадобится преобразовывать значение температуры в текстовую, поэтому функцию сбора температуры можно сократить до:

void getTemperature()
{
  DS18B20.requestTemperatures();
  tempC = DS18B20.getTempCByIndex(0);
  delay(100);
}

Теперь посмотрим, какая команда отвечает за публикацию топика. Изначальное значение photocell я сменил на temperature, ведь мы хотим отправить значение с термометра. /feeds/temperature – это имя топика, на которого можно будет потом подписаться с другого устройства

Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

Но это ещё не всё, ниже есть ещё один блок, который отвечает за публикацию. Сначала мы видим вывод в терминал, там я тоже поменял строки на температуру, но самое главное поменять переменную здесь, в паблишере – > (! temperature.publish(tempC))

  // Now we can publish stuff!
  Serial.print(F("\nSending temperature = "));
  getTemperature();                            // Считываем температуру перед отправкой на сервер
  Serial.print(tempC);
  Serial.print("...");
  if (! temperature.publish(tempC))            // Здесь указываем переменную, которую хотим отправить
  {
    Serial.println(F("Failed"));
  } else {
    Serial.println(F("OK!"));
  }

Прошиваем ESP. и смотрим терминал – видим, что теперь отправляются значения температуры, и они корректно считываются. Осталось самое главное – проверить, приходят ли они на сервер MQTT

Теперь переходим на онлайн сервисе во вкладку WEBSOCKET UI, и смотрим наши приходящие сообщения. Если вы видите их в графе, Received messages, значит отправка с ESP8266 происходит корректно

Если вы заметили, отсюда можно и послать что-нибудь в ответ. Вернее отправить ещё один топик, а наш ESP8266 подпишется на него, и сделает действие при определённом значении. В следующей статье, создадим на телефоне красивые дашборд с температурой и переключателем, ну например клапана водопровода, и проверим всё в работе