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

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

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


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 (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, но это зависит от программы и количества реле.

Программа

Программа для этого проекта написана в 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

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

#include <ESP8266WiFi.h>
#include <MQTT.h>

#define AP_SSID     "xxx"
#define AP_PASSWORD "xxx"  

#define EIOTCLOUD_USERNAME "xxx"
#define EIOTCLOUD_PASSWORD "xxx"

// создаем объект MQTT:
#define EIOT_CLOUD_ADDRESS "cloud.iot-playground.com"

#define DO_TOPIC        "/Sensor.Parameter1"

#define PIN_DO_1         D0  // 1-ый выходной цифровой контакт 
#define MODULE_ID_1     1


#define PIN_DO_2         D1  // 2-ой выходной цифровой контакт
#define MODULE_ID_2     2


#define PIN_DO_3         D2  // 3-ий выходной цифровой контакт
#define MODULE_ID_3     3


#define PIN_DO_4         D3  // 4-ый выходной цифровой контакт
#define MODULE_ID_4     4


MQTT myMqtt("", EIOT_CLOUD_ADDRESS, 1883);


void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);  
  WiFi.begin(AP_SSID, AP_PASSWORD);
 
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");  //  "Подключение к "
  Serial.println(AP_SSID);
    
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  };

  Serial.println("WiFi connected");  //  "WiFi подключен"
  Serial.println("Connecting to MQTT server");  
             //  "Подключение к MQTT-серверу"

  // задаем ID клиента;
  // генерируем название клиента на основе MAC-адреса
  // и последних 8 бит счетчика микросекунд:
  String clientName;
  uint8_t mac[6];
  WiFi.macAddress(mac);
  clientName += macToStr(mac);
  clientName += "-";
  clientName += String(micros() & 0xff, 16);
  myMqtt.setClientId((char*) clientName.c_str());

  Serial.print("MQTT client id:");  //  "ID клиента MQTT"

  Serial.println(clientName);

  // настраиваем функции обратного вызова:
  myMqtt.onConnected(myConnectedCb);
  myMqtt.onDisconnected(myDisconnectedCb);
  myMqtt.onPublished(myPublishedCb);
  myMqtt.onData(myDataCb);
  
  //////Serial.println("connect mqtt...");
                   //  "Подключаемся к MQTT..."
  myMqtt.setUserPwd(EIOTCLOUD_USERNAME, EIOTCLOUD_PASSWORD);  
  myMqtt.connect();

  delay(500);

  pinMode(PIN_DO_1, OUTPUT); 
  pinMode(PIN_DO_2, OUTPUT); 
  pinMode(PIN_DO_3, OUTPUT); 
  pinMode(PIN_DO_4, OUTPUT); 

  subscribe();
}

void loop() {
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}


String macToStr(const uint8_t* mac)
{
  String result;
  for (int i = 0; i < 6; ++i) {
    result += String(mac[i], 16);
    if (i < 5)
      result += ':';
  }
  return result;
}


void subscribe()
{
    myMqtt.subscribe("/" + String(MODULE_ID_1) + DO_TOPIC); //DO 1
    myMqtt.subscribe("/" + String(MODULE_ID_2) + DO_TOPIC); //DO 2
    myMqtt.subscribe("/" + String(MODULE_ID_3) + DO_TOPIC); //DO 3
    myMqtt.subscribe("/" + String(MODULE_ID_4) + DO_TOPIC); //DO 4
}


void myConnectedCb() {
  Serial.println("connected to MQTT server");
             //  "Подключились к MQTT-серверу"
  subscribe();
}

void myDisconnectedCb() {
  Serial.println("disconnected. try to reconnect...");
             //  "Произошло отключение. Пробуем переподключиться..."
  delay(500);
  myMqtt.connect();
}

void myPublishedCb() {
  Serial.println("published.");  //  "Опубликовано."
}

void myDataCb(String& topic, String& data) {  
  if (topic == String("/"+String(MODULE_ID_1)+ DO_TOPIC))
  {
    if (data == String("1"))
      digitalWrite(PIN_DO_1, HIGH);     
    else
      digitalWrite(PIN_DO_1, LOW);

    Serial.print("Do 1:");
    Serial.println(data);
  }


  if (topic == String("/"+String(MODULE_ID_2)+ DO_TOPIC))
  {
    if (data == String("1"))
      digitalWrite(PIN_DO_2, HIGH);     
    else
      digitalWrite(PIN_DO_2, LOW);

    Serial.print("Do 2:");
    Serial.println(data);
  }


  if (topic == String("/"+String(MODULE_ID_3)+ DO_TOPIC))
  {
    if (data == String("1"))
      digitalWrite(PIN_DO_3, HIGH);     
    else
      digitalWrite(PIN_DO_3, LOW);

    Serial.print("Do 3:");
    Serial.println(data);
  }

  if (topic == String("/"+String(MODULE_ID_4)+ DO_TOPIC))
  {
    if (data == String("1"))
      digitalWrite(PIN_DO_4, HIGH);     
    else
      digitalWrite(PIN_DO_4, LOW);

    Serial.print("Do 4:");
    Serial.println(data);
  }
  
}

Самый простой способ программирования 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). Схема подключения показана ниже:

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

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

См.также

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