diff --git a/44.bin b/44.bin new file mode 100644 index 0000000..6f289df Binary files /dev/null and b/44.bin differ diff --git a/45.bin b/45.bin new file mode 100644 index 0000000..958d460 Binary files /dev/null and b/45.bin differ diff --git a/M5Atom_airqa.ino b/M5Atom_airqa.ino index 257a82b..bc6e7c2 100644 --- a/M5Atom_airqa.ino +++ b/M5Atom_airqa.ino @@ -17,7 +17,7 @@ 24A160474D14 24A160542B80 - + Белая 2B80 Шумная 38CC У вас 23AC @@ -40,8 +40,9 @@ #include //Внутреннее время #include //Библиотека дял I2C #include "ClosedCube_HDC1080.h" //Температура влажность -#include "Adafruit_CCS811.h" //eco2 Tvoc +//#include "Adafruit_CCS811.h" //eco2 Tvoc //#include "SparkFunCCS811.h" +#include "ccs811.h" #include //Mtqq #include //Упакова в JSon - удобная библиотека @@ -55,16 +56,16 @@ #define CCS811_ADDR 0x5B //Default I2C Address //#define CCS811_ADDR 0x5A //Alternate I2C Address -unsigned int VersionSW = 43; //65536 Версия прошивки +unsigned int VersionSW = 46; //65536 Версия прошивки -//15 - добавлено то, се, забыл вообще дописать что добавленоSerial +//15 - добавлено то, се, забыл вообще дописать что добавлено Serial //19 - вывод в консоль всех действий, ошибки с обновлнеием - починил, прияногое мигание светодиодом, тест для поиска metrics. //21 - убран мак из вывода в топике //22 - поправлено поиск сервера по metrics local. //23 - добавленн BSID //24 - полный передел всего //25 - новые топики, спящий режим и куча иземенний связанных со спящим режимом. -//26 - тест обновления сука - работает +//26 - тест обновления да сук - работает //27 - таймаут станции без wifi 40 сек //28 - калибровка вернулась //29 - baseline выведен из 24х часов и отключен @@ -75,18 +76,22 @@ unsigned int VersionSW = 43; //65536 Версия прошивки //34 - правка с опросом, бесконечный цикл //35 - закоменчен вывод ошибок available //36 - настройка mqtt по ip и режимы датчика - неудачная загрузка 27.03 -//37-38 - сохранение ip metrics, и чтение из памяти, убрана базовая линия. Логин пароль. -// Фиксим получение временя 29.03 -//39 новая функция преобразования строку в ip. -//41 уменьшил код на 7%. Перезалив. Отвалились 3 из 5, но не отвалились, ходят за обновлениями, все успешно -//42 Новая функция получения данных с CO2. Что-то не вяжется с либой. -//43 Больше задержек для чтения i2c +//37-38 - сохранение ip metrics, и чтение из памяти, убрана базовая линия. Логин пароль. Фиксим получение временя 29.03 +//39 - новая функция преобразования строку в ip объект. +//41 - уменьшил код на 7%. Перезалив. Пропали 3 из 5, но не отвалились, ходят за обновлениями, все успешно +//42 - Новая функция получения данных с CO2. Что-то не вяжется с либой. +//43 - Больше задержек для чтения i2c +//44 - Новая либа твок "maarten-pennings" Спаркфан и Адафрут суки - с ошибками изначально пишут на всех форумах. +//46 - Смена локального сервера времени, хрони на одроиде. Установка базовых линий по новой. WiFiManager wm; // обьект менеджера WiFiManagerParameter custom_field; Preferences OTApreferences; //Обьект хранения настроек хеша прошивки -Adafruit_CCS811 ccs; +//Adafruit_CCS811 ccs; + +CCS811 ccs811(23); + ClosedCube_HDC1080 hdc1080; StaticJsonDocument<200> doc; @@ -96,7 +101,7 @@ PubSubClient MqttClient(espClient); //IPAddress IpMqtt(192,168,89,210); WiFiUDP ntpUDP; -NTPClient timeClient(ntpUDP, "0.ua.pool.ntp.org", 0, 60000); //Собственно сервер времени смещение и частоат запроса, но он вручную +NTPClient timeClient(ntpUDP, "192.168.89.210", 0, 20000); //Собственно сервер времени смещение и частоат запроса, но он вручную const PROGMEM char *willmess = "{\"conn\":\"err\"}"; const char *mqttHostName = "metrics"; //Хостнейм брокера metrics.local cctv.automation.art //192.168.89.210 unsigned int mqttPort = 1883; //Порт брокера 1883 8889 @@ -116,6 +121,7 @@ char bufWillTopic[150]; const char *mqttIPHost; RTC_DATA_ATTR byte countOta = 0; +// RTC_DATA_ATTR wakPinSet=LOW; float TempAv, HumAv, Eco2Av, TvocAv; unsigned int BaselineTvoc = 0; @@ -232,33 +238,26 @@ int setMqttServer(const char *mqttHostNameF, unsigned int mqttPortF) //Настройки void setup() { - Serial.begin(115200); - Serial.setDebugOutput(true); - M5.begin(true, false, true); - Wire.begin(25, 21); //Пины для I2c на ATOM pinMode(GPIO_WAK, OUTPUT); //Пин датчика для работы - digitalWrite(GPIO_WAK, LOW); + digitalWrite(GPIO_WAK, LOW); + delay(10); + + Serial.begin(115200); + Serial.setDebugOutput(true); + + M5.begin(true, false, true); + Wire.begin(25, 21); //Пины для I2c на ATOM pinMode(TRIGGER_PIN, INPUT); hdc1080.begin(0x40); hdc1080.setResolution(HDC1080_RESOLUTION_11BIT, HDC1080_RESOLUTION_11BIT); - for (int t = 0; t <= cntWhile; t++) - { - if (ccs.begin()) - { - break; - } - ledset(1, false); - } + startCcs811(macc); - //ccs.setTempOffset(8.6); - //ccs.setBaseline(25725); - - WiFi.mode(WIFI_STA); + WiFi.mode(WIFI_STA); topicTemp.toCharArray(bufTopic, topicTemp.length() + 1); willTopicTemp.toCharArray(bufWillTopic, willTopicTemp.length() + 1); @@ -430,6 +429,65 @@ String getMacAddress() return String(baseMacChr); } +int startCcs811(String MacThat) +{ + + unsigned int coefBaseline = 0; + + ccs811.set_i2cdelay(50); + bool ok = ccs811.begin(); + if (!ok) + { + Serial.println("setup: CCS811 begin FAILED"); + return 1; + } + Serial.print("setup: hardware version: "); + Serial.println(ccs811.hardware_version(), HEX); + Serial.print("setup: bootloader version: "); + Serial.println(ccs811.bootloader_version(), HEX); + Serial.print("setup: application version: "); + Serial.println(ccs811.application_version(), HEX); + + ok = ccs811.start(CCS811_MODE_1SEC); + if (!ok) + { + Serial.println("setup: CCS811 start FAILED"); + return 2; + } + + if (MacThat == "24A1605423AC") + { + coefBaseline = 25725; + } + + if (MacThat == "5002918A38CC") + { + coefBaseline = 29814; + } + + if (MacThat == "5002919F5450") + { + coefBaseline = 13431; + } + + if (MacThat == "24A160474D14") + { + coefBaseline = 21632; + } + + if (MacThat == "24A160542B80") + { + coefBaseline = 13440; + } + + if (coefBaseline != 0) + { + ccs811.set_baseline(coefBaseline); + } + + return 0; +} + int SetCallibrationCoeff(String MacThat) { @@ -476,11 +534,10 @@ int SetCallibrationCoeff(String MacThat) void reqSensorData() { float hdc1080Temp = 0, hdc1080Hum = 0; - int eco2 = 0, tvoc = 0; hdc1080Temp = hdc1080.readTemperature(); hdc1080Hum = hdc1080.readHumidity(); - delay(50); + delay(50); char outstr[6]; dtostrf(hdc1080Temp, 5, 2, outstr); TempAv = atof(outstr); @@ -488,55 +545,65 @@ void reqSensorData() HumAv = atof(outstr); int counAvail = 0; - byte countRead = 0; ledset(4, false); bool ccsflag = true; + uint16_t eco2N, etvocN, errstat, raw, baseline; - while (ccsflag) + while (ccsflag) { - if (ccs.available()) - { - ccs.setEnvironmentalData(hdc1080Hum - 55, hdc1080Temp - 25); + delay(1100); + ccs811.read(&eco2N, &etvocN, &errstat, &raw); + ccs811.get_baseline(&baseline); - if (ccs.readData() == 0) - { - countRead++; - if (countRead >= 7) - { - ccsflag = false; - Serial.println(counAvail); - } - delay(1050); - } - else - { - Serial.println("=======ECO TVOC NONE READ"); - } + // Print measurement results based on status + if (errstat == CCS811_ERRSTAT_OK) + { + Serial.print("CCS811: "); + Serial.print("eco2="); + Serial.print(eco2N); + Serial.print(" ppm "); + Serial.print("etvoc="); + Serial.print(etvocN); + Serial.print(" ppb "); + + Serial.print(" baseline= "); + Serial.print(baseline); + + //Serial.print("raw6="); Serial.print(raw/1024); Serial.print(" uA "); + //Serial.print("raw10="); Serial.print(raw%1024); Serial.print(" ADC "); + //Serial.print("R="); Serial.print((1650*1000L/1023)*(raw%1024)/(raw/1024)); Serial.print(" ohm"); + Serial.println(); + } + else if (errstat == CCS811_ERRSTAT_OK_NODATA) + { + Serial.println("CCS811: waiting for (new) data"); + } + else if (errstat & CCS811_ERRSTAT_I2CFAIL) + { + Serial.println("CCS811: I2C error"); + } + else + { + Serial.print("CCS811: errstat="); + Serial.print(errstat, HEX); + Serial.print("="); + Serial.println(ccs811.errstat_str(errstat)); } counAvail++; - if (counAvail >= 6000) + if (counAvail >= 10) { ccsflag = false; } } - Serial.print("counAvail: "); - Serial.println(counAvail); - ledset(2, false); - Eco2Av = ccs.geteCO2(); - TvocAv = ccs.getTVOC(); - BaselineTvoc = ccs.getBaseline(); + Eco2Av = eco2N; + TvocAv = etvocN; + BaselineTvoc = baseline; - Serial.print(eco2); - Serial.print(" "); - Serial.print(tvoc); - Serial.print(" "); - Serial.println(BaselineTvoc); - rssi = WiFi.RSSI(); } @@ -615,7 +682,7 @@ int SendMqttReq(bool sendVal = true, bool sendStatus = true, byte statusConn = 1 doc["rssi"] = rssi; doc["bsid"] = WiFi.BSSIDstr(); doc["ts"] = timeNow; - doc["tsexp"] = timeNow + 60 + 11; + doc["exp"] = timeNow + 60 + 17; doc["sv"] = VersionSW; JsonData = ""; @@ -710,6 +777,7 @@ void loop() } countOta++; + startCcs811(macc); goToSleep(); } diff --git a/M5Atom_airqa.ino.m5stick_c.bin b/M5Atom_airqa.ino.m5stick_c.bin new file mode 100644 index 0000000..28832ed Binary files /dev/null and b/M5Atom_airqa.ino.m5stick_c.bin differ diff --git a/ccs811.h b/ccs811.h index a26e1f0..68cd921 100644 --- a/ccs811.h +++ b/ccs811.h @@ -19,7 +19,7 @@ // If you do not want that, make the PRINT macros in ccs811.cpp empty. -#include +#include // Version of this CCS811 driver