ESP8266:Примеры/Датчик открывания двери, передающий данные на EasyIoT Cloud

Материал из Онлайн справочника
Версия от 12:38, 18 июня 2023; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

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


Датчик открывания двери, передающий данные на EasyIoT Cloud[1]

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

Введение

Видео, показывающее проект в действии:

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

Браузерное меню с модулями EasyIoT Cloud:

График, показывающий, когда происходило открытие/закрытие двери:

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

  • Один модуль с ESP8266 (например, плата NodeMCU, ESP-01, ESP-02 или пр.)
  • Один электромагнитный переключатель
  • Один 3,3-вольтовый источник питания (регулятор напряжения или батерея)

Настройка EasyIoT Cloud

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

Никаких настроек в EasyIoT Cloud не требуется – модуль работает по принципу «plug and play» (т.е. «подключи и работай»). Вам нужно будет лишь запомнить токен безопасности для подключения к EasyIoT Cloud. Для этого пройдите в меню Configure > Tokens и нажмите на кнопку «Add Token». Запомните этот токен – он пригодится позже (его нужно будет вписать в программу). Если удалить токен из аккаунта, модуль перестанет отправлять данные на EasyIoT Cloud. Один токен можно использовать для нескольких устройств.

Программа

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

Саму программу можно скачать с нашего GitHub-репозитория. Вам также понадобится библиотека «EIoTCloudRestApiV1.0». О том, как установить ее в IDE Arduino, читайте тут.

В самой программе нужно будет поменять строчки с SSID, паролем к SSID и токеном безопасности.

#define AP_USERNAME "xxx"
#define AP_PASSWORD "xxx"
#define TOKEN "xxx"

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

/*
 Программа написана Игорем Ярком (Igor Jarc).
 Более подробно смотрите по ссылке http://iot-playground.com.
 Пожалуйста не пишите автору напрямую. 
 Используйте для этого форум сообщества на сайте.

 Эта программа бесплатна. Вы можете повторно распространять 
 и/или модифицировать ее согласно правилам лицензии
 GNU General Public License (2-ая версия), 
 опубликованной Фондом свободного ПО.
*/

#include <ESP8266WiFi.h>
#include "EIoTCloudRestApiV1.0.h"
#include <EEPROM.h>

#define DEBUG_PROG 

#ifdef DEBUG_PROG
  #define DEBUG_PRINTLN(x)  Serial.println(x)
  #define DEBUG_PRINT(x)    Serial.print(x)
#else
  #define DEBUG_PRINTLN(x) 
  #define DEBUG_PRINT(x)
#endif

EIoTCloudRestApi eiotcloud;

// это строчки с SSID, паролем к SSID и токеном безопасности;
// поменяйте их:
#define AP_USERNAME "xxx"
#define AP_PASSWORD "xxx"

#define TOKEN "xxx"

#define CONFIG_START 0
#define CONFIG_VERSION "v01"


#define INPUT_PIN        D5

struct StoreStruct {
  // это лишь для того, чтобы определить, ваши ли это настройки:
  char version[4];
  // переменные для ваших настроек:
  uint moduleId;
} storage = {
  CONFIG_VERSION,
  // модуль с ID «0» – неправильный модуль
  0,
};

String moduleId = "";
String parameterId = "";
bool oldInputState;

