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

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

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

Контакты:

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


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


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

Эта статья рассказывает, как собрать систему, оснащенную температурным датчиком DS18B20, через WiFi подключенным к облачному сервису EasyIoT Cloud. Датчик подключается к системе автоматически – по методу «plug and play» (т.е. «подключай и работай»). Кроме того, у проекта будет функция оповещения по электронной почте – на тот случай, если температура достигнет порогового значения. Для этого проекта понадобятся модуль с чипом ESP8266, температурный датчик DS18B20 и среда разработки IDE Arduino.

Введение

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

Датчик, показывающий изменения температуры:

ESP8266 WiFi DS18B20 temperature sensor (EasyIoT Cloud REST API V1) and Email alarm 1.png

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

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

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

Схему подключения компонентов смотрите на схеме ниже. Вместо ESP-01 можно воспользоваться любым другим модулем ESP8266. Кроме того, вместо двух AA-батареек можно воспользоваться, к примеру, регулятором напряжения AMS1117-3.3.

ESP8266 WiFi DS18B20 temperature sensor (EasyIoT Cloud REST API V1) and Email alarm 2.png
ESP8266 WiFi DS18B20 temperature sensor (EasyIoT Cloud REST API V1) and Email alarm 3.jpg

Программа

Программа написана в среде разработки 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».

ESP8266 WiFi DS18B20 temperature sensor (EasyIoT Cloud REST API V1) and Email alarm 4.png

Вот так эти строчки выглядят в коде:

