Merge pull request #205 from biveraxe/ver4dev

Корректируем модули датчиков
This commit is contained in:
2022-10-05 21:09:16 +03:00
committed by GitHub
16 changed files with 303 additions and 217 deletions

View File

@@ -19,6 +19,7 @@ import configparser
import os, json, sys, getopt import os, json, sys, getopt
from pathlib import Path from pathlib import Path
config = configparser.ConfigParser() # создаём объекта парсера INI config = configparser.ConfigParser() # создаём объекта парсера INI
def printHelp(): def printHelp():
@@ -31,10 +32,10 @@ def printHelp():
def updateModulesInProfile(profJson): def updateModulesInProfile(profJson):
profJson["modules"] = {} profJson["modules"] = {}
for root,d_names,f_names in os.walk("src\\modules"): for root,d_names,f_names in os.walk("src/modules"):
for fname in f_names: for fname in f_names:
if fname == "modinfo.json": if fname == "modinfo.json":
with open(root + "\\" + fname, "r", encoding='utf-8') as read_file: with open(os.path.join(root, fname), "r", encoding='utf-8') as read_file:
modinfoJson = json.load(read_file) modinfoJson = json.load(read_file)
# проверяем есть ли уже узловой элемент и если нет, то создаем # проверяем есть ли уже узловой элемент и если нет, то создаем
if not modinfoJson['menuSection'] in profJson["modules"]: if not modinfoJson['menuSection'] in profJson["modules"]:
@@ -43,7 +44,7 @@ def updateModulesInProfile(profJson):
profJson["modules"] = listFromFirstElement profJson["modules"] = listFromFirstElement
# добавляем информацию о модуле в узловой элемент # добавляем информацию о модуле в узловой элемент
profJson["modules"][modinfoJson['menuSection']].append({ profJson["modules"][modinfoJson['menuSection']].append({
'path': root, 'path': os.path.normpath(root).replace("\\", "/"),
'active': modinfoJson['defActive'] 'active': modinfoJson['defActive']
}) })
@@ -132,11 +133,11 @@ for section, modules in profJson['modules'].items():
itemsJson.append({"header": section}) itemsJson.append({"header": section})
for module in modules: for module in modules:
if module['active']: if module['active']:
with open(module['path'] + "\\modinfo.json", "r", encoding='utf-8') as read_file: with open(module['path'] + "/modinfo.json", "r", encoding='utf-8') as read_file:
moduleJson = json.load(read_file) moduleJson = json.load(read_file)
if deviceName in moduleJson['devices']: # проверяем поддерживает ли модуль текущее устройство if deviceName in moduleJson['devices']: # проверяем поддерживает ли модуль текущее устройство
activeModulesName.append(moduleJson['about']['moduleName']) # запоминаем имена для использования на след шагах activeModulesName.append(moduleJson['about']['moduleName']) # запоминаем имена для использования на след шагах
includeDirs = includeDirs + "\n+<" + module['path'].replace("src\\", "") + ">" # запоминаем пути к модулям для компиляции includeDirs = includeDirs + "\n+<" + module['path'].replace("src/", "") + ">" # запоминаем пути к модулям для компиляции
for libPath in moduleJson['devices'][deviceName]: # запоминаем библиотеки необходимые модулю для текущей платы for libPath in moduleJson['devices'][deviceName]: # запоминаем библиотеки необходимые модулю для текущей платы
allLibs = allLibs + "\n" + libPath allLibs = allLibs + "\n" + libPath
for configItemsJson in moduleJson['configItem']: for configItemsJson in moduleJson['configItem']:
@@ -183,11 +184,19 @@ config["platformio"]["data_dir"] = profJson['projectProp']['platformio']['data_d
with open("platformio.ini", 'w') as configFile: with open("platformio.ini", 'w') as configFile:
config.write(configFile) config.write(configFile)
import ctypes # An included library with Python install.
# import ctypes # An included library with Python install.
# if update:
# ctypes.windll.user32.MessageBoxW(0, "Модули профиля " + profile + " обновлены, а сам профиль применен, можно запускать компиляцию и прошивку.", "Операция завершена.", 0)
# else:
# ctypes.windll.user32.MessageBoxW(0, "Профиль " + profile + " применен, можно запускать компиляцию и прошивку.", "Операция завершена.", 0)
if update: if update:
ctypes.windll.user32.MessageBoxW(0, "Модули профиля " + profile + " обновлены, а сам профиль применен, можно запускать компиляцию и прошивку.", "Операция завершена.", 0) print(f"\x1b[1;31;42m Модули профиля " + profile + " обновлены, а сам профиль применен, можно запускать компиляцию и прошивку.\x1b[0m")
else: else:
ctypes.windll.user32.MessageBoxW(0, "Профиль " + profile + " применен, можно запускать компиляцию и прошивку.", "Операция завершена.", 0) print(f"\x1b[1;31;42m Профиль ", profile, " применен, можно запускать компиляцию и прошивку.\x1b[0m")
# print(f"\x1b[1;32;41m Операция завершена. \x1b[0m")

View File

@@ -125,28 +125,30 @@
"num": 9 "num": 9
}, },
{ {
"name": "10. AHT20 Температура", "name": "10. AHTXX Температура",
"type": "Reading", "type": "Reading",
"subtype": "Aht20t", "subtype": "AhtXXt",
"id": "Temp20", "id": "Temp20",
"widget": "anydataTmp", "widget": "anydataTmp",
"page": "Сенсоры", "page": "Сенсоры",
"descr": "AHT20 Температура", "descr": "AHTXX Температура",
"int": 15, "int": 15,
"addr": "0x38", "addr": "0x38",
"shtType": 1,
"round": 1, "round": 1,
"num": 10 "num": 10
}, },
{ {
"name": "11. AHT20 Влажность", "name": "11. AHTXX Влажность",
"type": "Reading", "type": "Reading",
"subtype": "Aht20h", "subtype": "AhtXXh",
"id": "Hum20", "id": "Hum20",
"widget": "anydataHum", "widget": "anydataHum",
"page": "Сенсоры", "page": "Сенсоры",
"descr": "AHT20 Влажность", "descr": "AHTXX Влажность",
"int": 15, "int": 15,
"addr": "0x38", "addr": "0x38",
"shtType": 1,
"round": 1, "round": 1,
"num": 11 "num": 11
}, },
@@ -554,7 +556,20 @@
"num": 42 "num": 42
}, },
{ {
"name": "43. PWM ESP8266", "name": "43. Расширитель портов Pcf8574",
"type": "Reading",
"subtype": "Pcf8574",
"id": "Pcf",
"widget": "",
"page": "",
"descr": "",
"int": "0",
"addr": "0x20",
"index": 1,
"num": 43
},
{
"name": "44. PWM ESP8266",
"type": "Writing", "type": "Writing",
"subtype": "Pwm8266", "subtype": "Pwm8266",
"id": "pwm", "id": "pwm",
@@ -566,10 +581,10 @@
"freq": 5000, "freq": 5000,
"val": 0, "val": 0,
"apin": -1, "apin": -1,
"num": 43 "num": 44
}, },
{ {
"name": "44. Телеграм-Лайт", "name": "45. Телеграм-Лайт",
"type": "Writing", "type": "Writing",
"subtype": "TelegramLT", "subtype": "TelegramLT",
"id": "tg", "id": "tg",
@@ -578,13 +593,13 @@
"descr": "", "descr": "",
"token": "", "token": "",
"chatID": "", "chatID": "",
"num": 44 "num": 45
}, },
{ {
"header": "Экраны" "header": "Экраны"
}, },
{ {
"name": "45. LCD экран 2004", "name": "46. LCD экран 2004",
"type": "Reading", "type": "Reading",
"subtype": "Lcd2004", "subtype": "Lcd2004",
"id": "Lcd", "id": "Lcd",
@@ -596,10 +611,10 @@
"size": "20,4", "size": "20,4",
"coord": "0,0", "coord": "0,0",
"id2show": "id датчика", "id2show": "id датчика",
"num": 45 "num": 46
}, },
{ {
"name": "46. LCD экран 1602", "name": "47. LCD экран 1602",
"type": "Reading", "type": "Reading",
"subtype": "Lcd2004", "subtype": "Lcd2004",
"id": "Lcd", "id": "Lcd",
@@ -611,6 +626,6 @@
"size": "16,2", "size": "16,2",
"coord": "0,0", "coord": "0,0",
"id2show": "id датчика", "id2show": "id датчика",
"num": 46 "num": 47
} }
] ]

