Перед отправкой, итоговый код, проверенный
parent
eef2dd6ef6
commit
cb0938fa50
|
@ -0,0 +1,97 @@
|
||||||
|
|
||||||
|
#include <Preferences.h>
|
||||||
|
|
||||||
|
Preferences preferences;
|
||||||
|
|
||||||
|
#include "Adafruit_CCS811.h"
|
||||||
|
|
||||||
|
Adafruit_CCS811 ccs;
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
Serial.println("CCS811 test");
|
||||||
|
Wire.begin(25, 21);
|
||||||
|
|
||||||
|
// Удаляем отдельный ключ
|
||||||
|
//preferences.remove("counter");
|
||||||
|
// Удаляем все настройки под заданным пространством имён
|
||||||
|
//preferences.clear();
|
||||||
|
|
||||||
|
if (!ccs.begin())
|
||||||
|
{
|
||||||
|
Serial.println("Failed to start sensor! Please check your wiring.");
|
||||||
|
while (1)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the sensor to be ready
|
||||||
|
while (!ccs.available())
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
if (ccs.available())
|
||||||
|
{
|
||||||
|
if (!ccs.readData())
|
||||||
|
{
|
||||||
|
|
||||||
|
unsigned long timenow = millis();
|
||||||
|
|
||||||
|
if (timenow >= 43200000 && timenow <= 43240000)
|
||||||
|
{
|
||||||
|
preferences.begin("airdata", false);
|
||||||
|
preferences.putUInt("co2", ccs.geteCO2());
|
||||||
|
preferences.putUInt("tvoc", ccs.getTVOC());
|
||||||
|
preferences.putUInt("baseline", ccs.getBaseline());
|
||||||
|
preferences.end();
|
||||||
|
Serial.println("Write data in preferenses - OK");
|
||||||
|
preferences.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("----- ");
|
||||||
|
Serial.println(timenow);
|
||||||
|
Serial.println(getMacAddress());
|
||||||
|
Serial.println("----- ");
|
||||||
|
|
||||||
|
Serial.print("NOW CO2: ");
|
||||||
|
Serial.println(ccs.geteCO2());
|
||||||
|
|
||||||
|
Serial.print("NOW ppm, TVOC: ");
|
||||||
|
Serial.println(ccs.getTVOC());
|
||||||
|
|
||||||
|
Serial.print("NOW aseline: ");
|
||||||
|
Serial.println(ccs.getBaseline());
|
||||||
|
|
||||||
|
Serial.println("=================");
|
||||||
|
|
||||||
|
preferences.begin("airdata", false);
|
||||||
|
Serial.print("Preferenses CO2: ");
|
||||||
|
Serial.println(preferences.getUInt("co2", 0));
|
||||||
|
|
||||||
|
Serial.print("Preferenses TVOC: ");
|
||||||
|
Serial.println(preferences.getUInt("tvoc", 0));
|
||||||
|
|
||||||
|
Serial.print("Preferenses Baseline: ");
|
||||||
|
Serial.println(preferences.getUInt("baseline", 0));
|
||||||
|
Serial.println("=============================================");
|
||||||
|
preferences.end();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.println("ERROR!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delay(5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
String getMacAddress()
|
||||||
|
{
|
||||||
|
uint8_t baseMac[6];
|
||||||
|
esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
|
||||||
|
char baseMacChr[18] = {0};
|
||||||
|
sprintf(baseMacChr, "%02X%02X%02X%02X%02X%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]);
|
||||||
|
return String(baseMacChr);
|
||||||
|
}
|
Binary file not shown.
367
M5Atom_airqa.ino
367
M5Atom_airqa.ino
|
@ -8,8 +8,17 @@
|
||||||
Диапазон измерения концентрации летучих органических веществ 0 ... 1187 ppb
|
Диапазон измерения концентрации летучих органических веществ 0 ... 1187 ppb
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
Датчики воздуха
|
||||||
|
24A1605423AC - light
|
||||||
|
5002918A38CC
|
||||||
|
5002919F5450
|
||||||
|
24A160474D14
|
||||||
|
24A160542B80
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
#include "esp_sleep.h"
|
#include "esp_sleep.h"
|
||||||
#include "driver/rtc_io.h"
|
|
||||||
|
|
||||||
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
|
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
|
||||||
#include <Preferences.h> //Сохранение настроек хеша прошивки
|
#include <Preferences.h> //Сохранение настроек хеша прошивки
|
||||||
|
@ -33,12 +42,12 @@
|
||||||
//Наша кнопочка при нажатии на которую произойдет вызов wifi менеджера и перезагрузка в станцию
|
//Наша кнопочка при нажатии на которую произойдет вызов wifi менеджера и перезагрузка в станцию
|
||||||
#define TRIGGER_PIN 39
|
#define TRIGGER_PIN 39
|
||||||
#define uS_TO_S_FACTOR 1000000
|
#define uS_TO_S_FACTOR 1000000
|
||||||
#define TIME_TO_SLEEP 30
|
#define TIME_TO_SLEEP 60
|
||||||
#define GPIO_WAK 23
|
#define GPIO_WAK 23
|
||||||
#define CCS811_ADDR 0x5B //Default I2C Address
|
#define CCS811_ADDR 0x5B //Default I2C Address
|
||||||
//#define CCS811_ADDR 0x5A //Alternate I2C Address
|
//#define CCS811_ADDR 0x5A //Alternate I2C Address
|
||||||
|
|
||||||
unsigned int VersionSW = 225; //65536 Версия прошивки
|
unsigned int VersionSW = 30; //65536 Версия прошивки
|
||||||
|
|
||||||
//15 - добавлено то, се, забыл вообще дописать что добавленоSerial
|
//15 - добавлено то, се, забыл вообще дописать что добавленоSerial
|
||||||
//19 - вывод в консоль всех действий, ошибки с обновлнеием - починил, прияногое мигание светодиодом, тест для поиска metrics.
|
//19 - вывод в консоль всех действий, ошибки с обновлнеием - починил, прияногое мигание светодиодом, тест для поиска metrics.
|
||||||
|
@ -46,6 +55,12 @@ unsigned int VersionSW = 225; //65536 Версия прошивки
|
||||||
//22 - поправлено поиск сервера по metrics local.
|
//22 - поправлено поиск сервера по metrics local.
|
||||||
//23 - добавленн BSID
|
//23 - добавленн BSID
|
||||||
//24 - полный передел всего
|
//24 - полный передел всего
|
||||||
|
//25 - новые топики, спящий режим
|
||||||
|
//26 - тест обновления сука - работает
|
||||||
|
//27 - таймаут станции без wifi 40 сек
|
||||||
|
//28 - калибровка вернулась
|
||||||
|
//29 - baseline выведен и отключен
|
||||||
|
//30 - новое освещение оранжевый цвет
|
||||||
|
|
||||||
gpio_num_t pinWak = GPIO_NUM_23;
|
gpio_num_t pinWak = GPIO_NUM_23;
|
||||||
|
|
||||||
|
@ -65,13 +80,14 @@ IPAddress IpMqtt;
|
||||||
WiFiUDP ntpUDP;
|
WiFiUDP ntpUDP;
|
||||||
NTPClient timeClient(ntpUDP, "0.ua.pool.ntp.org", 7200, 60000); //Собственно сервер времени смещение и частоат запроса, но он вручную
|
NTPClient timeClient(ntpUDP, "0.ua.pool.ntp.org", 7200, 60000); //Собственно сервер времени смещение и частоат запроса, но он вручную
|
||||||
const PROGMEM char *willmess = "{\"conn\":\"err\"}";
|
const PROGMEM char *willmess = "{\"conn\":\"err\"}";
|
||||||
const char *mqttHostName = "cctv.automation.art"; //Хостнейм брокера metrics.local cctv.automation.art //192.168.89.210
|
const char *mqttHostName = "metrics"; //Хостнейм брокера metrics.local cctv.automation.art //192.168.89.210
|
||||||
unsigned int mqttPort = 8889; //Порт брокера 1883 8889
|
unsigned int mqttPort = 1883; //Порт брокера 1883 8889
|
||||||
|
|
||||||
|
|
||||||
String getMacAddress();
|
String getMacAddress();
|
||||||
String macc = getMacAddress();
|
String macc = getMacAddress();
|
||||||
String topicTemp = "aastudio/" + macc + "/data/0";
|
String topicTemp = "aastudio/sens/" + macc + "/data/0";
|
||||||
String willTopicTemp = "aastudio/" + macc + "/status";
|
String willTopicTemp = "aastudio/sens/" + macc + "/status";
|
||||||
|
|
||||||
const PROGMEM char *mqttLogin = "login", *mqttPass = "password";
|
const PROGMEM char *mqttLogin = "login", *mqttPass = "password";
|
||||||
|
|
||||||
|
@ -80,37 +96,51 @@ char bufWillTopic[150];
|
||||||
|
|
||||||
const char *mqttIPHost;
|
const char *mqttIPHost;
|
||||||
|
|
||||||
RTC_DATA_ATTR unsigned long timingUpdate, timingSendMqtt; //Таймеры для millis()
|
RTC_DATA_ATTR byte countOta = 0;
|
||||||
int PROGMEM nextM5Update = 450000; //каждые 7.5 минут запрос обновления с сервера
|
int PROGMEM nextM5Update = 450000; //каждые 7.5 минут запрос обновления с сервера
|
||||||
int PROGMEM nextReqSensor = 10000; //опрос датчиков раз в 10 секунд
|
int PROGMEM nextReqSensor = 10000; //опрос датчиков раз в 10 секунд
|
||||||
int PROGMEM nextMqttSend = 60000; //Отправка
|
int PROGMEM nextMqttSend = 60000; //Отправка
|
||||||
|
|
||||||
//Поправочные коефициенты для датчиков
|
|
||||||
//[24A160474D14, 5002919F5450, 5002918A38CC]
|
|
||||||
//tcoeff[0,1,2]
|
|
||||||
//hcoeff[0,1,2]
|
|
||||||
|
|
||||||
float PROGMEM tcoeff[3] = {-11.18, -9.62, -10.6}; //Температура
|
|
||||||
float PROGMEM hcoeff[3] = {13.77, 14.07, 15.56}; //Влажность
|
|
||||||
float callibrationT = 0, callibrationH = 0;
|
|
||||||
float TempAv, HumAv, Eco2Av, TvocAv;
|
float TempAv, HumAv, Eco2Av, TvocAv;
|
||||||
|
unsigned int BaselineTvoc=0;
|
||||||
byte errorID = 0;
|
byte errorID = 0;
|
||||||
|
|
||||||
long rssi = 0;
|
long rssi = 0;
|
||||||
|
|
||||||
#define NUM_AVER 5
|
|
||||||
float averageT, averageH, averageECO, averageTVOC; // перем. среднего
|
|
||||||
float valArrayT[NUM_AVER], valArrayH[NUM_AVER], valArrayECO[NUM_AVER], valArrayTVOC[NUM_AVER]; // массив
|
|
||||||
byte idxT = 0, idxH = 0, idxECO = 0, idxTVOC = 0;
|
byte idxT = 0, idxH = 0, idxECO = 0, idxTVOC = 0;
|
||||||
|
|
||||||
bool mqttSendFlag = false;
|
bool mqttSendFlag = false;
|
||||||
int reqCounter = 0;
|
int reqCounter = 0;
|
||||||
bool flagblink = true;
|
bool flagblink = true;
|
||||||
|
|
||||||
|
void ledset(byte color = 0, bool blink = false)
|
||||||
|
{
|
||||||
|
M5.dis.setBrightness(30); //Половина яркости
|
||||||
|
switch (color)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
M5.dis.drawpix(0, 0xf00000); //Зеленый
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
M5.dis.drawpix(0, 0x00ff00); //Красный
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
M5.dis.drawpix(0, 0x0000ff); //Синий
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
M5.dis.drawpix(0, 0x707070); //Белый
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
M5.dis.clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Настройки
|
//Настройки
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
Serial.begin(115200);
|
||||||
|
// Serial.setDebugOutput(true);
|
||||||
|
|
||||||
btStop();
|
btStop();
|
||||||
// esp_bt_controller_disable();
|
// esp_bt_controller_disable();
|
||||||
|
|
||||||
|
@ -118,35 +148,27 @@ void setup()
|
||||||
M5.begin(true, false, true);
|
M5.begin(true, false, true);
|
||||||
Wire.begin(25, 21); //Пины для I2c на ATOM
|
Wire.begin(25, 21); //Пины для I2c на ATOM
|
||||||
|
|
||||||
// pinMode(GPIO_WAK, OUTPUT); //Пин датчика для работы
|
pinMode(GPIO_WAK, OUTPUT); //Пин датчика для работы
|
||||||
// digitalWrite(GPIO_WAK, LOW);
|
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(TRIGGER_PIN, INPUT);
|
pinMode(TRIGGER_PIN, INPUT);
|
||||||
|
|
||||||
hdc1080.begin(0x40); //14 бит температура и влажность
|
hdc1080.begin(0x40);
|
||||||
hdc1080.setResolution(HDC1080_RESOLUTION_11BIT, HDC1080_RESOLUTION_11BIT);
|
hdc1080.setResolution(HDC1080_RESOLUTION_11BIT, HDC1080_RESOLUTION_11BIT);
|
||||||
|
|
||||||
while (!ccs.begin() && !ccs.available()) //The device's I2C address is 0x5A
|
while (!ccs.begin() && !ccs.available()) //The device's I2C address is 0x5A
|
||||||
{
|
{
|
||||||
Serial.println("Failed BEGIN And Failed available ");
|
ledset(1, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//ccs.setTempOffset(8.6);
|
//ccs.setTempOffset(8.6);
|
||||||
|
// ccs.setBaseline(21634);
|
||||||
//Установка коеффициентов каллибровки по MAC адресу
|
//Установка коеффициентов каллибровки по MAC адресу
|
||||||
// SetCallibrationCoeff();
|
// SetCallibrationCoeff();
|
||||||
|
|
||||||
delay(15);
|
delay(15);
|
||||||
|
|
||||||
WiFi.mode(WIFI_STA);
|
WiFi.mode(WIFI_STA);
|
||||||
Serial.begin(115200);
|
|
||||||
Serial.setDebugOutput(true);
|
|
||||||
|
|
||||||
topicTemp.toCharArray(bufTopic, topicTemp.length() + 1);
|
topicTemp.toCharArray(bufTopic, topicTemp.length() + 1);
|
||||||
willTopicTemp.toCharArray(bufWillTopic, willTopicTemp.length() + 1);
|
willTopicTemp.toCharArray(bufWillTopic, willTopicTemp.length() + 1);
|
||||||
|
@ -156,15 +178,10 @@ void setup()
|
||||||
|
|
||||||
// wm.resetSettings(); // wipe settings
|
// wm.resetSettings(); // wipe settings
|
||||||
|
|
||||||
// const char *custom_radio_str = "<br/><label for='customfieldid'>Custom Field Label</label><input type='radio' name='customfieldid' value='1' checked> One<br><input type='radio' name='customfieldid' value='2'> Two<br><input type='radio' name='customfieldid' value='3'> Three";
|
|
||||||
// new (&custom_field) WiFiManagerParameter(custom_radio_str); // custom html input
|
|
||||||
// wm.addParameter(&custom_field);
|
|
||||||
// wm.setSaveParamsCallback(saveParamCallback);
|
|
||||||
|
|
||||||
std::vector<const char *> menu = {"wifi", "info", "param", "sep", "restart", "exit"};
|
std::vector<const char *> menu = {"wifi", "info", "param", "sep", "restart", "exit"};
|
||||||
wm.setMenu(menu);
|
wm.setMenu(menu);
|
||||||
wm.setClass("invert");
|
wm.setClass("invert");
|
||||||
//wm.setConfigPortalTimeout(60);
|
wm.setConfigPortalTimeout(40);
|
||||||
|
|
||||||
wm.setMinimumSignalQuality(20);
|
wm.setMinimumSignalQuality(20);
|
||||||
wm.setScanDispPerc(true);
|
wm.setScanDispPerc(true);
|
||||||
|
@ -225,20 +242,6 @@ int setServCall(IPAddress SetIpaddr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Функция получения данных из MQTT если мы подпишемся на топики
|
|
||||||
// void callback(char *topic, byte *payload, unsigned int length)
|
|
||||||
// {
|
|
||||||
// ////////////Serial.print("Message arrived [");
|
|
||||||
// ////////////Serial.print(topic);
|
|
||||||
// //////////Serial.print("] ");
|
|
||||||
// for (int i = 0; i < length; i++)
|
|
||||||
// {
|
|
||||||
// //////////Serial.print((char)payload[i]);
|
|
||||||
// }
|
|
||||||
// //////////Serial.println();
|
|
||||||
// }
|
|
||||||
|
|
||||||
//Запрос времени NTP и установка локлаьного времени
|
|
||||||
int reqNtpTime()
|
int reqNtpTime()
|
||||||
{
|
{
|
||||||
if (timeClient.update())
|
if (timeClient.update())
|
||||||
|
@ -259,44 +262,32 @@ int reqNtpTime()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Нажатие кнопки для сброса
|
|
||||||
int checkButton()
|
int checkButton()
|
||||||
{
|
{
|
||||||
Serial.println("Button Pressed to RESET");
|
Serial.println("Button Pressed to RESET");
|
||||||
|
|
||||||
wm.resetSettings();
|
wm.resetSettings();
|
||||||
|
|
||||||
// ESP.restart();
|
ESP.restart();
|
||||||
//////////Serial.println("Starting config portal");
|
//////////Serial.println("Starting config portal");
|
||||||
wm.setConfigPortalTimeout(120);
|
//wm.setConfigPortalTimeout(120);
|
||||||
|
|
||||||
if (!wm.startConfigPortal("AirQaPortal", "12345678")) //Логин и пароль точки доступа
|
// if (!wm.startConfigPortal("AirQaPortal", "12345678")) //Логин и пароль точки доступа
|
||||||
{
|
// {
|
||||||
Serial.println("failed to connect or hit timeout");
|
// Serial.println("failed to connect or hit timeout");
|
||||||
|
|
||||||
ESP.restart();
|
// ESP.restart();
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
Serial.println("Clien connected to AP");
|
// Serial.println("Clien connected to AP");
|
||||||
}
|
// }
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// {
|
|
||||||
// String value;
|
|
||||||
// if (wm.server->hasArg(name))
|
|
||||||
// {
|
|
||||||
// value = wm.server->arg(name);
|
|
||||||
// }
|
|
||||||
// return value;
|
|
||||||
// }
|
|
||||||
|
|
||||||
//Обновление прошивки, происходит проверка и загрузка
|
|
||||||
|
|
||||||
void OTAUpdate()
|
void OTAUpdate()
|
||||||
{
|
{
|
||||||
Serial.println("OTAUpdate() START");
|
Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!!OTAUpdate() START!!!!!!!!!!!!!!!!!!!!!!!!!!");
|
||||||
bool flagOTA = false;
|
bool flagOTA = false;
|
||||||
String keyOTA;
|
String keyOTA;
|
||||||
String payload;
|
String payload;
|
||||||
|
@ -304,7 +295,7 @@ void OTAUpdate()
|
||||||
if (WiFi.status() == WL_CONNECTED)
|
if (WiFi.status() == WL_CONNECTED)
|
||||||
{
|
{
|
||||||
HTTPClient http;
|
HTTPClient http;
|
||||||
String serverPath = "http://Dmeteosence.s-host.net/airqa/airquality.php?meteopas=e93gme9hAt9nSWaV&mac=" + macc + "&meteodata=gethash";
|
String serverPath = "http://meteosence.s-host.net/airqa/airquality.php?meteopas=e93gme9hAt9nSWaV&mac=" + macc + "&meteodata=gethash";
|
||||||
Serial.println(serverPath);
|
Serial.println(serverPath);
|
||||||
|
|
||||||
http.begin(serverPath.c_str());
|
http.begin(serverPath.c_str());
|
||||||
|
@ -367,14 +358,6 @@ void OTAUpdate()
|
||||||
|
|
||||||
t_httpUpdate_return ret = ESPhttpUpdate.update("http://meteosence.s-host.net/airqa/airatoms.bin");
|
t_httpUpdate_return ret = ESPhttpUpdate.update("http://meteosence.s-host.net/airqa/airatoms.bin");
|
||||||
|
|
||||||
//После update ничего не происходит, такая вот особенность.
|
|
||||||
//Если все прошло хорошо, перезагрузка на новую прошивку
|
|
||||||
// Если указано значение true, модуль ESP перезагрузится после успешного завершения обновления. В случае ложного , модуль не перезагружается автоматически. Загруженная новая прошивка остается в стадии обновления флэш-памяти на модуле ESP.
|
|
||||||
// Процесс загрузки во время следующего запуска модуля путем сброса скопирует обновленное микропрограммное обеспечение в фактическую область программы, и запустится новая программа эскиза. Значение по умолчанию верно.
|
|
||||||
|
|
||||||
////////Serial.print("ret ");
|
|
||||||
Serial.println(ret);
|
|
||||||
|
|
||||||
switch (ret)
|
switch (ret)
|
||||||
{
|
{
|
||||||
case HTTP_UPDATE_FAILED:
|
case HTTP_UPDATE_FAILED:
|
||||||
|
@ -401,31 +384,6 @@ void OTAUpdate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Функция для индикации Led
|
|
||||||
void ledset(char color = 't', bool blink = false)
|
|
||||||
{
|
|
||||||
M5.dis.setBrightness(30); //Половина яркости
|
|
||||||
switch (color)
|
|
||||||
{
|
|
||||||
case 'g':
|
|
||||||
M5.dis.drawpix(0, 0xf00000); //Зеленый
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
M5.dis.drawpix(0, 0x00f000); //Красный
|
|
||||||
break;
|
|
||||||
case 'b':
|
|
||||||
M5.dis.drawpix(0, 0x0000f0); //Синий
|
|
||||||
break;
|
|
||||||
case 'w':
|
|
||||||
M5.dis.drawpix(0, 0x707070); //Белый
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
M5.dis.clear();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Получение мак адреса
|
|
||||||
String getMacAddress()
|
String getMacAddress()
|
||||||
{
|
{
|
||||||
uint8_t baseMac[6];
|
uint8_t baseMac[6];
|
||||||
|
@ -435,63 +393,88 @@ String getMacAddress()
|
||||||
return String(baseMacChr);
|
return String(baseMacChr);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Установка коефициентов калибровки
|
int SetCallibrationCoeff(String MacThat)
|
||||||
void SetCallibrationCoeff()
|
|
||||||
{
|
{
|
||||||
// ////////Serial.print("Mac: ");
|
|
||||||
// ////////Serial.println(getMacAddress());
|
|
||||||
|
|
||||||
//[24A160474D14, 5002919F5450, 5002918A38CC]
|
// 24A1605423AC - light
|
||||||
//tcoeff[0,1,2]
|
// 5002918A38CC
|
||||||
//hcoeff[0,1,2]
|
// 5002919F5450
|
||||||
|
// 24A160474D14
|
||||||
|
// 24A160542B80
|
||||||
|
|
||||||
if (macc == "24A160474D14")
|
if (MacThat == "24A1605423AC")
|
||||||
{
|
{
|
||||||
callibrationT = tcoeff[0];
|
TempAv += -6.91;
|
||||||
callibrationH = hcoeff[0];
|
HumAv += 7.95;
|
||||||
}
|
|
||||||
if (macc == "5002919F5450")
|
|
||||||
{
|
|
||||||
callibrationT = tcoeff[1];
|
|
||||||
callibrationH = hcoeff[1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (macc == "5002918A38CC")
|
if (MacThat == "5002918A38CC")
|
||||||
{
|
{
|
||||||
callibrationT = tcoeff[2];
|
TempAv += -5.72;
|
||||||
callibrationH = hcoeff[2];
|
HumAv += 12.74;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MacThat == "5002919F5450")
|
||||||
|
{
|
||||||
|
TempAv += -6.57;
|
||||||
|
HumAv += 12.89;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MacThat == "24A160474D14")
|
||||||
|
{
|
||||||
|
TempAv += -7.14;
|
||||||
|
HumAv += 11.84;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MacThat == "24A160542B80")
|
||||||
|
{
|
||||||
|
TempAv += -7.37;
|
||||||
|
HumAv += 8.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Запрос данных с датчиков.
|
//Запрос данных с датчиков.
|
||||||
void reqSensorData()
|
void reqSensorData()
|
||||||
{
|
{
|
||||||
delay(15);
|
|
||||||
float hdc1080Temp = 0, hdc1080Hum = 0;
|
float hdc1080Temp = 0, hdc1080Hum = 0;
|
||||||
int eco2 = 0, tvoc = 0;
|
int eco2 = 0, tvoc = 0;
|
||||||
|
|
||||||
for (int g = 0; g <= 10; g++)
|
hdc1080Temp = hdc1080.readTemperature();
|
||||||
|
hdc1080Hum = hdc1080.readHumidity();
|
||||||
|
|
||||||
|
if (hdc1080Temp < -40 || hdc1080Temp > 60)
|
||||||
|
{
|
||||||
|
errorID = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdc1080Hum < 0 || hdc1080Temp > 100)
|
||||||
|
{
|
||||||
|
errorID = 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
char outstr[6];
|
||||||
|
dtostrf(hdc1080Temp, 5, 2, outstr);
|
||||||
|
TempAv = atof(outstr);
|
||||||
|
dtostrf(hdc1080Hum, 5, 2, outstr);
|
||||||
|
HumAv = atof(outstr);
|
||||||
|
|
||||||
|
|
||||||
|
for (int g = 0; g <= 5; g++)
|
||||||
{
|
{
|
||||||
delay(1000);
|
delay(1000);
|
||||||
if (ccs.available())
|
if (ccs.available())
|
||||||
{
|
{
|
||||||
if (!ccs.readData())
|
if (!ccs.readData())
|
||||||
{
|
{
|
||||||
// ccs.readAlgorithmResults();
|
ccs.setEnvironmentalData(hdc1080Hum-55,hdc1080Temp-25);
|
||||||
eco2 = ccs.geteCO2();
|
eco2 = ccs.geteCO2();
|
||||||
tvoc = ccs.getTVOC();
|
tvoc = ccs.getTVOC();
|
||||||
Serial.println(ccs.geteCO2());
|
BaselineTvoc=ccs.getBaseline();
|
||||||
Serial.println(ccs.getTVOC());
|
Serial.println(eco2);
|
||||||
|
Serial.println(tvoc);
|
||||||
Serial.print("baseline: ");
|
|
||||||
Serial.println(ccs.getBaseline());
|
|
||||||
|
|
||||||
Serial.print("CurrentSelected: ");
|
|
||||||
Serial.println(ccs.getCurrentSelected());
|
|
||||||
|
|
||||||
Serial.print("RawADCreading: ");
|
|
||||||
Serial.println(ccs.getRawADCreading());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -507,31 +490,6 @@ void reqSensorData()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hdc1080Temp = hdc1080.readTemperature();
|
|
||||||
hdc1080Hum = hdc1080.readHumidity();
|
|
||||||
|
|
||||||
if (hdc1080Temp < -40 || hdc1080Temp > 60)
|
|
||||||
{
|
|
||||||
errorID = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hdc1080Hum < 0 || hdc1080Temp > 100)
|
|
||||||
{
|
|
||||||
errorID = 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.println("Original data: ");
|
|
||||||
Serial.print(hdc1080.readTemperature());
|
|
||||||
Serial.print(" ");
|
|
||||||
Serial.println(hdc1080.readHumidity());
|
|
||||||
|
|
||||||
Serial.println("Calibration data: ");
|
|
||||||
Serial.print(hdc1080Temp);
|
|
||||||
Serial.print(" ");
|
|
||||||
Serial.println(hdc1080Hum);
|
|
||||||
|
|
||||||
TempAv = hdc1080Temp;
|
|
||||||
HumAv = hdc1080Hum;
|
|
||||||
Eco2Av = eco2;
|
Eco2Av = eco2;
|
||||||
TvocAv = tvoc;
|
TvocAv = tvoc;
|
||||||
|
|
||||||
|
@ -553,16 +511,25 @@ int SendMqttReq(bool sendVal = true, bool sendStatus = true, byte statusConn = 1
|
||||||
doc["h"] = HumAv;
|
doc["h"] = HumAv;
|
||||||
doc["eco"] = (int)Eco2Av;
|
doc["eco"] = (int)Eco2Av;
|
||||||
doc["tvoc"] = (int)TvocAv;
|
doc["tvoc"] = (int)TvocAv;
|
||||||
doc["ligh"] = (int)map(analogRead(33), 0, 4095, 0, 100);
|
doc["blt"]= BaselineTvoc;
|
||||||
|
if (macc == "24A1605423AC")
|
||||||
|
{
|
||||||
|
doc["ligh"] = (int)map(analogRead(33), 0, 4095, 0, 100);
|
||||||
|
}
|
||||||
doc["ts"] = timeNow;
|
doc["ts"] = timeNow;
|
||||||
|
|
||||||
serializeJson(doc, JsonData);
|
serializeJson(doc, JsonData);
|
||||||
|
|
||||||
doc.remove("t");
|
doc.remove("t");
|
||||||
doc.remove("h");
|
doc.remove("h");
|
||||||
doc.remove("eco");
|
doc.remove("eco");
|
||||||
doc.remove("tvoc");
|
doc.remove("tvoc");
|
||||||
doc.remove("ligh");
|
doc.remove("blt");
|
||||||
|
|
||||||
|
if (macc == "24A1605423AC")
|
||||||
|
{
|
||||||
|
doc.remove("ligh");
|
||||||
|
}
|
||||||
doc.remove("ts");
|
doc.remove("ts");
|
||||||
|
|
||||||
doc.clear();
|
doc.clear();
|
||||||
|
@ -576,7 +543,6 @@ int SendMqttReq(bool sendVal = true, bool sendStatus = true, byte statusConn = 1
|
||||||
if (sendStatus == true)
|
if (sendStatus == true)
|
||||||
{
|
{
|
||||||
const char *conn;
|
const char *conn;
|
||||||
|
|
||||||
switch (statusConn)
|
switch (statusConn)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -598,7 +564,6 @@ int SendMqttReq(bool sendVal = true, bool sendStatus = true, byte statusConn = 1
|
||||||
doc["conn"] = conn;
|
doc["conn"] = conn;
|
||||||
doc["rssi"] = rssi;
|
doc["rssi"] = rssi;
|
||||||
doc["bsid"] = WiFi.BSSIDstr();
|
doc["bsid"] = WiFi.BSSIDstr();
|
||||||
//doc["lasterror"] = errorID;
|
|
||||||
doc["ts"] = timeNow;
|
doc["ts"] = timeNow;
|
||||||
doc["sv"] = VersionSW;
|
doc["sv"] = VersionSW;
|
||||||
|
|
||||||
|
@ -621,7 +586,7 @@ void reconnectMqtt()
|
||||||
byte circle = 0;
|
byte circle = 0;
|
||||||
while (!MqttClient.connected())
|
while (!MqttClient.connected())
|
||||||
{
|
{
|
||||||
////Serial.print("MQTT reconnect...");
|
Serial.print("MQTT reconnect...");
|
||||||
|
|
||||||
circle++;
|
circle++;
|
||||||
if (circle == 2)
|
if (circle == 2)
|
||||||
|
@ -632,13 +597,10 @@ void reconnectMqtt()
|
||||||
String maccrandom = macc + String(random(0xffff), HEX);
|
String maccrandom = macc + String(random(0xffff), HEX);
|
||||||
const char *clientId = maccrandom.c_str();
|
const char *clientId = maccrandom.c_str();
|
||||||
|
|
||||||
//const char *id, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage
|
|
||||||
////Serial.println(clientId);
|
|
||||||
|
|
||||||
if (MqttClient.connect(clientId, bufWillTopic, 2, true, willmess))
|
if (MqttClient.connect(clientId, bufWillTopic, 2, true, willmess))
|
||||||
{
|
{
|
||||||
Serial.println("MqttClient.connect() - OK");
|
Serial.println("MqttClient.connect() - OK");
|
||||||
errorID = 8;
|
|
||||||
mqttSendFlag = true;
|
mqttSendFlag = true;
|
||||||
|
|
||||||
SendMqttReq(false, true, 1);
|
SendMqttReq(false, true, 1);
|
||||||
|
@ -660,7 +622,7 @@ void reconnectMqtt()
|
||||||
5 : MQTT_CONNECT_UNAUTHORIZED - the client was not authorized to connect
|
5 : MQTT_CONNECT_UNAUTHORIZED - the client was not authorized to connect
|
||||||
*/
|
*/
|
||||||
mqttSendFlag = false;
|
mqttSendFlag = false;
|
||||||
delay(3000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -673,54 +635,49 @@ void loop()
|
||||||
if (!MqttClient.connected())
|
if (!MqttClient.connected())
|
||||||
{
|
{
|
||||||
reconnectMqtt();
|
reconnectMqtt();
|
||||||
ledset('w', true);
|
ledset(1, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Если не определен IP то и не будет отправки.
|
if (countOta >= 10)
|
||||||
// 40 секунд и происходит сброс настроек WIFI
|
|
||||||
if (M5.Btn.isPressed())
|
|
||||||
{
|
{
|
||||||
ledset('r', true);
|
// reqNtpTime();
|
||||||
checkButton();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (millis() - timingUpdate > nextM5Update)
|
|
||||||
{
|
|
||||||
reqNtpTime();
|
|
||||||
OTAUpdate();
|
OTAUpdate();
|
||||||
timingUpdate = millis();
|
countOta = 0;
|
||||||
}
|
}
|
||||||
|
countOta++;
|
||||||
|
|
||||||
reqSensorData();
|
reqSensorData();
|
||||||
ledset('g', true);
|
SetCallibrationCoeff(macc);
|
||||||
|
|
||||||
SendMqttReq(true, true, 3);
|
SendMqttReq(true, true, 3);
|
||||||
|
|
||||||
MqttClient.loop();
|
MqttClient.loop();
|
||||||
disconnectMQTT();
|
disconnectMQTT();
|
||||||
delay(500);
|
delay(500);
|
||||||
|
|
||||||
|
if (M5.Btn.pressedFor(1000))
|
||||||
|
{
|
||||||
|
ledset(4, true);
|
||||||
|
checkButton();
|
||||||
|
}
|
||||||
|
|
||||||
goToSleep();
|
goToSleep();
|
||||||
}
|
}
|
||||||
|
|
||||||
int disconnectMQTT()
|
int disconnectMQTT()
|
||||||
{
|
{
|
||||||
MqttClient.disconnect();
|
MqttClient.disconnect();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int goToSleep()
|
int goToSleep()
|
||||||
{
|
{
|
||||||
ledset();
|
ledset(3, true);
|
||||||
WiFi.disconnect(true);
|
WiFi.disconnect(true);
|
||||||
WiFi.mode(WIFI_OFF);
|
WiFi.mode(WIFI_OFF);
|
||||||
|
|
||||||
// adc_power_off();
|
|
||||||
esp_wifi_stop();
|
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_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
|
||||||
|
|
||||||
esp_deep_sleep_start();
|
esp_deep_sleep_start();
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue