Последние данные

master
SmartUaWIn 2021-03-19 23:13:15 +02:00
parent 70a5bd4b86
commit eef2dd6ef6
2 changed files with 124 additions and 41 deletions

View File

@ -9,6 +9,8 @@
*/
#include "esp_sleep.h"
#include "driver/rtc_io.h"
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
#include <Preferences.h> //Сохранение настроек хеша прошивки
@ -21,8 +23,8 @@
#include <TimeLib.h> //Внутреннее время
#include <Wire.h> //Библиотека дял I2C
#include "ClosedCube_HDC1080.h" //Температура влажность
//#include "Adafruit_CCS811.h" //eco2 Tvoc
#include "SparkFunCCS811.h"
#include "Adafruit_CCS811.h" //eco2 Tvoc
//#include "SparkFunCCS811.h"
#include <PubSubClient.h> //Mtqq
#include <ArduinoJson.h> //Упакова в JSon - удобная библиотека
@ -32,7 +34,7 @@
#define TRIGGER_PIN 39
#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP 30
#define GPIO_WAK 23
#define CCS811_ADDR 0x5B //Default I2C Address
//#define CCS811_ADDR 0x5A //Alternate I2C Address
@ -43,32 +45,15 @@ unsigned int VersionSW = 225; //65536 Версия прошивки
//21 - убран мак из вывода в топике
//22 - поправлено поиск сервера по metrics local.
//23 - добавленн BSID
//24 - полный передел всего
// #include "driver / rtc_io.h"
// gpio_num_t pin_MOSFET = GPIO_NUM_15;
// void setup () {
// rtc_gpio_init (pin_MOSFET);
// rtc_gpio_set_direction (pin_MOSFET, RTC_GPIO_MODE_OUTPUT_ONLY);
// rtc_gpio_set_level (pin_MOSFET, 0); // GPIO НИЗКИЙ
// задержка (5000);
// rtc_gpio_set_level (pin_MOSFET, 1); // GPIO ВЫСОКИЙ
// esp_sleep_pd_config (ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// esp_sleep_enable_timer_wakeup (60 * 1000 * 1000);
// esp_deep_sleep_start ();
// }
gpio_num_t pinWak = GPIO_NUM_23;
WiFiManager wm; // обьект менеджера
WiFiManagerParameter custom_field;
Preferences OTApreferences; //Обьект хранения настроек хеша прошивки
CCS811 ccs(CCS811_ADDR);
Adafruit_CCS811 ccs;
ClosedCube_HDC1080 hdc1080;
StaticJsonDocument<200> doc, other;
@ -131,18 +116,25 @@ void setup()
// adc_power_on();
M5.begin(true, false, true);
Wire.begin(25, 21); //Пины для I2c на ATOM
Wire.begin(25, 21); //Пины для I2c на ATOM
// pinMode(GPIO_WAK, OUTPUT); //Пин датчика для работы
// digitalWrite(GPIO_WAK, LOW);
// gpio_hold_en(pinWak);
// gpio_deep_sleep_hold_en();
// rtc_gpio_set_level (pin_MOSFET, 1); // GPIO ВЫСОКИЙ
// esp_sleep_pd_config (ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// esp_sleep_enable_timer_wakeup (60 * 1000 * 1000);
// esp_deep_sleep_start ();
pinMode(23, OUTPUT); //Пин датчика для работы
digitalWrite(23, LOW);
pinMode(TRIGGER_PIN, INPUT);
hdc1080.begin(0x40); //14 бит температура и влажность
hdc1080.setResolution(HDC1080_RESOLUTION_11BIT, HDC1080_RESOLUTION_11BIT);
if (!ccs.begin()) //The device's I2C address is 0x5A
while (!ccs.begin() && !ccs.available()) //The device's I2C address is 0x5A
{
Serial.println("Failed to start sensor CCS811! ");
Serial.println("Failed BEGIN And Failed available ");
}
//ccs.setTempOffset(8.6);
@ -191,7 +183,6 @@ void setup()
////////////Serial.println("Server AirQaPortal start");
}
//Запрос IP сервера MQTT и установка сервера
setMqttServer();
reqNtpTime();
@ -478,18 +469,42 @@ void reqSensorData()
delay(15);
float hdc1080Temp = 0, hdc1080Hum = 0;
int eco2 = 0, tvoc = 0;
if (ccs.dataAvailable())
for (int g = 0; g <= 10; g++)
{
ccs.readAlgorithmResults();
eco2 = ccs.getCO2();
tvoc = ccs.getTVOC();
}
else
{
eco2 = 0;
delay(1000);
if (ccs.available())
{
if (!ccs.readData())
{
// ccs.readAlgorithmResults();
eco2 = ccs.geteCO2();
tvoc = ccs.getTVOC();
Serial.println(ccs.geteCO2());
Serial.println(ccs.getTVOC());
Serial.print("baseline: ");
Serial.println(ccs.getBaseline());
Serial.print("CurrentSelected: ");
Serial.println(ccs.getCurrentSelected());
Serial.print("RawADCreading: ");
Serial.println(ccs.getRawADCreading());
}
else
{
Serial.println("==========ECO TVOC NONE READ");
}
}
else
{
eco2 = 0;
tvoc = 0;
Serial.println("Error read ECO TVOC");
errorID = 5;
Serial.println("==========ECO TVOC NONE AVAILABLE");
errorID = 5;
}
}
hdc1080Temp = hdc1080.readTemperature();
@ -538,7 +553,7 @@ int SendMqttReq(bool sendVal = true, bool sendStatus = true, byte statusConn = 1
doc["h"] = HumAv;
doc["eco"] = (int)Eco2Av;
doc["tvoc"] = (int)TvocAv;
doc["ligh"] = (int)map(analogRead(33), 0, 4095, 100, 0);
doc["ligh"] = (int)map(analogRead(33), 0, 4095, 0, 100);
doc["ts"] = timeNow;
serializeJson(doc, JsonData);
@ -702,6 +717,10 @@ int goToSleep()
// adc_power_off();
esp_wifi_stop();
// rtc_gpio_init(pinWak);
// rtc_gpio_set_direction(pinWak, RTC_GPIO_MODE_OUTPUT_ONLY);
// rtc_gpio_set_level(pinWak, 0);
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();

View File

@ -79,6 +79,10 @@ https://savjee.be/2019/12/esp32-tips-to-increase-battery-life
https://savjee.be/2019/12/esp32-tips-to-increase-battery-life/
Ссылка про уджержание пина:
https://electronics.stackexchange.com/questions/350158/esp32-how-to-keep-a-pin-high-during-deep-sleep-rtc-gpio-pull-ups-are-too-weak
Прежде всего, вы заметите, что два датчика дают разные показания. Вы должны знать (цитируя лист данных) «датчики оксидов металлов не дают абсолютных показаний». Да, они делают вид, что используют регистры CO2 и TVOC, но это не так. Они измеряют сопротивление своего слоя оксида металла, а затем проверяют, насколько оно отклоняется от нормального сопротивления, и это отклонение отображается на показаниях CO2 / TVOC. Проблема заключается в этом нормальном сопротивлении, снова цитируя лист данных: «Сопротивление RS изменяется от датчика к датчику (производственные вариации), от варианта использования к варианту использования и с течением времени». В итоге все датчики дают разные показания CO2 / TVOC, но когда они повышаются, по крайней мере, мы знаем, что воздух стал хуже.
@ -108,4 +112,64 @@ RST - это вывод сброса. Когда его тянут на земл
Лучший способ откалибровать HDC1080 - держать его в контролируемой среде (например, в климатической камере) вместе с эталонным датчиком высокой точности (например, с зеркалом точки росы RH Systems 473), оценивать смещение между HDC1080 и эталонный датчик и удалите это смещение в микропрограмме микроконтроллера.
Лучший способ откалибровать HDC1080 - держать его в контролируемой среде (например, в климатической камере) вместе с эталонным датчиком высокой точности (например, с зеркалом точки росы RH Systems 473), оценивать смещение между HDC1080 и эталонный датчик и удалите это смещение в микропрограмме микроконтроллера.
Сразу уточню, основное назначение датчика — контроль TVOC. Измерение эквивалентного значения СО2 — вспомогательный функционал. Как и у других недорогих датчиков с селективностью не все хорошо.
Характеристики:
1) eCO2 maximum output value to 64000 ppm
2) TVOC maximum output value to 64000 ppm
3) напряжение питания: 1,8…3,3 В;
4) период опроса: 0,25/ 1/10/ 60 с
5) коммуникационный интерфейс: 400 кГц I2C;
6) корпус: 10-выводной LGA 2.7 × 4.0 × 1.1 мм.
7) диапазон рабочих температур: -40…+85 °C;
А теперь то, о чем вы должны знать перед использованием:
Что нужно знать перед использованием: Все пайки производим при закрытом изолентой датчиком. Не допускаем попадания паров флюса в датчик. При первом включении необходимо выдержать датчик под напряжением 24-48 часов для стабилизации характеристик сенсора. Настоятельно рекомендую проверить версию прошивку. С Китая приходят с версией 1.1.0. На сайте производителя уже давно лежит прошивка 2.0.1.
Сайт с прошивкой ( производитель): https://ams.com/ccs811#tab/features
Чувствительность и скорость реакции: Датчик очень чувствительный. И с практически мгновенной реакций. В ситуации, когда другие датчики только начинаю реагировать, CSS811 уже бьется в истерике с значениями «мы все умрем»! Если вам не нужна такая острая реакция — фильтруйте и сглаживайте показания. Иногда бывают странные «шпильки» по показаниям.
Есть «отравление датчика»! При высоких показаниях TVOC показания СО2 должны быть проигнорированы! Датчик, щедро глотнув органики, начинает выдавать нереально высокие показания по CO2.
Значения СО2 не измеряются, а получаются расчетным методом. Относительно правдоподобные значения СО2 можно получить только при близких к 0 TVOC! Если TVOC дает сигнал о органике, то значения СО2 нужно игнорировать. По причине абсолютно фантастических значений. .
Чувствительность по органике ( собрано по зарубежным источникам):
Эфиры ( Бутилгликоль — используется в авиа и космической промышленности для очистки поверхности) — очень высокая чувствительность.
Перманентный маркер — очень высокая чувствительность.
Спирты — очень высокая чувствительность.
Толуол — очень высокая чувствительность.
Ацетон — очень высокая чувствительность.
Бутанол — чувствует
Бутилацетат — чувствует
Бутан — обнаруживает, но слабо
Хлороформ — практически не чувствует
Дихлорметан — не чувствует
Ацетальдегид — слабо чувствует
Калибровка и настройка! Знать обязательно!
Изначально сенсоры датчика имеют достаточно большой технологический разброс. А потому в чипе есть регистр «Baseline», значение которого и собственно задают начальное «нулевое» значение. К нему и идет привязка показаний.
Есть 2 режима работы — ручной и автоматический.
В автоматическом режиме процессор чипа автоматически подстраивает показания регистра для показаний 400 для СО2 на чистом воздухе.Процедура очень не спешная, в среднем занимает не менее суток.
В ручном режиме выдерживаем датчик 2 суток в хорошем воздухе в режиме автоматической калибровки. Далее значение «Baseline» запоминаем, отключаем автоматическую настройку и подсовываем сохраненное значение при каждом старте.
Внимание! Значение «Baseline» при выключении питания не сохраняется! При отключении питания значение сбрасывается. И соответственно опять автонастройка на сутки…
Поэтому значение «Baseline» нужно сохранять. И соответственно восстанавливать при каждом включении последнее сохраненное значение. Это позволить получать корректные значения уже через 20 минут после включения.
Период сохранения «Baseline» (обусловлено дрейфом характеристик датчика):
Первая неделя — сохраняем каждые 24 часа.
Последующая неделя — каждые 1-28 дней.
«Baseline» — значения разные для разных периодов опроса. Если планируем менять — храним значения отдельно.
Датчик сильно не любит резких изменений температуры/влажности. Я рекомендую делать коррекцию по температуре/влажности от внешних источников ( записью в соответствующий регистр) — это увеличит точность. И тем не менее при резкой смене внешних условий датчик «чудит». Просто не надо постоянно бегать с ним из дома на улицу. Пусть отлежится и автокалибруестя.
ПОДКЛЮЧЕНИЕ ДЛЯ SSL
http://www.iotsharing.com/2017/08/how-to-use-esp32-mqtts-with-mqtts-mosquitto-broker-tls-ssl.html