Esp8266 mqtt

Просмотреть файл Библиотека CMD, реализует настройку микроконтроллера и управление вашей программой через терминал.
Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой.
Данная библиотека позволяет реализовать:
Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки «\n».
Подключение библиотеки
#include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.
cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде «test» вызывать пользовательскую функцию с именем «myFunctionName». Имя пользовательской функции может быть абсолютно любым.
void Setup() { Serial.begin(115200); command.add(«test», myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда «test». Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.
В функции loop должна находится команда вызова обработчика.
void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований:
Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* … */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры.
Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером
void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf(«%i. %s\n», i, argv); } } } Пример вызова пользовательской функции без параметров и с ними
# test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится.
Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.
if (!strcmp(argv, «wifi»)) { Serial.println(F(«Первый аргумент WiFi»)); } else { Serial.println(F(«Первый аргумент НЕ WiFi!!!»)); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy
char myVar; strcpy(myVar, argv); if (myVar == «123456») { Serial.prinln(F(«ok»)); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра
String param1(argv); // String param1 = argv; Serial.printf(«argv length: %i\n», param1.length()); Serial.printf(«argv is integer?: %s\n», param1.toInt() ? «YES» : «NO»); if (param1 == «qwerty») { Serial.println(F(«Hello QWERTY!»)); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
Автор Kitsum Добавлен 05.12.2018 Категория Библиотеки

Черновик

4-канальный реле-модуль, управляемый при помощи EasyIoT Cloud

Эта статья рассказывает, как собрать 4-канальный веб-переключатель, управляемый через WiFi при помощи сервиса EasyIoT Cloud и чипа ESP8266. Для программирования ESP8266 будет использоваться IDE Arduino.

Этот проект – упрощенная версия этого проекта по созданию 1-канального веб-переключателя на базе ESP8266. Код программы упрощен – это уже не «подключи и работай», как в этом проекте, поэтому для работы потребуется внести в код некоторые изменения. Но зато эта программа использует не одно реле, а целых четыре.

Реле-модулем можно управлять из любой точки мира – вам потребуется лишь подключение к интернету. Управление осуществляется либо через браузерный интерфейс EasyIoT Cloud, либо через родное Android-приложение.

ВНИМАНИЕ! Работая с этим проектом, вы будете иметь дело с СЕТЕВЫМ напряжением. ЭТО ОЧЕНЬ ОПАСНО!

Если у вас недостаточно опыта или квалификации для работы с СЕТЕВЫМ напряжением, настоятельно рекомендую не работать с этим проектом!

Не беритесь за этот проект, не имея ДОСТАТОЧНО ЗНАНИЙ о том, как работают цепи, использующие СЕТЕВОЕ напряжение!

Не беритесь за этот проект, если на линии с СЕТЕВЫМ напряжением не стоит правильный ПРЕДОХРАНИТЕЛЬ!

Максимальная сила тока для твердотельного реле в этом проекте – 2 ампера. Подходит только для комнатного освещения.

Введение

Необходимые компоненты

Настройка EasyIoT Cloud

Во-первых, зарегистрируйтесь в сервисе EasyIoT Cloud. Во-вторых, вручную добавьте модули типа DO (от англ. «digital output»; это можно перевести как «вывод цифровых данных»). Нажмите на Configure > Modules, и если там будут демо-модули, удалять их не нужно. Затем нажмите на кнопку «Add Module». Поменяйте тип модуля на «Digital Output DO» (MT_DIGITAL_OUTPUT), а затем сохраните модуль. Запомните ID модуля. Если это первый модуль в ваших настройках, его ID должно быть «1». Затем добавьте еще несколько модулей – в нашем случае понадобится еще 3, но это зависит от программы и количества реле.

Программа

Программа для этого проекта написана в IDE Arduino. О том, как установить в IDE Arduino аддон для ESP8266, читайте .

Дальнейшие действия зависят от того, какой модуль ESP8266 вы используете. Если ваш модуль не оснащен адаптером USB-Serial, то его нужно будет подключить. Схему подключения к адаптеру смотрите на картинке ниже. Не забудьте настроить его на 3,3 вольта. Иногда адаптеры не обеспечивают ESP8266 достаточным напряжением. В этом случае ESP8266 нужно питать только от внешнего источника питания (т.е. нужно отключить от адаптера линию Vcc). Если вы используете адаптерную плату вроде той, что выпускает команда NodeMCU, просто подключите ее к компьютеру через USB-кабель. Этот способ рекомендуется для новичков.

Саму программу можно загрузить с GitHub. Нам также понадобится библиотека для MQTT. Скачайте ее и добавьте в папку библиотек IDE Arduino.

Программа использует MQTT-брокер, встроенный в EasyIoT Cloud.

В программе поменяйте следующие строчки (они отвечают за логин и пароль к EasyIoT Cloud):

#define EIOTCLOUD_USERNAME «xxx» #define EIOTCLOUD_PASSWORD «xxx»

Также поменяйте строчки, отвечающие за SSID и пароль к ней:

#define AP_SSID «xxx» #define AP_PASSWORD «xxx»

Если вы используете не D0, D1, D2, D3, а другие цифровые контакты, их тоже нужно поменять. Кроме того, поменяйте ID модулей, чтобы они соответствовали тем, что используются в пользовательском интерфейсе.

#define MODULE_ID_1 1 #define MODULE_ID_2 2 #define MODULE_ID_3 3 #define MODULE_ID_4 4

Сам код выглядит следующим образом:

1 #include <ESP8266WiFi.h> 2 #include <MQTT.h> 3 4 #define AP_SSID «xxx» 5 #define AP_PASSWORD «xxx» 6 7 #define EIOTCLOUD_USERNAME «xxx» 8 #define EIOTCLOUD_PASSWORD «xxx» 9 10 // создаем объект MQTT: 11 #define EIOT_CLOUD_ADDRESS «cloud.iot-playground.com» 12 13 #define DO_TOPIC «/Sensor.Parameter1» 14 15 #define PIN_DO_1 D0 // 1-ый выходной цифровой контакт 16 #define MODULE_ID_1 1 17 18 19 #define PIN_DO_2 D1 // 2-ой выходной цифровой контакт 20 #define MODULE_ID_2 2 21 22 23 #define PIN_DO_3 D2 // 3-ий выходной цифровой контакт 24 #define MODULE_ID_3 3 25 26 27 #define PIN_DO_4 D3 // 4-ый выходной цифровой контакт 28 #define MODULE_ID_4 4 29 30 31 MQTT myMqtt(«», EIOT_CLOUD_ADDRESS, 1883); 32 33 34 void setup() { 35 Serial.begin(115200); 36 37 WiFi.mode(WIFI_STA); 38 WiFi.begin(AP_SSID, AP_PASSWORD); 39 40 Serial.println(); 41 Serial.println(); 42 Serial.print(«Connecting to «); // «Подключение к » 43 Serial.println(AP_SSID); 44 45 while (WiFi.status() != WL_CONNECTED) { 46 delay(500); 47 Serial.print(«.»); 48 }; 49 50 Serial.println(«WiFi connected»); // «WiFi подключен» 51 Serial.println(«Connecting to MQTT server»); 52 // «Подключение к MQTT-серверу» 53 54 // задаем ID клиента; 55 // генерируем название клиента на основе MAC-адреса 56 // и последних 8 бит счетчика микросекунд: 57 String clientName; 58 uint8_t mac; 59 WiFi.macAddress(mac); 60 clientName += macToStr(mac); 61 clientName += «-«; 62 clientName += String(micros() & 0xff, 16); 63 myMqtt.setClientId((char*) clientName.c_str()); 64 65 Serial.print(«MQTT client id:»); // «ID клиента MQTT» 66 67 Serial.println(clientName); 68 69 // настраиваем функции обратного вызова: 70 myMqtt.onConnected(myConnectedCb); 71 myMqtt.onDisconnected(myDisconnectedCb); 72 myMqtt.onPublished(myPublishedCb); 73 myMqtt.onData(myDataCb); 74 75 //////Serial.println(«connect mqtt…»); 76 // «Подключаемся к MQTT…» 77 myMqtt.setUserPwd(EIOTCLOUD_USERNAME, EIOTCLOUD_PASSWORD); 78 myMqtt.connect(); 79 80 delay(500); 81 82 pinMode(PIN_DO_1, OUTPUT); 83 pinMode(PIN_DO_2, OUTPUT); 84 pinMode(PIN_DO_3, OUTPUT); 85 pinMode(PIN_DO_4, OUTPUT); 86 87 subscribe(); 88 } 89 90 void loop() { 91 while (WiFi.status() != WL_CONNECTED) { 92 delay(500); 93 Serial.print(«.»); 94 } 95 } 96 97 98 String macToStr(const uint8_t* mac) 99 { 100 String result; 101 for (int i = 0; i < 6; ++i) { 102 result += String(mac, 16); 103 if (i < 5) 104 result += ‘:’; 105 } 106 return result; 107 } 108 109 110 void subscribe() 111 { 112 myMqtt.subscribe(«/» + String(MODULE_ID_1) + DO_TOPIC); //DO 1 113 myMqtt.subscribe(«/» + String(MODULE_ID_2) + DO_TOPIC); //DO 2 114 myMqtt.subscribe(«/» + String(MODULE_ID_3) + DO_TOPIC); //DO 3 115 myMqtt.subscribe(«/» + String(MODULE_ID_4) + DO_TOPIC); //DO 4 116 } 117 118 119 void myConnectedCb() { 120 Serial.println(«connected to MQTT server»); 121 // «Подключились к MQTT-серверу» 122 subscribe(); 123 } 124 125 void myDisconnectedCb() { 126 Serial.println(«disconnected. try to reconnect…»); 127 // «Произошло отключение. Пробуем переподключиться…» 128 delay(500); 129 myMqtt.connect(); 130 } 131 132 void myPublishedCb() { 133 Serial.println(«published.»); // «Опубликовано.» 134 } 135 136 void myDataCb(String& topic, String& data) { 137 if (topic == String(«/»+String(MODULE_ID_1)+ DO_TOPIC)) 138 { 139 if (data == String(«1»)) 140 digitalWrite(PIN_DO_1, HIGH); 141 else 142 digitalWrite(PIN_DO_1, LOW); 143 144 Serial.print(«Do 1:»); 145 Serial.println(data); 146 } 147 148 149 if (topic == String(«/»+String(MODULE_ID_2)+ DO_TOPIC)) 150 { 151 if (data == String(«1»)) 152 digitalWrite(PIN_DO_2, HIGH); 153 else 154 digitalWrite(PIN_DO_2, LOW); 155 156 Serial.print(«Do 2:»); 157 Serial.println(data); 158 } 159 160 161 if (topic == String(«/»+String(MODULE_ID_3)+ DO_TOPIC)) 162 { 163 if (data == String(«1»)) 164 digitalWrite(PIN_DO_3, HIGH); 165 else 166 digitalWrite(PIN_DO_3, LOW); 167 168 Serial.print(«Do 3:»); 169 Serial.println(data); 170 } 171 172 if (topic == String(«/»+String(MODULE_ID_4)+ DO_TOPIC)) 173 { 174 if (data == String(«1»)) 175 digitalWrite(PIN_DO_4, HIGH); 176 else 177 digitalWrite(PIN_DO_4, LOW); 178 179 Serial.print(«Do 4:»); 180 Serial.println(data); 181 } 182 183 }

Самый простой способ программирования ESP8266 – при помощи платы NodeMCU. Просто подключите ее к USB-порту, и можете приступать к программированию. Если вы будете использовать NodeMCU, не забудьте убрать знаки комментария у строчки #define DEBUG – это позволит видеть отладочные сообщения. Кнопка FLASH на плате ESP8266 будет работать как кнопка для ручного изменения состояния переключателя. Кроме того, состояние переключателя отображается при помощи светодиода.

Подключение компонентов

В нашем случае используется плата NodeMCU, оснащенная чипом ESP8266, но вы можете использовать любой модуль ESP8266, у которого выведены все контакты, необходимые для этого проекта. В нашем случае контакты D0, D1, D2 и D3 подключены к цепи, управляющей 4-мя реле. Реле работают на 5 вольтах, а ESP8266 – на 3,3 вольтах. Поэтому, чтобы подключить 3,3-вольтовый ESP8266 к 5-вольтовым реле, нам понадобится один транзистор 2N2222 (типа NPN). Схема подключения показана ниже:

Контакт GND – общий для всех, ESP8266 работает на 3,3 вольтах, реле-модуль – на 5 вольтах. На реле модуле может быть и больше реле (к примеру, два, четыре или восемь).

Если нужно, названия модулей всегда можно поменять в настройках EasyIoT Cloud.

См.также

  • AliExpress — глобальная виртуальная (в Интернете) торговая площадка, предоставляющая возможность покупать товары производителей из КНР

Оставьте комментарий