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

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


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

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

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

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

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

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

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

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

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

Введение

[Видео – https://www.youtube.com/watch?v=Dqxf_Df6nGM]

ESP8266 4 relay switch 1.jpg

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

  • Один модуль с чипом ESP8266 (ESP-07, ESP-12, адаптерная плата NodeMCU и т.д.)
  • Один 4-канальный реле-модуль
  • Один 3,3-вольтовый источник питания
  • Один резистор на 4,7 кОм
  • Один транзистор типа NPN (TO-92, 2N2222)

Настройка EasyIoT Cloud

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

EasyIoTCloud config module 2.png

Программа

Программа для этого проекта написана в 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[6];
 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[i], 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 будет работать как кнопка для ручного изменения состояния переключателя. Кроме того, состояние переключателя отображается при помощи светодиода.

[Видео – https://www.youtube.com/watch?v=bo2ICnQP68w]

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

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

ESP8266 4 relay switch.png

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

EasyIoTCloudWeb 3.png
EasyIoTCloudAndroid 4.png

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

См.также

Внешние ссылки