View File

@@ -2,7 +2,7 @@
#include "Global.h" #include "Global.h"
#ifdef ESP32 #ifdef ESP32
#if USE_LITTLEFS #if USE_LITTLEFS
#include <LITTLEFS.h> #include <LittleFS.h>
#define FileFS LittleFS #define FileFS LittleFS
#define FS_NAME "LittleFS_32" #define FS_NAME "LittleFS_32"
#define CONFIG_LITTLEFS_SPIFFS_COMPAT 1 #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1

View File

@@ -140,3 +140,5 @@ extern bool _time_isTrust;
// extern DynamicJsonDocument settingsFlashJsonDoc; // extern DynamicJsonDocument settingsFlashJsonDoc;
// extern DynamicJsonDocument paramsFlashJsonDoc; // extern DynamicJsonDocument paramsFlashJsonDoc;
// extern DynamicJsonDocument paramsHeapJsonDoc; // extern DynamicJsonDocument paramsHeapJsonDoc;
void scanI2C();

View File

@@ -9,7 +9,7 @@ board = nodemcuv2
board_build.ldscript = eagle.flash.4m1m.ld board_build.ldscript = eagle.flash.4m1m.ld
platform = espressif8266 @4.0.1 platform = espressif8266 @4.0.1
monitor_filters = esp8266_exception_decoder monitor_filters = esp8266_exception_decoder
upload_speed = 921600 upload_speed = 115200
monitor_speed = 115200 monitor_speed = 115200
board_build.filesystem = littlefs board_build.filesystem = littlefs
build_src_filter = build_src_filter =
@@ -29,7 +29,7 @@ framework = arduino
board = esp32dev board = esp32dev
platform = espressif32 @5.1.1 platform = espressif32 @5.1.1
monitor_filters = esp32_exception_decoder monitor_filters = esp32_exception_decoder
upload_speed = 921600 upload_speed = 115200
monitor_speed = 115200 monitor_speed = 115200
debug_tool = esp-prog debug_tool = esp-prog
board_build.filesystem = littlefs board_build.filesystem = littlefs
@@ -53,7 +53,7 @@ lib_deps_external =
[env:esp8266_4mb_fromitems] [env:esp8266_4mb_fromitems]
lib_deps = lib_deps =
Adafruit AHTX0 https://github.com/enjoyneering/AHTxx.git
adafruit/Adafruit BME280 Library adafruit/Adafruit BME280 Library
adafruit/Adafruit BMP280 Library adafruit/Adafruit BMP280 Library
beegee-tokyo/DHT sensor library for ESPx beegee-tokyo/DHT sensor library for ESPx
@@ -69,37 +69,39 @@ lib_deps =
adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 adafruit/Adafruit MCP23017 Arduino Library@^2.1.0
adafruit/Adafruit BusIO @ ^1.13.2 adafruit/Adafruit BusIO @ ^1.13.2
dfrobot/DFRobotDFPlayerMini @ ^1.0.5 dfrobot/DFRobotDFPlayerMini @ ^1.0.5
adafruit/Adafruit BusIO @ ^1.13.2
marcoschwartz/LiquidCrystal_I2C@^1.1.4 marcoschwartz/LiquidCrystal_I2C@^1.1.4
build_src_filter = build_src_filter =
+<modules\virtual\Loging> +<modules/virtual/Loging>
+<modules\virtual\LogingDaily> +<modules/virtual/LogingDaily>
+<modules\virtual\Timer> +<modules/virtual/Timer>
+<modules\virtual\Variable> +<modules/virtual/Variable>
+<modules\virtual\VButton> +<modules/virtual/VButton>
+<modules\sensors\Acs712> +<modules/sensors/Acs712>
+<modules\sensors\Aht20> +<modules/sensors/AhtXX>
+<modules\sensors\AnalogAdc> +<modules/sensors/AnalogAdc>
+<modules\sensors\Bme280> +<modules/sensors/Bme280>
+<modules\sensors\Bmp280> +<modules/sensors/Bmp280>
+<modules\sensors\Dht1122> +<modules/sensors/Dht1122>
+<modules\sensors\Ds18b20> +<modules/sensors/Ds18b20>
+<modules\sensors\GY21> +<modules/sensors/GY21>
+<modules\sensors\Hdc1080> +<modules/sensors/Hdc1080>
+<modules\sensors\Max6675> +<modules/sensors/Max6675>
+<modules\sensors\Pzem004t> +<modules/sensors/Pzem004t>
+<modules\sensors\RCswitch> +<modules/sensors/RCswitch>
+<modules\sensors\Sht20> +<modules/sensors/Sht20>
+<modules\sensors\Sht30> +<modules/sensors/Sht30>
+<modules\sensors\Sonar> +<modules/sensors/Sonar>
+<modules\sensors\UART> +<modules/sensors/UART>
+<modules\exec\ButtonIn> +<modules/exec/ButtonIn>
+<modules\exec\ButtonOut> +<modules/exec/ButtonOut>
+<modules\exec\IoTServo> +<modules/exec/IoTServo>
+<modules\exec\Mcp23017> +<modules/exec/Mcp23017>
+<modules\exec\Mp3> +<modules/exec/Mp3>
+<modules\exec\Pwm8266> +<modules/exec/Pcf8574>
+<modules\exec\TelegramLT> +<modules/exec/Pwm8266>
+<modules\display\Lcd2004> +<modules/exec/TelegramLT>
+<modules/display/Lcd2004>
[env:esp32_4mb_fromitems] [env:esp32_4mb_fromitems]
lib_deps = lib_deps =