void setup() {
    Serial.begin(9600);
    DEBUG_PRINTLN("Start...");  //  "Запуск..."

    EEPROM.begin(512);
    loadConfig();

    eiotcloud.begin(AP_USERNAME, AP_PASSWORD);
    eiotcloud.SetToken(TOKEN);

    // если это первый раз, когда вы получаете новый токен
    // и регистрируете новый модуль, этот фрагмент кода 
    // автоматически добавит модуль в Cloud:
    if (storage.moduleId == 0)
    {      
      // добавляем новый модуль и настраиваем его:
      moduleId = eiotcloud.ModuleNew();
      DEBUG_PRINT("ModuleId: ");
      DEBUG_PRINTLN(moduleId);
      storage.moduleId = moduleId.toInt();
      
      // если ID модуля – неправильный, останавливаемся:
      if (storage.moduleId == 0)
      {
        DEBUG_PRINTLN("Check Account limits -> module limit.");
                  //  "Проверьте Account limits -> module limit."
        while(true) delay(1);
      }
      // задаем тип модуля:
      bool modtyperet = eiotcloud.SetModulType(moduleId, "MT_DIGITAL_INPUT");
      DEBUG_PRINT("SetModulType: ");
      DEBUG_PRINTLN(modtyperet);
      
      // задаем название модуля:
      bool modname = eiotcloud.SetModulName(moduleId, "Door/window sensor");
      DEBUG_PRINT("SetModulName: ");
      DEBUG_PRINTLN(modname);

      // добавляем картинку для параметра:
      String parameterImgId = eiotcloud.NewModuleParameter(moduleId, "Settings.Icon1");
      DEBUG_PRINT("parameterImgId: ");
      DEBUG_PRINTLN(parameterImgId);

      // добавляем картинку для модуля:
      bool valueRet1 = eiotcloud.SetParameterValue(parameterImgId, "door_1.png");
      DEBUG_PRINT("SetParameterValue: ");
      DEBUG_PRINTLN(valueRet1);


      // добавляем картинку для параметра:
      String parameterImgId2 = eiotcloud.NewModuleParameter(moduleId, "Settings.Icon2");
      DEBUG_PRINT("parameterImgId2: ");
      DEBUG_PRINTLN(parameterImgId2);

      // добавляем картинку для модуля:
      bool valueRet3 = eiotcloud.SetParameterValue(parameterImgId2, "door_2.png");
      DEBUG_PRINT("SetParameterValue: ");
      DEBUG_PRINTLN(valueRet3);

      
      // теперь добавляем значение параметру:
      parameterId = eiotcloud.NewModuleParameter(moduleId, "Sensor.Parameter1");
      DEBUG_PRINT("ParameterId: ");
      DEBUG_PRINTLN(parameterId);

      // задаем параметр LogToDatabase:
      bool valueRet4 = eiotcloud.SetParameterLogToDatabase(parameterId, true);
      DEBUG_PRINT("SetLogToDatabase: ");
      DEBUG_PRINTLN(valueRet4);

      // задаем параметр ChartSteps:
      valueRet4 = eiotcloud.SetParameterChartSteps(parameterId, true);
      DEBUG_PRINT("SetLogToDatabase: ");
      DEBUG_PRINTLN(valueRet4);


      // добавляем параметр StatusText1:
      String parameterStatTxt1 = eiotcloud.NewModuleParameter(moduleId, "Settings.StatusText1");
      DEBUG_PRINT("parameterStatTxt1: ");
      DEBUG_PRINTLN(parameterStatTxt1);

      // добавляем текст для параметра StatusText1:
      bool valueRet5 = eiotcloud.SetParameterValue(parameterStatTxt1, "Open");
      DEBUG_PRINT("SetParameterValue: ");
      DEBUG_PRINTLN(valueRet5);

      // добавляем параметр StatusText2:
      String parameterStatTxt2 = eiotcloud.NewModuleParameter(moduleId, "Settings.StatusText2");
      DEBUG_PRINT("parameterStatTxt2: ");
      DEBUG_PRINTLN(parameterStatTxt2);

      // добавляем текст для параметра StatusText2:
      bool valueRet6 = eiotcloud.SetParameterValue(parameterStatTxt2, "Close");
      DEBUG_PRINT("SetParameterValue: ");
      DEBUG_PRINTLN(valueRet6);

      // сохраняем настройки:
      saveConfig();
    }

    // если что-то пошло не так, ждем:
    if (storage.moduleId == 0)
      while(true) delay(1);

    // считываем из памяти ID модуля:
    moduleId = String(storage.moduleId);
    // считываем из облака ID параметра Sensor.Parameter1:
    parameterId = eiotcloud.GetModuleParameterByName(moduleId, "Sensor.Parameter1");
    DEBUG_PRINT("parameterId: ");
    DEBUG_PRINTLN(parameterId);

    pinMode(INPUT_PIN, INPUT_PULLUP);
    
    oldInputState = !digitalRead(INPUT_PIN);
}

void loop() {
  int inputState = digitalRead(INPUT_PIN);;  
  
  if (inputState != oldInputState)
  {
    bool valueRet = eiotcloud.SetParameterValue(parameterId, String(inputState));
    DEBUG_PRINT("SetParameterValue: ");
    DEBUG_PRINTLN(valueRet);
    oldInputState = inputState;
  }
}

void loadConfig() {
  // это чтобы убедиться, что настройки есть, и это ваши настройки;
  // если программа не найдет настройки, то воспользуется
  // настройками по умолчанию:
  if (EEPROM.read(CONFIG_START + 0) == CONFIG_VERSION[0] &&
      EEPROM.read(CONFIG_START + 1) == CONFIG_VERSION[1] &&
      EEPROM.read(CONFIG_START + 2) == CONFIG_VERSION[2])
    for (unsigned int t=0; t<sizeof(storage); t++)
      *((char*)&storage + t) = EEPROM.read(CONFIG_START + t);
}


void saveConfig() {
  for (unsigned int t=0; t<sizeof(storage); t++)
    EEPROM.write(CONFIG_START + t, *((char*)&storage + t));

  EEPROM.commit();
}

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

В нашем случае используется плата NodeMCU, но вы можете воспользоваться любым другим модулем ESP8266. Правда, в этом случае вам дополнительно понадобится программатор FTDI. Для питания можно воспользоваться двумя батарейками типа AA или 3,3-вольтовым регулятором.

Кроме того, один провод, идущий от электромагнитного переключателя, нужно подключить к 5-ому GPIO-контакту, а другой – к GND.

См.также

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