diff --git a/src/modules/sensors/Bme280/Bme280.cpp b/src/modules/sensors/Bme280/Bme280.cpp index 071525c4..73c0d8b7 100644 --- a/src/modules/sensors/Bme280/Bme280.cpp +++ b/src/modules/sensors/Bme280/Bme280.cpp @@ -10,18 +10,21 @@ #include #include -std::map bmes; +std::map bmes; -class Bme280t : public IoTItem { - private: - Adafruit_BME280* _bme; +class Bme280t : public IoTItem +{ +private: + Adafruit_BME280 *_bme; - public: - Bme280t(Adafruit_BME280* bme, String parameters) : IoTItem(parameters) { +public: + Bme280t(Adafruit_BME280 *bme, String parameters) : IoTItem(parameters) + { _bme = bme; } - void doByInterval() { + void doByInterval() + { value.valD = _bme->readTemperature(); if (value.valD != NAN && value.valD < 145) regEvent(value.valD, "Bme280t"); @@ -32,16 +35,19 @@ class Bme280t : public IoTItem { ~Bme280t(){}; }; -class Bme280h : public IoTItem { - private: - Adafruit_BME280* _bme; +class Bme280h : public IoTItem +{ +private: + Adafruit_BME280 *_bme; - public: - Bme280h(Adafruit_BME280* bme, String parameters) : IoTItem(parameters) { +public: + Bme280h(Adafruit_BME280 *bme, String parameters) : IoTItem(parameters) + { _bme = bme; } - void doByInterval() { + void doByInterval() + { value.valD = _bme->readHumidity(); if (value.valD != NAN && value.valD < 100) regEvent(value.valD, "Bme280h"); @@ -52,49 +58,96 @@ class Bme280h : public IoTItem { ~Bme280h(){}; }; -class Bme280p : public IoTItem { - private: - Adafruit_BME280* _bme; +class Bme280p : public IoTItem +{ +private: + Adafruit_BME280 *_bme; - public: - Bme280p(Adafruit_BME280* bme, String parameters) : IoTItem(parameters) { +public: + Bme280p(Adafruit_BME280 *bme, String parameters) : IoTItem(parameters) + { _bme = bme; } - void doByInterval() { + void doByInterval() + { value.valD = _bme->readPressure(); - if (value.valD != NAN && value.valD > 0) { + if (value.valD != NAN && value.valD > 0) + { value.valD = value.valD / 1.333224 / 100; regEvent(value.valD, "Bme280p"); - } else + } + else SerialPrint("E", "Sensor Bme280p", "Error", _id); } ~Bme280p(){}; }; -void* getAPI_Bme280(String subtype, String param) { - if (subtype == F("Bme280t") || subtype == F("Bme280h") || subtype == F("Bme280p")) { +class Bme280dp : public IoTItem +{ +private: + Adafruit_BME280 *_bme; + +public: + Bme280dp(Adafruit_BME280 *bme, String parameters) : IoTItem(parameters) + { + _bme = bme; + } + + void doByInterval() + { + + float humi = _bme->readHumidity(); + float temp = _bme->readTemperature(); + + if (temp != NAN && temp < 145 && humi != NAN && humi > 0 && humi < 100) + { + value.valD = (temp - (14.55 + 0.114 * temp) * (1 - (0.01 * humi)) - pow(((2.5 + 0.007 * temp) * (1 - (0.01 * humi))), 3) - (15.9 + 0.117 * temp) * pow((1 - (0.01 * humi)), 14)); + regEvent(value.valD, "Bme280dp"); + } + else + SerialPrint("E", "Sensor Bme280dp", "Error", _id); + } + + ~Bme280dp(){}; +}; + +void *getAPI_Bme280(String subtype, String param) +{ + if (subtype == F("Bme280t") || subtype == F("Bme280h") || subtype == F("Bme280p") || subtype == F("Bme280dp")) + { String addr; jsonRead(param, "addr", addr); - if (addr == "") { + if (addr == "") + { scanI2C(); return nullptr; } - - if (bmes.find(addr) == bmes.end()) { + + if (bmes.find(addr) == bmes.end()) + { bmes[addr] = new Adafruit_BME280(); bmes[addr]->begin(hexStringToUint8(addr)); } - - if (subtype == F("Bme280t")) { + + if (subtype == F("Bme280t")) + { return new Bme280t(bmes[addr], param); - } else if (subtype == F("Bme280h")) { + } + else if (subtype == F("Bme280h")) + { return new Bme280h(bmes[addr], param); - } else if (subtype == F("Bme280p")) { + } + else if (subtype == F("Bme280p")) + { return new Bme280p(bmes[addr], param); } + else if (subtype == F("Bme280dp")) + { + return new Bme280dp(bmes[addr], param); + } } - + return nullptr; } diff --git a/src/modules/sensors/Bme280/modinfo.json b/src/modules/sensors/Bme280/modinfo.json index ca6dd652..965551f7 100644 --- a/src/modules/sensors/Bme280/modinfo.json +++ b/src/modules/sensors/Bme280/modinfo.json @@ -6,7 +6,7 @@ "name": "BME280 Температура", "type": "Reading", "subtype": "Bme280t", - "id": "tmp3", + "id": "Tmp3", "widget": "anydataTmp", "page": "Сенсоры", "descr": "Температура", @@ -39,6 +39,19 @@ "int": 15, "addr": "0x77", "round": 1 + }, + { + "global": 0, + "name": "BME280 Tочка росы", + "type": "Reading", + "subtype": "Bme280dp", + "id": "Dew3", + "widget": "anydataTmp", + "page": "Сенсоры", + "descr": "Точка росы", + "int": 15, + "addr": "0x77", + "round": 1 } ], "about": { @@ -55,12 +68,13 @@ "subTypes": [ "Bme280t", "Bme280p", - "Bme280h" + "Bme280h", + "Bme280dp" ], - "title": "Сенсор температуры, давления и влажности с Bme280", - "moduleDesc": "Позволяет получить значения температуры, давления и влажности с Bme280.", + "title": "Сенсор температуры, давления, влажности и точки росы с Bme280", + "moduleDesc": "Позволяет получить значения температуры, давления, влажности и точки росы с Bme280.", "propInfo": { - "addr": "Адрес датчика на шине, обычно 0x77.", + "addr": "Адрес датчика на шине, обычно 0x77. Для стабильности надо пин SDO притянуть к 3.3В. Если пин SDO притянуть к GND то адрес будет 0х76", "int": "Количество секунд между опросами датчика." } }, @@ -71,18 +85,6 @@ ], "esp8266_4mb": [ "adafruit/Adafruit BME280 Library" - ], - "esp8266_1mb": [ - "adafruit/Adafruit BME280 Library" - ], - "esp8266_1mb_ota": [ - "adafruit/Adafruit BME280 Library" - ], - "esp8285_1mb": [ - "adafruit/Adafruit BME280 Library" - ], - "esp8285_1mb_ota": [ - "adafruit/Adafruit BME280 Library" ] } } \ No newline at end of file