View File

@@ -1,7 +1,7 @@
#include "NTP.h" #include "NTP.h"
#include "Global.h" #include "Global.h"
#include "Utils\SerialPrint.h" #include "utils/SerialPrint.h"
void ntpInit() { void ntpInit() {
synchTime(); synchTime();

View File

@@ -6,7 +6,7 @@ void* getAPI_Timer(String subtype, String params);
void* getAPI_Variable(String subtype, String params); void* getAPI_Variable(String subtype, String params);
void* getAPI_VButton(String subtype, String params); void* getAPI_VButton(String subtype, String params);
void* getAPI_Acs712(String subtype, String params); void* getAPI_Acs712(String subtype, String params);
void* getAPI_Aht20(String subtype, String params); void* getAPI_AhtXX(String subtype, String params);
void* getAPI_AnalogAdc(String subtype, String params); void* getAPI_AnalogAdc(String subtype, String params);
void* getAPI_Bme280(String subtype, String params); void* getAPI_Bme280(String subtype, String params);
void* getAPI_Bmp280(String subtype, String params); void* getAPI_Bmp280(String subtype, String params);
@@ -26,6 +26,7 @@ void* getAPI_ButtonOut(String subtype, String params);
void* getAPI_IoTServo(String subtype, String params); void* getAPI_IoTServo(String subtype, String params);
void* getAPI_Mcp23017(String subtype, String params); void* getAPI_Mcp23017(String subtype, String params);
void* getAPI_Mp3(String subtype, String params); void* getAPI_Mp3(String subtype, String params);
void* getAPI_Pcf8574(String subtype, String params);
void* getAPI_Pwm8266(String subtype, String params); void* getAPI_Pwm8266(String subtype, String params);
void* getAPI_TelegramLT(String subtype, String params); void* getAPI_TelegramLT(String subtype, String params);
void* getAPI_Lcd2004(String subtype, String params); void* getAPI_Lcd2004(String subtype, String params);
@@ -38,7 +39,7 @@ if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Acs712(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Acs712(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Aht20(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_AhtXX(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Bme280(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Bme280(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Bmp280(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Bmp280(subtype, params)) != nullptr) return tmpAPI;
@@ -58,6 +59,7 @@ if ((tmpAPI = getAPI_ButtonOut(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_IoTServo(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_IoTServo(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;

View File

@@ -7,8 +7,6 @@
#define PCF8574_I2CADDR_DEFAULT 0x20 ///< DS3502 default I2C address #define PCF8574_I2CADDR_DEFAULT 0x20 ///< DS3502 default I2C address
void scanI2C();
class Adafruit_PCF8574_mod { class Adafruit_PCF8574_mod {
public: public:
Adafruit_PCF8574_mod() {}; Adafruit_PCF8574_mod() {};
@@ -82,7 +80,6 @@ class Pcf8574Driver : public IoTGpio {
int digitalRead(uint8_t pin) { int digitalRead(uint8_t pin) {
return _pcf.digitalRead(pin); return _pcf.digitalRead(pin);
//return 0;
} }
void digitalInvert(uint8_t pin) { void digitalInvert(uint8_t pin) {

View File

@@ -33,11 +33,9 @@
"devices": { "devices": {
"esp32_4mb": [ "esp32_4mb": [
"adafruit/Adafruit PCF8574@^1.0.0",
"adafruit/Adafruit BusIO @ ^1.13.2" "adafruit/Adafruit BusIO @ ^1.13.2"
], ],
"esp8266_4mb": [ "esp8266_4mb": [
"adafruit/Adafruit PCF8574@^1.0.0",
"adafruit/Adafruit BusIO @ ^1.13.2" "adafruit/Adafruit BusIO @ ^1.13.2"
] ]
} }

View File

@@ -1,61 +0,0 @@
/******************************************************************
Used Adafruit AHT20 Driver (temperature and humidity sensor)
Support for AHT20
https://github.com/adafruit/Adafruit_AHTX0
adapted for version 4 @Serghei63
******************************************************************/
#include "Global.h"
#include "classes/IoTItem.h"
#include "Adafruit_AHTX0.h"
#include <map>
// to do убрать глобальный экземпляр
Adafruit_AHTX0 aht;
sensors_event_t temp, humidity;
class Aht20t : public IoTItem {
public:
Aht20t(String parameters) : IoTItem(parameters) {}
void doByInterval() {
value.valD = temp.temperature;
if (value.valD != -200)
regEvent(value.valD, "Aht20t"); // TODO: найти способ понимания ошибки получения данных
else
SerialPrint("E", "Sensor AHTt", "Error");
}
~Aht20t(){};
};
class Aht20h : public IoTItem {
public:
Aht20h(String parameters) : IoTItem(parameters) {}
void doByInterval() {
value.valD = humidity.relative_humidity;
if (value.valD != -200)
regEvent(value.valD, "Aht20h"); // TODO: найти способ понимания ошибки получения данных
else
SerialPrint("E", "Sensor AHTt", "Error");
}
~Aht20h(){};
};
void* getAPI_Aht20(String subtype, String param) {
if (subtype == F("Aht20t")) {
aht.begin();
aht.getEvent(&humidity, &temp); // populate temp and humidity objects with fresh data
return new Aht20t(param);
} else if (subtype == F("Aht20h")) {
aht.begin();
aht.getEvent(&humidity, &temp); // populate temp and humidity objects with fresh data
return new Aht20h(param);
} else {
return nullptr;
}
}

View 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;
}

View File

@@ -2,57 +2,60 @@
"menuSection": "Сенсоры", "menuSection": "Сенсоры",
"configItem": [ "configItem": [
{ {
"name": "AHT20 Температура", "name": "AHTXX Температура",
"type": "Reading", "type": "Reading",
"subtype": "Aht20t", "subtype": "AhtXXt",
"id": "Temp20", "id": "Temp20",
"widget": "anydataTmp", "widget": "anydataTmp",
"page": "Сенсоры", "page": "Сенсоры",
"descr": "AHT20 Температура", "descr": "AHTXX Температура",
"int": 15, "int": 15,
"addr": "0x38", "addr": "0x38",
"shtType":1,
"round": 1 "round": 1
}, },
{ {
"name": "AHT20 Влажность", "name": "AHTXX Влажность",
"type": "Reading", "type": "Reading",
"subtype": "Aht20h", "subtype": "AhtXXh",
"id": "Hum20", "id": "Hum20",
"widget": "anydataHum", "widget": "anydataHum",
"page": "Сенсоры", "page": "Сенсоры",
"descr": "AHT20 Влажность", "descr": "AHTXX Влажность",
"int": 15, "int": 15,
"addr": "0x38", "addr": "0x38",
"shtType":1,
"round": 1 "round": 1
} }
], ],
"about": { "about": {
"authorName": "Serghei Crasnicov", "authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Serghei63", "authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/Serghei63", "authorGit": "https://github.com/biveraxe",
"specialThanks": "", "specialThanks": "Sergey @Serghei63, @avaks_dev",
"moduleName": "Aht20", "moduleName": "AhtXX",
"moduleVersion": "1.0", "moduleVersion": "1.0",
"usedRam": 15, "usedRam": 15,
"subTypes": [ "subTypes": [
"Aht20t", "AhtXXt",
"Aht20h" "AhtXXh"
], ],
"title": "Сенсор температуры и влажности AHT20", "title": "Сенсор температуры и влажности AHTXX",
"moduleDesc": "Позволяет получить температуру и влажность с Aht20.", "moduleDesc": "Позволяет получить температуру и влажность с AhtXX.",
"propInfo": { "propInfo": {
"pin": "GPIO номер, к которому подключен датчик.", "pin": "GPIO номер, к которому подключен датчик.",
"addr": "Адрес датчика на шине, обычно 0x38.", "addr": "Адрес датчика на шине, обычно 0x38.",
"int": "Количество секунд между опросами датчика." "int": "Количество секунд между опросами датчика.",
"shtType": "Модель датчика. 0 - AHT1x, 1 - AHT2x"
} }
}, },
"defActive": true, "defActive": true,
"devices": { "devices": {
"esp32_4mb": [ "esp32_4mb": [
"Adafruit AHTX0" "https://github.com/enjoyneering/AHTxx.git"
], ],
"esp8266_4mb": [ "esp8266_4mb": [
"Adafruit AHTX0" "https://github.com/enjoyneering/AHTxx.git"
] ]
} }
} }

View File

@@ -23,7 +23,7 @@ class Bme280t : public IoTItem {
void doByInterval() { void doByInterval() {
value.valD = _bme->readTemperature(); value.valD = _bme->readTemperature();
if (value.valD < 145) if (value.valD != NAN && value.valD < 145)
regEvent(value.valD, "Bme280t"); regEvent(value.valD, "Bme280t");
else else
SerialPrint("E", "Sensor Bme280t", "Error"); SerialPrint("E", "Sensor Bme280t", "Error");
@@ -43,7 +43,7 @@ class Bme280h : public IoTItem {
void doByInterval() { void doByInterval() {
value.valD = _bme->readHumidity(); value.valD = _bme->readHumidity();
if (value.valD < 100) if (value.valD != NAN && value.valD < 100)
regEvent(value.valD, "Bme280h"); regEvent(value.valD, "Bme280h");
else else
SerialPrint("E", "Sensor Bme280h", "Error"); SerialPrint("E", "Sensor Bme280h", "Error");
@@ -63,7 +63,7 @@ class Bme280p : public IoTItem {
void doByInterval() { void doByInterval() {
value.valD = _bme->readPressure(); value.valD = _bme->readPressure();
if (value.valD > 0) { if (value.valD != NAN && value.valD > 0) {
value.valD = value.valD / 1.333224 / 100; value.valD = value.valD / 1.333224 / 100;
regEvent(value.valD, "Bme280p"); regEvent(value.valD, "Bme280p");
} else } else
@@ -77,6 +77,10 @@ void* getAPI_Bme280(String subtype, String param) {
if (subtype == F("Bme280t") || subtype == F("Bme280h") || subtype == F("Bme280p")) { if (subtype == F("Bme280t") || subtype == F("Bme280h") || subtype == F("Bme280p")) {
String addr; String addr;
jsonRead(param, "addr", addr); jsonRead(param, "addr", 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] = new Adafruit_BME280();

View File

@@ -23,7 +23,7 @@ class Bmp280t : public IoTItem {
void doByInterval() { void doByInterval() {
value.valD = _bmp->readTemperature(); value.valD = _bmp->readTemperature();
if (String(value.valD) != "nan") if (value.valD != NAN && value.valD < 150)
regEvent(value.valD, "Bmp280t"); regEvent(value.valD, "Bmp280t");
else else
SerialPrint("E", "Sensor Bmp280t", "Error"); SerialPrint("E", "Sensor Bmp280t", "Error");
@@ -43,7 +43,7 @@ class Bmp280p : public IoTItem {
void doByInterval() { void doByInterval() {
value.valD = _bmp->readPressure(); value.valD = _bmp->readPressure();
if (String(value.valD) != "nan") { if (value.valD != NAN && value.valD > 0) {
value.valD = value.valD / 1.333224 / 100; value.valD = value.valD / 1.333224 / 100;
regEvent(value.valD, "Bmp280p"); regEvent(value.valD, "Bmp280p");
} else } else
@@ -57,6 +57,10 @@ void* getAPI_Bmp280(String subtype, String param) {
if (subtype == F("Bmp280t") || subtype == F("Bmp280p")) { if (subtype == F("Bmp280t") || subtype == F("Bmp280p")) {
String addr; String addr;
jsonRead(param, "addr", addr); jsonRead(param, "addr", addr);
if (addr == "") {
scanI2C();
return nullptr;
}
if (bmps.find(addr) == bmps.end()) { if (bmps.find(addr) == bmps.end()) {
bmps[addr] = new Adafruit_BMP280(); bmps[addr] = new Adafruit_BMP280();

View File

@@ -7,18 +7,14 @@
// глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина // глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина
std::map<int, OneWire*> oneWireTemperatureArray; std::map<int, OneWire*> oneWireTemperatureArray;
std::map<int, DallasTemperature*> sensorsTemperatureArray;
class Ds18b20 : public IoTItem { class Ds18b20 : public IoTItem {
private: private:
//для работы библиотеки с несколькими линиями необходимо обеспечить каждый экземпляр класса ссылками на объекты настроенные на эти линии //для работы библиотеки с несколькими линиями необходимо обеспечить каждый экземпляр класса ссылками на объекты настроенные на эти линии
OneWire* oneWire; OneWire* _oneWire;
DallasTemperature* sensors; DallasTemperature* _sensor;
DeviceAddress _deviceAddress;
//описание параметров передаваемых из настроек датчика из веба
String _addr;
int _pin;
int _index;
public: public:
//======================================================================================================= //=======================================================================================================
@@ -28,23 +24,33 @@ class Ds18b20 : public IoTItem {
// Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: // Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции:
// jsonReadStr, jsonReadBool, jsonReadInt // jsonReadStr, jsonReadBool, jsonReadInt
Ds18b20(String parameters) : IoTItem(parameters) { Ds18b20(String parameters) : IoTItem(parameters) {
jsonRead(parameters, "pin", _pin); int index, pin;
jsonRead(parameters, "index", _index, false); String addr;
jsonRead(parameters, "addr", _addr, false);
jsonRead(parameters, "pin", pin);
jsonRead(parameters, "index", index, false);
jsonRead(parameters, "addr", addr, false);
//учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась //учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась
if (oneWireTemperatureArray.find(_pin) == oneWireTemperatureArray.end()) { if (oneWireTemperatureArray.find(pin) == oneWireTemperatureArray.end()) {
oneWire = new OneWire((uint8_t)_pin); _oneWire = new OneWire((uint8_t)pin);
sensors = new DallasTemperature(); oneWireTemperatureArray[pin] = _oneWire;
sensors->setOneWire(oneWire);
sensors->begin();
sensors->setResolution(12);
oneWireTemperatureArray[_pin] = oneWire;
sensorsTemperatureArray[_pin] = sensors;
} else { } else {
oneWire = oneWireTemperatureArray[_pin]; _oneWire = oneWireTemperatureArray[pin];
sensors = sensorsTemperatureArray[_pin]; }
_sensor = new DallasTemperature(_oneWire);
_sensor->begin();
//sensors->setResolution(12);
//Определяем адрес. Если параметр addr не установлен, то узнаем адрес по индексу
if (addr == "") {
_sensor->getAddress(_deviceAddress, index);
char addrStr[20] = "";
hex2string(_deviceAddress, 8, addrStr);
SerialPrint("I", "Sensor " + (String)_id, "index: " + (String)index + " addr: " + String(addrStr));
} else {
string2hex(addr.c_str(), _deviceAddress);
} }
} }
//======================================================================================================= //=======================================================================================================
@@ -57,31 +63,21 @@ class Ds18b20 : public IoTItem {
// и выполнить за несколько тактов // и выполнить за несколько тактов
void doByInterval() { void doByInterval() {
//запускаем опрос измерений у всех датчиков на линии //запускаем опрос измерений у всех датчиков на линии
sensors->requestTemperatures(); _sensor->requestTemperatures();
//Определяем адрес. Если парамтер addr не установлен, то узнаем адрес по индексу
// TODO: понять как лучше. в текущей реализации адрес вычисляется каждый раз при опросе шины, это хорошо при отладке,
// но при постоянном контакте и использовании правильнее генерировать адрес при инициализации модуля. Но тогда нужно перезагружать устройство при новом датчике
DeviceAddress deviceAddress;
if (_addr == "") {
sensors->getAddress(deviceAddress, _index);
} else {
string2hex(_addr.c_str(), deviceAddress);
}
//получаем температуру по адресу //получаем температуру по адресу
value.valD = sensors->getTempC(deviceAddress); value.valD = _sensor->getTempC(_deviceAddress);
char addrStr[20] = ""; if (value.valD != DEVICE_DISCONNECTED_C)
hex2string(deviceAddress, 8, addrStr); regEvent(value.valD, ""); //обязательный вызов для отправки результата работы
if (value.valD != -127)
regEvent(value.valD, "addr: " + String(addrStr)); //обязательный вызов для отправки результата работы
else else
SerialPrint("E", "Sensor Ds18b20", "Error"); SerialPrint("E", "Sensor Ds18b20", "Error");
} }
//======================================================================================================= //=======================================================================================================
~Ds18b20() {}; ~Ds18b20() {
if (_sensor) delete _sensor;
};
}; };
// после замены названия сенсора, на функцию можно не обращать внимания // после замены названия сенсора, на функцию можно не обращать внимания

View File

@@ -1,6 +1,6 @@
#include "Utils\TimeUtils.h" #include "utils/TimeUtils.h"
#include "Global.h" #include "Global.h"
#include "Utils\StringUtils.h" #include "utils/StringUtils.h"
static const char* TIME_FORMAT PROGMEM = "%02d:%02d:%02d"; static const char* TIME_FORMAT PROGMEM = "%02d:%02d:%02d";
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d"; static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d";