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-вольтовый регулятор напряжения.