ESP8266:Примеры/Температурный датчик DS18B20, передающий данные на EasyIoT Cloud
Черновик |
Температурный датчик DS18B20, передающий данные на EasyIoT Cloud[1]
Эта статья рассказывает, как собрать систему, оснащенную температурным датчиком DS18B20, через WiFi подключенным к облачному сервису EasyIoT Cloud. Датчик подключается к системе автоматически – по методу «plug and play» (т.е. «подключай и работай»). Кроме того, у проекта будет функция оповещения по электронной почте – на тот случай, если температура достигнет порогового значения. Для этого проекта понадобятся модуль с чипом ESP8266, температурный датчик DS18B20 и среда разработки IDE Arduino.
Введение
[Видео – https://www.youtube.com/watch?v=KPvCs2ZeR10]
Датчик, показывающий изменения температуры:
Необходимые компоненты
- Один модуль с чипом ESP8266 (например, ESP-01, ESP-07, плата NodeMCU или др.)
- Один температурный датчик DS18B20
- Один резистор на 4,7 кОм
- Один источник 3,3-вольтового питания (батарея или регулятор напряжения)
Подключение компонентов
Схему подключения компонентов смотрите на схеме ниже. Вместо ESP-01 можно воспользоваться любым другим модулем ESP8266. Кроме того, вместо двух AA-батареек можно воспользоваться, к примеру, регулятором напряжения AMS1117-3.3.
Программа
Программа написана в среде разработки IDE Arduino. О том, как подключить ESP8266 к компьютеру, читайте в этой статье в разделе «Программа» от слов «Дальнейшие действия зависят от...» до слов «...отключить от адаптера линию Vcc)». Если у вас мало опыта, лучше воспользуйтесь платой NodeMCU, т.к. для ее подключения к компьютеру не нужно никаких настроек – просто подсоедините ее к USB-порту и все.
Саму программу можно загрузить с нашего GitHub-репозитория. Кроме того, вам нужно будет загрузить и установить в IDE Arduino библиотеки «EIoTCloudRestApiV1.0» (читайте об этом тут) и «DallasTemperature» (скачать ее можно тут).
Вам также нужно будет поменять три строчки в самой программе – для SSID, пароля к SSID и настройки «Instance ID». Чтобы узнать «Instance ID», нужно зарегистрироваться в сервисе EasyIoT Cloud, а затем кликнуть по Configure > User Info. Нужное значение будет в поле «Instance ID».
Вот так эти строчки выглядят в коде:
#define AP_USERNAME "xxxx"
#define AP_PASSWORD "xxxx"
#define INSTANCE_ID "xxxx"
Программа считывает настройки из EEPROM. Если ID модуля равен «0», это значит, что настроек для него в EasyIoT Cloud нет. В таком случае программа автоматически добавит в настройки новый модуль, даст ему название, а затем добавит параметры и настройки для этих параметров (более подробно смотрите в комментариях к коду). В результате новый модуль будет виден и в веб-интерфейсе EasyIoT Cloud, и в интерфейсе мобильного приложения.
Кроме того, ID добавленного модуля будет сохранено в EEPROM-памяти ESP8266. Таким образом, когда мы в следующий раз включим датчик, программа прочтет ID модуля из EEPROM (т.е. ей не понадобятся настройки из EasyIoT Cloud).
#include <ESP8266WiFi.h>
#include "EIoTCloudRestApiV1.0.h"
#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.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 "xxxx"
#define AP_PASSWORD "xxxx"
#define INSTANCE_ID "xxxx"
#define REPORT_INTERVAL 1
#define ONE_WIRE_BUS 2 // контакт для датчика DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
#define CONFIG_START 0
#define CONFIG_VERSION "v01"
struct StoreStruct {
// это лишь для определения того, ваши ли это настройки:
char version[4];
// переменные для ваших настроек:
char token[41];
uint moduleId;
//bool tokenOk; // правильный токен
} storage = {
CONFIG_VERSION,
// токен:
"1234567890123456789012345678901234567890",
// если ID модуля будет «0», то это неправильный модуль
0,
//0 // неправильный ID
};
String moduleId = "";
String parameterId = "";
float tempOld = 0;
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, "Room temperature");
DEBUG_PRINT("SetModulName: ");
DEBUG_PRINTLN(modname);
// задаем картинку для параметра:
String parameterImgId = eiotcloud.NewModuleParameter(moduleId, "Settings.Icon1");
DEBUG_PRINT("parameterImgId: ");
DEBUG_PRINTLN(parameterImgId);
// задаем картинку для модуля:
bool valueRet1 = eiotcloud.SetParameterValue(parameterImgId, "temperature.png");
DEBUG_PRINT("SetParameterValue: ");
DEBUG_PRINTLN(valueRet1);
// добавляем параметр для отображения температуры:
parameterId = eiotcloud.NewModuleParameter(moduleId, "Sensor.Parameter1");
DEBUG_PRINT("ParameterId: ");
DEBUG_PRINTLN(parameterId);
// задаем описание параметра:
bool valueRet2 = eiotcloud.SetParameterDescription(parameterId, "Temperature");
DEBUG_PRINT("SetParameterDescription: ");
DEBUG_PRINTLN(valueRet2);
// задаем единицу измерения (как кодировать градусы Цельсия,
// смотрите на http://meyerweb.com/eric/tools/dencoder/):
bool valueRet3 = eiotcloud.SetParameterUnit(parameterId, "%C2%B0C");
DEBUG_PRINT("SetParameterUnit: ");
DEBUG_PRINTLN(valueRet3);
// задаем параметр LogToDatabase:
bool valueRet4 = eiotcloud.SetParameterLogToDatabase(parameterId, true);
DEBUG_PRINT("SetLogToDatabase: ");
DEBUG_PRINTLN(valueRet4);
// задаем параметр SetAvreageInterval:
bool valueRet5 = eiotcloud.SetParameterAverageInterval(parameterId, "10");
DEBUG_PRINT("SetAvreageInterval: ");
DEBUG_PRINTLN(valueRet5);
// сохраняем настройки:
saveConfig();
}
// если что-то пошло не так, ждем:
if (storage.moduleId == 0)
delay(1);
// считываем из памяти ID модуля:
moduleId = String(storage.moduleId);
// считываем из памяти ID токена:
eiotcloud.SetToken(storage.token);
// считываем из облака ID параметра Sensor.Parameter1:
parameterId = eiotcloud.GetModuleParameterByName(moduleId, "Sensor.Parameter1");
DEBUG_PRINT("parameterId: ");
DEBUG_PRINTLN(parameterId);
}
void loop() {
float temp;
do {
DS18B20.requestTemperatures();
temp = DS18B20.getTempCByIndex(0);
DEBUG_PRINT("Temperature: ");
DEBUG_PRINTLN(temp);
} while (temp == 85.0 || temp == (-127.0));
if (tempOld != temp)
{
// отправляем данные о температуре:
bool valueRet = eiotcloud.SetParameterValue(parameterId, String(temp));
DEBUG_PRINT("SetParameterValue: ");
DEBUG_PRINTLN(valueRet);
tempOld = temp;
}
delay(1000 * 60 * REPORT_INTERVAL);
}
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();
}
Вот так модуль выглядит в интерфейсе EasyIoT Cloud:
Настройка EasyIoT Cloud
Для использования температурного датчика не требуется никаких настроек, т.к. он подключается к системе по принципу «plug and play» (т.е. «подключай и работай»). Кроме того, интерфейс EasyIoT Cloud поддерживает автоматические оповещения, и в нашем случае эту функцию можно использовать, к примеру, для отправки оповещения по электронной почте, если температура достигнет заданного порогового значения.
Чтобы настроить это, кликните в интерфейсе EasyIoT Cloud по Configure > Automation, а затем нажмите на кнопку «Add automation program». В результате откроется новое меню.
Выставьте переключатель «Enabled» на «On», а пункт «Program type» – на «Condition». Далее в пункте «Module» выберите только что созданный модуль для температурного датчика DS18B20, в пункте «Parameter» – параметр «Sensor.Parameter1», а в пункте «Condition» – «>= rising edge». Настройка «>= rising edge» значит, что уведомление будет отправлено только когда температура достигнет заданного значения. Далее в пункте «Condition value» выставьте «Fixed value», а в появившемся поле «Fixed value» – необходимое пороговое значение (в нашем случае это «27»). Затем в пункте «Action» выставьте значение «Send email», а в полях «Email address» и «Message» – электронный адрес и текст сообщения. Если вы хотите, чтобы в сообщении, помимо текста, было и температурное значение, воспользуйтесь конструкцией {value}. Теперь просто сохраните заданные настройки, нажав на кнопку «Save».
Итак, в нашем примере, если датчик, за который в интерфейсе отвечает модуль «9 - room temperature», отправит значение, равное «27» или выше, EasyIoT отправит на указанный электронный ящик примерно такое сообщение: