From 4cc46a777ab6c5ff18a3a1a269fb2ecf48578815 Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:39:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20AHTxx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/AhtXX/AhtXX.cpp | 115 +++++++++++++++++++++++++ src/modules/sensors/AhtXX/modinfo.json | 61 +++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 src/modules/sensors/AhtXX/AhtXX.cpp create mode 100644 src/modules/sensors/AhtXX/modinfo.json diff --git a/src/modules/sensors/AhtXX/AhtXX.cpp b/src/modules/sensors/AhtXX/AhtXX.cpp new file mode 100644 index 00000000..f32487bf --- /dev/null +++ b/src/modules/sensors/AhtXX/AhtXX.cpp @@ -0,0 +1,115 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +#include +#include + + +std::map ahts; + +void printStatus(AHTxx *aht) { + switch (aht->getStatus()) { + case AHTXX_NO_ERROR: + Serial.println(F("no error")); + break; + + case AHTXX_BUSY_ERROR: + Serial.println(F("sensor AHT busy, increase polling time")); + break; + + case AHTXX_ACK_ERROR: + Serial.println(F("sensor AHT didn't return ACK, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)")); + break; + + case AHTXX_DATA_ERROR: + Serial.println(F(" AHT: received data smaller than expected, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)")); + break; + + case AHTXX_CRC8_ERROR: + Serial.println(F("AHT: computed CRC8 not match received CRC8, this feature supported only by AHT2x sensors")); + break; + + default: + Serial.println(F("AHT: unknown status")); + break; + } +} + +class AhtXXt : public IoTItem { + private: + AHTxx *_aht = nullptr; + + public: + AhtXXt(AHTxx* aht, String parameters) : IoTItem(parameters) { + _aht = aht; + } + + void doByInterval() { + value.valD = _aht->readTemperature(); + if (value.valD != AHTXX_ERROR) { + regEvent(value.valD, "AhtXXt"); + } else { + printStatus(_aht); //print temperature command status + } + } + + ~AhtXXt(){}; +}; + +class AhtXXh : public IoTItem { + private: + AHTxx *_aht = nullptr; + + public: + AhtXXh(AHTxx* aht, String parameters) : IoTItem(parameters) { + _aht = aht; + } + + void doByInterval() { + value.valD = _aht->readHumidity(); + if (value.valD != AHTXX_ERROR) { + regEvent(value.valD, "AhtXXh"); + } else { + printStatus(_aht); //print temperature command status + } + } + + ~AhtXXh(){}; +}; + +void* getAPI_AhtXX(String subtype, String param) { + if (subtype == F("AhtXXt") || subtype == F("AhtXXh")) { + String addr; + jsonRead(param, "addr", addr); + if (addr == "") { + scanI2C(); + return nullptr; + } + + if (ahts.find(addr) == ahts.end()) { + int shtType; + jsonRead(param, "type", shtType); + + ahts[addr] = new AHTxx(hexStringToUint8(addr), (AHTXX_I2C_SENSOR)shtType); + + int pinSCL, pinSDA, i2cFreq; + jsonRead(settingsFlashJson, "pinSCL", pinSCL, false); + jsonRead(settingsFlashJson, "pinSDA", pinSDA, false); + jsonRead(settingsFlashJson, "i2cFreq", i2cFreq, false); + if (!pinSCL || !pinSDA || !i2cFreq) { + pinSCL = SCL; + pinSDA = SDA; + i2cFreq = 100000; + } + ahts[addr]->begin(pinSDA, pinSCL, i2cFreq); + } + + if (subtype == F("AhtXXt")) { + return new AhtXXt(ahts[addr], param); + } else if (subtype == F("AhtXXh")) { + return new AhtXXh(ahts[addr], param); + } + } + + return nullptr; +} diff --git a/src/modules/sensors/AhtXX/modinfo.json b/src/modules/sensors/AhtXX/modinfo.json new file mode 100644 index 00000000..e37c1813 --- /dev/null +++ b/src/modules/sensors/AhtXX/modinfo.json @@ -0,0 +1,61 @@ +{ + "menuSection": "Сенсоры", + "configItem": [ + { + "name": "AHTXX Температура", + "type": "Reading", + "subtype": "AhtXXt", + "id": "Temp20", + "widget": "anydataTmp", + "page": "Сенсоры", + "descr": "AHTXX Температура", + "int": 15, + "addr": "0x38", + "shtType":1, + "round": 1 + }, + { + "name": "AHTXX Влажность", + "type": "Reading", + "subtype": "AhtXXh", + "id": "Hum20", + "widget": "anydataHum", + "page": "Сенсоры", + "descr": "AHTXX Влажность", + "int": 15, + "addr": "0x38", + "shtType":1, + "round": 1 + } + ], + "about": { + "authorName": "Ilya Belyakov", + "authorContact": "https://t.me/Biveraxe", + "authorGit": "https://github.com/biveraxe", + "specialThanks": "Sergey @Serghei63, @avaks_dev", + "moduleName": "AhtXX", + "moduleVersion": "1.0", + "usedRam": 15, + "subTypes": [ + "AhtXXt", + "AhtXXh" + ], + "title": "Сенсор температуры и влажности AHTXX", + "moduleDesc": "Позволяет получить температуру и влажность с AhtXX.", + "propInfo": { + "pin": "GPIO номер, к которому подключен датчик.", + "addr": "Адрес датчика на шине, обычно 0x38.", + "int": "Количество секунд между опросами датчика.", + "shtType": "Модель датчика. 0 - AHT1x, 1 - AHT2x" + } + }, + "defActive": true, + "devices": { + "esp32_4mb": [ + "https://github.com/enjoyneering/AHTxx.git" + ], + "esp8266_4mb": [ + "https://github.com/enjoyneering/AHTxx.git" + ] + } +} \ No newline at end of file