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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 1848 статей для сайта.

Контакты:

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


Ambox content.png Черновик


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

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

Введение

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

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

ESP8266 WiFi DHT22 humidity sensor (EasyIoT Cloud REST API V1) 1.png

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

  • Один модуль с 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.

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

ESP8266 WiFi DHT22 humidity sensor (EasyIoT Cloud REST API V1) 2.png

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

  1. #define AP_USERNAME "xxx"
  2. #define AP_PASSWORD "xxx"
  3. #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-вольтовый регулятор напряжения.

ESP8266 WiFi DHT22 humidity sensor (EasyIoT Cloud REST API V1) 3.png


ESP8266 WiFi DHT22 humidity sensor (EasyIoT Cloud REST API V1) 4.jpg


ESP8266 WiFi DHT22 humidity sensor (EasyIoT Cloud REST API V1) 5.png

См.также

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

  1. iot-playground.com - ESP8266 WiFi DHT22 humidity sensor (EasyIoT Cloud REST API V1)