mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
Добавляем AHTxx
This commit is contained in:
115
src/modules/sensors/AhtXX/AhtXX.cpp
Normal file
115
src/modules/sensors/AhtXX/AhtXX.cpp
Normal file
@@ -0,0 +1,115 @@
|
||||
#include "Global.h"
|
||||
#include "classes/IoTItem.h"
|
||||
|
||||
#include <AHTxx.h>
|
||||
#include <map>
|
||||
|
||||
|
||||
std::map<String, AHTxx*> 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;
|
||||
}
|
||||
61
src/modules/sensors/AhtXX/modinfo.json
Normal file
61
src/modules/sensors/AhtXX/modinfo.json
Normal file
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user