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

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

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


Cat poo.png Черновик


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

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

Введение

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

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

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

ESP8266 WiFi doorwindow sensor (EasyIoT Cloud REST API V1.0) 1.png

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

ESP8266 WiFi doorwindow sensor (EasyIoT Cloud REST API V1.0) 2.png

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

  • Один модуль с 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. Один токен можно использовать для нескольких устройств.

ESP8266 WiFi doorwindow sensor (EasyIoT Cloud REST API V1.0) 3.png

Программа

Программа написана в 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.

ESP8266 WiFi doorwindow sensor (EasyIoT Cloud REST API V1.0) 4.jpg

См.также

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