ESP8266:Примеры/Температурный датчик DHT22, передающий данные на EasyIoT Cloud

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

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


Температурный датчик DHT22, передающий данные на EasyIoT Cloud[1]

Эта статья рассказывает, как собрать систему, которую можно, ничего не настраивая, подключить к EasyIoT Cloud, и она тут же начнет передавать в веб-браузер данные о температуре и влажности. По сути, она демонстрирует, как при помощи библиотеки «EIoTCloudRestApiV1.0» отправлять запрос с двумя параметрами. Для проекта понадобятся модуль с чипом ESP8266, датчик DHT22 и среда разработки IDE Arduino.

Введение

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

График с данными об изменениях температуры и влажности. Данные можно экспортировать в CSV-файл.

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

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

Программа

Во-первых, понадобится зарегистрироваться в EasyIoT Cloud. Далее никаких настроек не потребуется, поскольку датчик DHT22 работает по принципу «plug and play» (т.е. «подключай и работай»). Нужно будет лишь запомнить значение в поле «Instance Id», которое можно посмотреть, кликнув на Config > User Info.

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

Саму программу можно скачать на GitHub. Также понадобятся две библиотеки – «DHT» и «EIoTCloudRestApiV1.0». Рекомендуем скачать библиотеку для DHT именно с нашего GitHub-репозитория, т.к. она портирована под ESP8266.

В программе нужно будет поменять строчки с SSID, паролем к SSID и Instance ID. Значение Instance ID можно узнать, кликнув в интерфейсе EasyIoT Cloud на Config > User Info.

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

Строчки с данными, которые нужно будет поменять, выглядят так:

#define AP_USERNAME "xxx"
#define AP_PASSWORD "xxx"
#define INSTANCE_ID "xxx"

Если хотите, чтобы температурные данные показывались в Фаренгейтах, воспользуйтесь функцией dht.toFarenheit().

Когда вы в первый раз подключите датчик к источнику питания, ESP8266 подключится к точке доступа и проверит ID модуля. Если ID модуля будет «0», программа вызовет несколько функций библиотеки «EIoTCloudRestApiV1.0» и с их помощью получит новый токен, добавит новый модуль и настроит его параметры. После этого токен и ID модуля будут сохранены в EEPROM. Если модуль уже добавлен в облако (т.е. его ID не будет равен «0»), то программа пропустит эту процедуру и просто прочитает параметры модуля с уже существующим ID.

Далее она прочтет данные о температуре и влажности, а затем отправит их в EasyIoT Cloud. Для публикации не одного, а нескольких параметров здесь используется функция SetParameterValues().

#include <ESP8266WiFi.h>
#include "EIoTCloudRestApiV1.0.h"
#include <EEPROM.h>
#include "DHT.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 и Instance ID; поменяйте их:
#define AP_USERNAME "xxx"
#define AP_PASSWORD "xxx"
#define INSTANCE_ID "xxx"


#define CONFIG_START 0
#define CONFIG_VERSION "v01"

#define REPORT_INTERVAL 60 // в секундах

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

float oldTemp;
float oldHum;

DHT dht;