#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).

  1. #include <ESP8266WiFi.h>
  2. #include "EIoTCloudRestApiV1.0.h"
  3. #include <EEPROM.h>
  4. #include <OneWire.h>
  5. #include <DallasTemperature.h>
  6.  
  7. #define DEBUG_PROG
  8.  
  9. #ifdef DEBUG_PROG
  10.   #define DEBUG_PRINTLN(x)  Serial.println(x)
  11.   #define DEBUG_PRINT(x)    Serial.print(x)
  12. #else
  13.   #define DEBUG_PRINTLN(x)
  14.   #define DEBUG_PRINT(x)
  15. #endif
  16.  
  17.  
  18. EIoTCloudRestApi eiotcloud;
  19.  
  20. // это строчки для SSID, пароля к SSID и «Instance ID»; поменяйте их:
  21. #define AP_USERNAME "xxxx"
  22. #define AP_PASSWORD "xxxx"
  23. #define INSTANCE_ID "xxxx"
  24.  
  25.  
  26.  
  27. #define REPORT_INTERVAL 1
  28.  
  29. #define ONE_WIRE_BUS 2  // контакт для датчика DS18B20
  30. OneWire oneWire(ONE_WIRE_BUS);
  31. DallasTemperature DS18B20(&oneWire);
  32.  
  33. #define CONFIG_START 0
  34. #define CONFIG_VERSION "v01"
  35.  
  36. struct StoreStruct {
  37.   // это лишь для определения того, ваши ли это настройки:
  38.   char version[4];
  39.   // переменные для ваших настроек:
  40.   char token[41];
  41.   uint moduleId;
  42.   //bool tokenOk; // правильный токен  
  43. } storage = {
  44.   CONFIG_VERSION,
  45.   // токен:
  46.   "1234567890123456789012345678901234567890",
  47.   // если ID модуля будет «0», то это неправильный модуль
  48.   0,
  49.   //0 // неправильный ID
  50. };
  51.  
  52. String moduleId = "";
  53. String parameterId = "";
  54. float tempOld = 0;
  55.  
  56. void setup() {
  57.     Serial.begin(115200);
  58.     DEBUG_PRINTLN("Start...");   //  "Запуск..."
  59.  
  60.     EEPROM.begin(512);
  61.     loadConfig();
  62.  
  63.     eiotcloud.begin(AP_USERNAME, AP_PASSWORD);
  64.  
  65.     // если это первый раз, когда вы получаете новый токен
  66.     // и регистрируете новый модуль, этот фрагмент кода
  67.     // автоматически добавляет новый модуль в EasyIoT Cloud:
  68.     if (storage.moduleId == 0)
  69.     {
  70.       // получаем новый токен; альтернативный способ –
  71.       // создать токен вручную, а затем сохранить его в EEPROM:
  72.       String token = eiotcloud.TokenNew(INSTANCE_ID);
  73.       DEBUG_PRINT("Token: ");
  74.       DEBUG_PRINTLN(token);
  75.       eiotcloud.SetToken(token);
  76.  
  77.       // запоминаем токен:
  78.       token.toCharArray(storage.token, 41);
  79.  
  80.       // добавляем новый модуль и настраиваем его:
  81.       moduleId = eiotcloud.ModuleNew();
  82.       DEBUG_PRINT("ModuleId: ");
  83.       DEBUG_PRINTLN(moduleId);
  84.       storage.moduleId = moduleId.toInt();
  85.  
  86.       // задаем тип модуля:
  87.       bool modtyperet = eiotcloud.SetModulType(moduleId, "MT_GENERIC");
  88.       DEBUG_PRINT("SetModulType: ");
  89.       DEBUG_PRINTLN(modtyperet);
  90.      
  91.       // задаем название для модуля:
  92.       bool modname = eiotcloud.SetModulName(moduleId, "Room temperature");
  93.       DEBUG_PRINT("SetModulName: ");
  94.       DEBUG_PRINTLN(modname);
  95.  
  96.       // задаем картинку для параметра:
  97.       String parameterImgId = eiotcloud.NewModuleParameter(moduleId, "Settings.Icon1");
  98.       DEBUG_PRINT("parameterImgId: ");
  99.       DEBUG_PRINTLN(parameterImgId);
  100.  
  101.       // задаем картинку для модуля:
  102.       bool valueRet1 = eiotcloud.SetParameterValue(parameterImgId, "temperature.png");
  103.       DEBUG_PRINT("SetParameterValue: ");
  104.       DEBUG_PRINTLN(valueRet1);
  105.      
  106.       // добавляем параметр для отображения температуры:
  107.       parameterId = eiotcloud.NewModuleParameter(moduleId, "Sensor.Parameter1");
  108.       DEBUG_PRINT("ParameterId: ");
  109.       DEBUG_PRINTLN(parameterId);
  110.  
  111.       // задаем описание параметра:
  112.       bool valueRet2 = eiotcloud.SetParameterDescription(parameterId, "Temperature");
  113.       DEBUG_PRINT("SetParameterDescription: ");
  114.       DEBUG_PRINTLN(valueRet2);
  115.      
  116.       // задаем единицу измерения (как кодировать градусы Цельсия,
  117.       // смотрите на http://meyerweb.com/eric/tools/dencoder/):
  118.       bool valueRet3 = eiotcloud.SetParameterUnit(parameterId, "%C2%B0C");
  119.       DEBUG_PRINT("SetParameterUnit: ");
  120.       DEBUG_PRINTLN(valueRet3);
  121.  
  122.       // задаем параметр LogToDatabase:
  123.       bool valueRet4 = eiotcloud.SetParameterLogToDatabase(parameterId, true);
  124.       DEBUG_PRINT("SetLogToDatabase: ");
  125.       DEBUG_PRINTLN(valueRet4);
  126.  
  127.       // задаем параметр SetAvreageInterval:
  128.       bool valueRet5 = eiotcloud.SetParameterAverageInterval(parameterId, "10");
  129.       DEBUG_PRINT("SetAvreageInterval: ");
  130.       DEBUG_PRINTLN(valueRet5);
  131.  
  132.       // сохраняем настройки:
  133.       saveConfig();
  134.     }
  135.  
  136.     // если что-то пошло не так, ждем:
  137.     if (storage.moduleId == 0)
  138.       delay(1);
  139.  
  140.     // считываем из памяти ID модуля:
  141.     moduleId = String(storage.moduleId);
  142.     // считываем из памяти ID токена:
  143.     eiotcloud.SetToken(storage.token);    
  144.     // считываем из облака ID параметра Sensor.Parameter1:
  145.     parameterId = eiotcloud.GetModuleParameterByName(moduleId, "Sensor.Parameter1");
  146.     DEBUG_PRINT("parameterId: ");
  147.     DEBUG_PRINTLN(parameterId);
  148. }
  149.  
  150.  
  151. void loop() {
  152.   float temp;
  153.  
  154.   do {
  155.     DS18B20.requestTemperatures();
  156.     temp = DS18B20.getTempCByIndex(0);
  157.     DEBUG_PRINT("Temperature: ");
  158.     DEBUG_PRINTLN(temp);
  159.   } while (temp == 85.0 || temp == (-127.0));
  160.  
  161.  
  162.  
  163.   if (tempOld != temp)
  164.   {
  165.     // отправляем данные о температуре:
  166.     bool valueRet = eiotcloud.SetParameterValue(parameterId, String(temp));
  167.     DEBUG_PRINT("SetParameterValue: ");
  168.     DEBUG_PRINTLN(valueRet);
  169.     tempOld = temp;
  170.   }
  171.   delay(1000 * 60 * REPORT_INTERVAL);
  172. }
  173.  
  174. void loadConfig() {
  175.   // это чтобы убедиться, что настройки есть, и это ваши настройки;
  176.   // если программа не найдет настройки, то воспользуется
  177.   // настройками по умолчанию:
  178.   if (EEPROM.read(CONFIG_START + 0) == CONFIG_VERSION[0] &&
  179.       EEPROM.read(CONFIG_START + 1) == CONFIG_VERSION[1] &&
  180.       EEPROM.read(CONFIG_START + 2) == CONFIG_VERSION[2])
  181.     for (unsigned int t=0; t<sizeof(storage); t++)
  182.       *((char*)&storage + t) = EEPROM.read(CONFIG_START + t);
  183. }
  184.  
  185. void saveConfig() {
  186.   for (unsigned int t=0; t<sizeof(storage); t++)
  187.     EEPROM.write(CONFIG_START + t, *((char*)&storage + t));
  188.  
  189.   EEPROM.commit();
  190. }

Вот так модуль выглядит в интерфейсе EasyIoT Cloud:

ESP8266 WiFi DS18B20 temperature sensor (EasyIoT Cloud REST API V1) and Email alarm 5.png

Настройка 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».

ESP8266 WiFi DS18B20 temperature sensor (EasyIoT Cloud REST API V1) and Email alarm 6.png

Итак, в нашем примере, если датчик, за который в интерфейсе отвечает модуль «9 - room temperature», отправит значение, равное «27» или выше, EasyIoT отправит на указанный электронный ящик примерно такое сообщение:

ESP8266 WiFi DS18B20 temperature sensor (EasyIoT Cloud REST API V1) and Email alarm 7.png

См.также

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

  1. iot-playground.com - ESP8266 WiFi DS18B20 temperature sensor (EasyIoT Cloud REST API V1) and Email alarm