ESP8266:Примеры/Температурный датчик DS18B20, передающий данные на EasyIoT Cloud
Поддержать проект | Содержание | Введение | Модули | AT-команды | Прошивки | Примеры | Проекты | Типовые проблемы | Библиотеки |
![]() |
Черновик |
Содержание
Температурный датчик 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).
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:
Настройка 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 отправит на указанный электронный ящик примерно такое сообщение:
См.также
Внешние ссылки