String moduleId = "";
String parameterId1 = "";
String parameterId2 = "";


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

    EEPROM.begin(512);
    loadConfig();

    eiotcloud.begin(AP_USERNAME, AP_PASSWORD);

    // если это первый раз, когда вы получаете новый токен
    // и регистрируете новый модуль, этот фрагмент кода
    // автоматически добавит модуль в EasyIoT Cloud:
    if (storage.moduleId == 0)
    {
      // получаем новый токен; альтернативный способ – 
      // получить новый токен вручную и сохранить его в EEPROM:
      String token = eiotcloud.TokenNew(INSTANCE_ID);
      DEBUG_PRINT("Token: ");
      DEBUG_PRINTLN(token);
      eiotcloud.SetToken(token);

      // запоминаем токен:
      token.toCharArray(storage.token, 41);

      // добавляем новый модуль и настраиваем его:
      moduleId = eiotcloud.ModuleNew();
      DEBUG_PRINT("ModuleId: ");
      DEBUG_PRINTLN(moduleId);
      storage.moduleId = moduleId.toInt();

      // настраиваем тип модуля:
      bool modtyperet = eiotcloud.SetModulType(moduleId, "MT_GENERIC");
      DEBUG_PRINT("SetModulType: ");
      DEBUG_PRINTLN(modtyperet);
      
      // задаем название модуля:
      bool modname = eiotcloud.SetModulName(moduleId, "Humidity 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, "humidity.png");
      DEBUG_PRINT("SetParameterValue: ");
      DEBUG_PRINTLN(valueRet1);
      
      // теперь добавляем параметр для отображения температуры:
      parameterId1 = eiotcloud.NewModuleParameter(moduleId, "Sensor.Parameter1");
      DEBUG_PRINT("parameterId1: ");
      DEBUG_PRINTLN(parameterId1);

      // вводим описание параметра:
      bool valueRet2 = eiotcloud.SetParameterDescription(parameterId1, "Temperature");
      DEBUG_PRINT("SetParameterDescription: ");
      DEBUG_PRINTLN(valueRet2);
      
      // задаем единицу измерения (о том, как кодировать 
      // градусы Цельсия, смотрите по ссылке
      // http://meyerweb.com/eric/tools/dencoder/): 
      bool valueRet3 = eiotcloud.SetParameterUnit(parameterId1, "%C2%B0C");
      DEBUG_PRINT("SetParameterUnit: ");
      DEBUG_PRINTLN(valueRet3);

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

      // задаем параметр SetAvreageInterval:
      bool valueRet5 = eiotcloud.SetParameterAverageInterval(parameterId1, "10");
      DEBUG_PRINT("SetAvreageInterval: ");
      DEBUG_PRINTLN(valueRet5);

      // теперь добавляем параметр для отображения влажности:
      parameterId2 = eiotcloud.NewModuleParameter(moduleId, "Sensor.Parameter2");
      DEBUG_PRINT("parameterId2: ");
      DEBUG_PRINTLN(parameterId2);

      // вводим описание параметра:
      bool valueRet6 = eiotcloud.SetParameterDescription(parameterId2, "Humidity");
      DEBUG_PRINT("SetParameterDescription: ");
      DEBUG_PRINTLN(valueRet2);
      
      // задаем единицу измерения:
      bool valueRet7 = eiotcloud.SetParameterUnit(parameterId2, "%");
      DEBUG_PRINT("SetParameterUnit: ");
      DEBUG_PRINTLN(valueRet7);

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

      // задаем параметр SetAvreageInterval:
      bool valueRet9 = eiotcloud.SetParameterAverageInterval(parameterId2, "10");
      DEBUG_PRINT("SetAvreageInterval: ");
      DEBUG_PRINTLN(valueRet9);

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

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

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

    parameterId2 = eiotcloud.GetModuleParameterByName(moduleId, "Sensor.Parameter2");
    DEBUG_PRINT("parameterId2: ");
    DEBUG_PRINTLN(parameterId2);


    Serial.println();
    Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");

    dht.setup(2); // делаем контактом для данных 2-ой контакт
  
    oldTemp = -1;
    oldHum = -1;
}


void loop() {
  delay(dht.getMinimumSamplingPeriod());
  
  float hum = dht.getHumidity();
  float temp = dht.getTemperature();

  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(hum, 1);
  Serial.print("\t\t");
  Serial.print(temp, 1);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temp), 1);

  if (temp != oldTemp || hum != oldHum)
  {
    //sendTeperature(temp);
    eiotcloud.SetParameterValues("[{\"Id\": \""+parameterId1+"\", \"Value\": \""+String(temp)+"\" },{\"Id\": \""+parameterId2+"\", \"Value\": \""+String(hum)+"\" }]");
    oldTemp = temp;
    oldHum = hum;
  }

  int cnt = REPORT_INTERVAL;
  
  while(cnt--)
    delay(1000);
  
}


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();
}

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

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



См.также

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