У нас есть скетч, отправляющий показания датчиков на сайт. Есть сайт на MaxSite CMS с плагином, умеющим собирать состояния датчиков и отображать на графике.
Мы можем визуально сравнить: как отличаются показания влажности и температуры двух разных датчиков DHT11, размещенных в одном месте.
В конструкцию из плат, которую детально рассматривали в статье Мониторинг по интернет загазованности помещения с Arduino UNO R3 и ESP8266 ESP-12E, добавим еще один датчик DHT11.
Благодаря реализации в плагине My_ESP8266 для MaxSiteCMS возможности выводить на одной странице графики всех значений датчиков одного устройства, мы можем наблюдать такую картину.
График, генерируемый при помощи библиотеки chartjs.org позволяет фильтровать отображаемую информацию, отключая не нужные отображения.
Сравним значения температуры.
Все это время температура в помещении не превышала 22 градуса. Датчик, который значительно завышает значения, находится на плате и, возможно, получает тепло от нагретых плат.
Так и оказалось. Когда пирог из плат поставил на ребро, показания выровнялись и стали превышать реальные ровно на 2 градуса.
Сравним теперь показания датчиков влажности.
Мы видим примерно одинаковую дельту, что означает возможность юстировки. Вероятно, что реальные значения влажности в помещении находятся между этими графиками.
В конце графика видно, что когда мы перевернули платы на ребро, показания тоже стали ближе друг к другу.
Бытовые устройства измерения влажности, которые у меня имеются, тоже не вызывают доверия, хотя показывают одно и тоже.
Пики на графике означают время работы увлажнителя воздуха Ballu UHB-205.
Показания загазованности для нас неинтересны.
В случае с датчиками загазованности следует рассматривать пороговое значение: газ есть / газа нет и отсылать письмо при наличии газа. Но этого функционала плагин не имеет. Пока.
Диапазон измерений датчика MQ-5:
Пропан: 200–10000 ppm;
Изобутан: 200–10000 ppm;
Природный газ: 200–10000 ppm.
Из чего следует что значение загазованности ниже измеряемого диапазона.
Скетч отправки показаний двух датчиков DHT11 на сервер.
#include "WiFiEsp.h" // Библиотека для работы с платой #include <dht11.h> // Добавляем библиотеку DHT11 dht11 DHT; // Объявление переменной класса dht11 #define DHT11_PIN 4 // Датчик DHT11 подключен к цифровому пину номер 4 #define DHT112_PIN 7 // Датчик DHT11 подключен к цифровому пину номер 7 const int analogSignal = A3; //подключение аналогового сигналоьного пина const int digitalSignal = 8; //подключение цифрового сигнального пина boolean noGas; //переменная для хранения значения о присутствии газа int gas = 0; //переменная для хранения количества газа float hum = 0; //переменная для хранения влажности float temp = 0; //переменная для хранения температуры float hum1 = 0; //переменная для хранения влажности float temp1 = 0; //переменная для хранения температуры char mac[18] = { 0 }; int chk; //переменная для хранения ошибки DHT const char ssid[] = "Keenetic-0138"; // your network SSID (name) const char pass[] = "********"; // your network password int status = WL_IDLE_STATUS; // the Wifi radio's status String jsonString; // данные String PostHeader; // данные const char server[] = "esp8266.my-site.ru"; unsigned long lastConnectionTime = 0; unsigned long lastInfoTime = 0; const unsigned long postingInterval = 1200000; // 20 минут const unsigned long infoInterval = 60000; // 1 минута // Инициализация объекта wi-fi клиент WiFiEspClient client; void setup() { pinMode(10, OUTPUT); pinMode(11, OUTPUT); Serial.begin(9600); WiFi.init(&Serial); if (WiFi.status() == WL_NO_SHIELD) { while (true); } while ( status != WL_CONNECTED) { status = WiFi.begin(ssid, pass); } uint8_t macH[6]; WiFi.macAddress(macH); sprintf(mac, "XXXXXX", macH[0], macH[1], macH[2], macH[3], macH[4], macH[5]); //httpRequest(); } void loop() { if (lastConnectionTime == 0 ) { httpRequest(); } if (millis() - lastConnectionTime > postingInterval) { httpRequest(); } if (millis() - lastInfoTime > infoInterval) { digitalWrite(10, HIGH); // включает светодиод delay(3000); // ждет 3 секунды digitalWrite(10, LOW); // выключает светодиод lastInfoTime = millis(); } } void httpRequest() { noGas = digitalRead(digitalSignal); //считываем значение о присутствии газа gas = analogRead(analogSignal); // и о его количестве chk = DHT.read(DHT11_PIN); hum = DHT.humidity; temp = DHT.temperature; chk = DHT.read(DHT112_PIN); hum1 = DHT.humidity; temp1 = DHT.temperature; if (client.connect(server, 80)) { digitalWrite(11, HIGH); jsonString = "secret=0000&name=ESP_8266WiFi&temp=" + String(temp) + "&hum=" + String(hum) + "&temp1=" + String(temp1) + "&hum1=" + String(hum1) + "&gas=" + String(gas) + "&mac=" + String(mac)+ "&ram=" + String(freeRam()) + "&rssi=" + String(WiFi.RSSI()); PostHeader = "POST /ajax/cGx1Z2lucy9te****************heC5waHA= HTTP/1.1\r\n"; PostHeader += "Host: esp8266.my-site.ru:80\r\n"; PostHeader += "User-Agent: ESP8266WiFi\r\n"; PostHeader += "Accept: application/xml\r\n"; PostHeader += "Content-Type: application/x-www-form-urlencoded\r\n"; PostHeader += "X-Requested-With: XMLHttpRequest\r\n"; PostHeader += "Referer: http://esp8266.my-site.ru\r\n"; PostHeader += "Connection: close\r\n"; PostHeader += "Content-Length: " + String(jsonString.length()) + "\r\n"; jsonString += "\r\n\r\n\r\n"; client.println(PostHeader); client.println(jsonString); } while (client.available()) { char c = client.read(); } if (!client.connected()) { client.stop(); digitalWrite(11, LOW); } lastConnectionTime = millis(); } int freeRam () { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); }
P.S.
Практика показала что этот скетч рано или поздно приводит к прекращению подачи сигналов платой.
Это очевидно - подключение к wi-fi мы проводим только при setup.
Естественно, подключение к роутеру не может существовать вечно.
Поэтому добавим проверку подключения в каждый вызов функции передачи данных на сайт.
Ну и светодиодами будем моргать в зависимости от состояния платы.
#include "WiFiEsp.h" // Библиотека для работы с платой #include <dht11.h> // Добавляем библиотеку DHT11 dht11 DHT; // Объявление переменной класса dht11 #define DHT11_PIN 4 // Датчик DHT11 подключен к цифровому пину номер 4 #define DHT112_PIN 7 // Датчик DHT11 подключен к цифровому пину номер 7 const int analogSignal = A3; //подключение аналогового сигналоьного пина const int digitalSignal = 8; //подключение цифрового сигнального пина boolean noGas; //переменная для хранения значения о присутствии газа int gas = 0; //переменная для хранения количества газа float hum = 0; //переменная для хранения влажности float temp = 0; //переменная для хранения температуры float hum1 = 0; //переменная для хранения влажности float temp1 = 0; //переменная для хранения температуры char mac[18] = { 0 }; int chk; //переменная для хранения ошибки DHT const char ssid[] = "Keenetic-0138"; // your network SSID (name) const char pass[] = "*******"; // your network password int status = WL_IDLE_STATUS; // the Wifi radio's status String jsonString; // данные String PostHeader; // данные const char server[] = "esp8266.my-site.ru"; unsigned long lastConnectionTime = 0; unsigned long lastInfoTime = 0; const unsigned long postingInterval = 1200000; // 20 минут const unsigned long infoInterval = 60000; // 1 минута // Инициализация объекта wi-fi клиент WiFiEspClient client; void setup() { pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); // ERROR Serial.begin(9600); WiFi.init(&Serial); if (WiFi.status() == WL_NO_SHIELD) { while (true); } while ( status != WL_CONNECTED) { digitalWrite(9, HIGH); status = WiFi.begin(ssid, pass); } digitalWrite(9, LOW); uint8_t macH[6]; WiFi.macAddress(macH); sprintf(mac, "XXXXXX", macH[0], macH[1], macH[2], macH[3], macH[4], macH[5]); //httpRequest(); } void loop() { if (lastConnectionTime == 0 ) { httpRequest(); } if (millis() - lastConnectionTime > postingInterval) { httpRequest(); } if (millis() - lastInfoTime > infoInterval) { digitalWrite(10, HIGH); // включает светодиод delay(3000); // ждет 3 секунды digitalWrite(10, LOW); // выключает светодиод lastInfoTime = millis(); } } void httpRequest() { client.stop(); while ( status != WL_CONNECTED) { digitalWrite(9, HIGH); status = WiFi.begin(ssid, pass); } digitalWrite(9, LOW); noGas = digitalRead(digitalSignal); //считываем значение о присутствии газа gas = analogRead(analogSignal); // и о его количестве chk = DHT.read(DHT11_PIN); hum = DHT.humidity; temp = DHT.temperature; chk = DHT.read(DHT112_PIN); hum1 = DHT.humidity; temp1 = DHT.temperature; if (client.connect(server, 80)) { digitalWrite(12, LOW); digitalWrite(11, HIGH); jsonString = "secret=0000&name=ESP_8266WiFi&temp=" + String(temp) + "&hum=" + String(hum) + "&temp1=" + String(temp1) + "&hum1=" + String(hum1) + "&gas=" + String(gas) + "&mac=" + String(mac)+ "&ram=" + String(freeRam()) + "&rssi=" + String(WiFi.RSSI()); PostHeader = "POST /ajax/cGx1Z2lucy9te******************eC5waHA= HTTP/1.1\r\n"; PostHeader += "Host: esp8266.my-site.ru:80\r\n"; PostHeader += "User-Agent: ESP8266WiFi\r\n"; PostHeader += "Accept: application/xml\r\n"; PostHeader += "Content-Type: application/x-www-form-urlencoded\r\n"; PostHeader += "X-Requested-With: XMLHttpRequest\r\n"; PostHeader += "Referer: http://esp8266.my-site.ru\r\n"; PostHeader += "Connection: close\r\n"; PostHeader += "Content-Length: " + String(jsonString.length()) + "\r\n"; jsonString += "\r\n\r\n\r\n"; client.println(PostHeader); client.println(jsonString); } else digitalWrite(12, HIGH); while (client.available()) { char c = client.read(); } if (!client.connected()) { client.stop(); digitalWrite(11, LOW); } lastConnectionTime = millis(); } int freeRam () { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); }