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

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Температурный датчик 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

См.также

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