From a4ae02736cda0cd314f01bf9dbb6760bb5a17b2a Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Mon, 4 Jan 2021 01:49:57 +0100 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D1=81=D0=BE=D1=80=20ccs811?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/items/vSensorCcs811.h | 39 +++++++++++++++ platformio.ini | 1 + src/items/vSensorCcs811.cpp | 89 +++++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 include/items/vSensorCcs811.h create mode 100644 src/items/vSensorCcs811.cpp diff --git a/include/items/vSensorCcs811.h b/include/items/vSensorCcs811.h new file mode 100644 index 00000000..a6ce5c41 --- /dev/null +++ b/include/items/vSensorCcs811.h @@ -0,0 +1,39 @@ +#pragma once +#include + +#include "Adafruit_CCS811.h" +#include "Global.h" +#include "GyverFilters.h" + +class SensorCcs811; + +typedef std::vector MySensorCcs811Vector; + +struct paramsCcs811 { + String key; + String addr; + unsigned long interval; + float c; +}; + +class SensorCcs811 { + public: + SensorCcs811(const paramsCcs811& paramsCo2, const paramsCcs811& paramsPpm); + ~SensorCcs811(); + + Adafruit_CCS811* ccs811; + + void loop(); + void read(); + + private: + paramsCcs811 _paramsCo2; + paramsCcs811 _paramsPpm; + + unsigned long prevMillis; + unsigned long difference; +}; + +extern MySensorCcs811Vector* mySensorCcs811; + +extern void ccs811Sensor(); \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 7af0d773..bb600258 100644 --- a/platformio.ini +++ b/platformio.ini @@ -22,6 +22,7 @@ lib_deps_external = beegee-tokyo/DHT sensor library for ESPx adafruit/Adafruit BMP280 Library adafruit/Adafruit BME280 Library + adafruit/Adafruit CCS811 Library milesburton/DallasTemperature lib_deps_internal = ESP Async WebServer diff --git a/src/items/vSensorCcs811.cpp b/src/items/vSensorCcs811.cpp new file mode 100644 index 00000000..07c3bed6 --- /dev/null +++ b/src/items/vSensorCcs811.cpp @@ -0,0 +1,89 @@ +#include "items/vSensorCcs811.h" + +#include + +#include "BufferExecute.h" +#include "Class/LineParsing.h" +#include "Global.h" + +SensorCcs811::SensorCcs811(const paramsCcs811& paramsCo2, const paramsCcs811& paramsPpm) { + _paramsCo2 = paramsCcs811(paramsCo2); + _paramsPpm = paramsCcs811(paramsPpm); + + ccs811 = new Adafruit_CCS811(); + + if (!ccs811->begin()) SerialPrint("E", "Sensor CCS", "Wire not connected"); +} + +SensorCcs811::~SensorCcs811() {} + +void SensorCcs811::loop() { + difference = millis() - prevMillis; + if (difference >= _paramsPpm.interval) { + prevMillis = millis(); + read(); + } +} + +void SensorCcs811::read() { + float co2; + float ppm; + if (ccs811->available()) { + if (!ccs811->readData()) { + co2 = ccs811->geteCO2(); + ppm = ccs811->getTVOC(); + + co2 = co2 * _paramsCo2.c; + ppm = ppm * _paramsPpm.c; + + eventGen2(_paramsCo2.key, String(co2)); + jsonWriteStr(configLiveJson, _paramsCo2.key, String(co2)); + publishStatus(_paramsCo2.key, String(co2)); + SerialPrint("I", "Sensor", "'" + _paramsCo2.key + "' data: " + String(co2)); + + eventGen2(_paramsPpm.key, String(ppm)); + jsonWriteStr(configLiveJson, _paramsPpm.key, String(ppm)); + publishStatus(_paramsPpm.key, String(ppm)); + SerialPrint("I", "Sensor", "'" + _paramsPpm.key + "' data: " + String(ppm)); + } else { + SerialPrint("E", "Sensor CCS", "Error"); + } + } +} + +MySensorCcs811Vector* mySensorCcs811 = nullptr; + +void ccs811Sensor() { + myLineParsing.update(); + String key = myLineParsing.gkey(); + String addr = myLineParsing.gaddr(); + String interval = myLineParsing.gint(); + String c = myLineParsing.gc(); + myLineParsing.clear(); + + static int enterCnt = -1; + enterCnt++; + + static paramsCcs811 paramsCo2; + static paramsCcs811 paramsPpm; + + if (enterCnt == 0) { + paramsCo2.key = key; + paramsCo2.interval = interval.toInt() * 1000; + paramsCo2.c = c.toFloat(); + } + + if (enterCnt == 1) { + paramsPpm.key = key; + paramsPpm.addr = addr; + paramsPpm.interval = interval.toInt() * 1000; + paramsPpm.c = c.toFloat(); + + static bool firstTime = true; + if (firstTime) mySensorCcs811 = new MySensorCcs811Vector(); + firstTime = false; + mySensorCcs811->push_back(SensorCcs811(paramsCo2, paramsPpm)); + + enterCnt = -1; + } +}