mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
Merge pull request #205 from biveraxe/ver4dev
Корректируем модули датчиков
This commit is contained in:
@@ -19,6 +19,7 @@ import configparser
|
||||
import os, json, sys, getopt
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
config = configparser.ConfigParser() # создаём объекта парсера INI
|
||||
|
||||
def printHelp():
|
||||
@@ -31,10 +32,10 @@ def printHelp():
|
||||
|
||||
def updateModulesInProfile(profJson):
|
||||
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:
|
||||
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)
|
||||
# проверяем есть ли уже узловой элемент и если нет, то создаем
|
||||
if not modinfoJson['menuSection'] in profJson["modules"]:
|
||||
@@ -43,7 +44,7 @@ def updateModulesInProfile(profJson):
|
||||
profJson["modules"] = listFromFirstElement
|
||||
# добавляем информацию о модуле в узловой элемент
|
||||
profJson["modules"][modinfoJson['menuSection']].append({
|
||||
'path': root,
|
||||
'path': os.path.normpath(root).replace("\\", "/"),
|
||||
'active': modinfoJson['defActive']
|
||||
})
|
||||
|
||||
@@ -132,11 +133,11 @@ for section, modules in profJson['modules'].items():
|
||||
itemsJson.append({"header": section})
|
||||
for module in modules:
|
||||
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)
|
||||
if deviceName in moduleJson['devices']: # проверяем поддерживает ли модуль текущее устройство
|
||||
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]: # запоминаем библиотеки необходимые модулю для текущей платы
|
||||
allLibs = allLibs + "\n" + libPath
|
||||
for configItemsJson in moduleJson['configItem']:
|
||||
@@ -182,12 +183,20 @@ config["platformio"]["default_envs"] = deviceName
|
||||
config["platformio"]["data_dir"] = profJson['projectProp']['platformio']['data_dir']
|
||||
with open("platformio.ini", 'w') as configFile:
|
||||
config.write(configFile)
|
||||
|
||||
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)
|
||||
|
||||
|
||||
# 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:
|
||||
print(f"\x1b[1;31;42m Модули профиля " + profile + " обновлены, а сам профиль применен, можно запускать компиляцию и прошивку.\x1b[0m")
|
||||
|
||||
else:
|
||||
print(f"\x1b[1;31;42m Профиль ", profile, " применен, можно запускать компиляцию и прошивку.\x1b[0m")
|
||||
|
||||
# print(f"\x1b[1;32;41m Операция завершена. \x1b[0m")
|
||||
|
||||
|
||||
@@ -125,28 +125,30 @@
|
||||
"num": 9
|
||||
},
|
||||
{
|
||||
"name": "10. AHT20 Температура",
|
||||
"name": "10. AHTXX Температура",
|
||||
"type": "Reading",
|
||||
"subtype": "Aht20t",
|
||||
"subtype": "AhtXXt",
|
||||
"id": "Temp20",
|
||||
"widget": "anydataTmp",
|
||||
"page": "Сенсоры",
|
||||
"descr": "AHT20 Температура",
|
||||
"descr": "AHTXX Температура",
|
||||
"int": 15,
|
||||
"addr": "0x38",
|
||||
"shtType": 1,
|
||||
"round": 1,
|
||||
"num": 10
|
||||
},
|
||||
{
|
||||
"name": "11. AHT20 Влажность",
|
||||
"name": "11. AHTXX Влажность",
|
||||
"type": "Reading",
|
||||
"subtype": "Aht20h",
|
||||
"subtype": "AhtXXh",
|
||||
"id": "Hum20",
|
||||
"widget": "anydataHum",
|
||||
"page": "Сенсоры",
|
||||
"descr": "AHT20 Влажность",
|
||||
"descr": "AHTXX Влажность",
|
||||
"int": 15,
|
||||
"addr": "0x38",
|
||||
"shtType": 1,
|
||||
"round": 1,
|
||||
"num": 11
|
||||
},
|
||||
@@ -554,7 +556,20 @@
|
||||
"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",
|
||||
"subtype": "Pwm8266",
|
||||
"id": "pwm",
|
||||
@@ -566,10 +581,10 @@
|
||||
"freq": 5000,
|
||||
"val": 0,
|
||||
"apin": -1,
|
||||
"num": 43
|
||||
"num": 44
|
||||
},
|
||||
{
|
||||
"name": "44. Телеграм-Лайт",
|
||||
"name": "45. Телеграм-Лайт",
|
||||
"type": "Writing",
|
||||
"subtype": "TelegramLT",
|
||||
"id": "tg",
|
||||
@@ -578,13 +593,13 @@
|
||||
"descr": "",
|
||||
"token": "",
|
||||
"chatID": "",
|
||||
"num": 44
|
||||
"num": 45
|
||||
},
|
||||
{
|
||||
"header": "Экраны"
|
||||
},
|
||||
{
|
||||
"name": "45. LCD экран 2004",
|
||||
"name": "46. LCD экран 2004",
|
||||
"type": "Reading",
|
||||
"subtype": "Lcd2004",
|
||||
"id": "Lcd",
|
||||
@@ -596,10 +611,10 @@
|
||||
"size": "20,4",
|
||||
"coord": "0,0",
|
||||
"id2show": "id датчика",
|
||||
"num": 45
|
||||
"num": 46
|
||||
},
|
||||
{
|
||||
"name": "46. LCD экран 1602",
|
||||
"name": "47. LCD экран 1602",
|
||||
"type": "Reading",
|
||||
"subtype": "Lcd2004",
|
||||
"id": "Lcd",
|
||||
@@ -611,6 +626,6 @@
|
||||
"size": "16,2",
|
||||
"coord": "0,0",
|
||||
"id2show": "id датчика",
|
||||
"num": 46
|
||||
"num": 47
|
||||
}
|
||||
]
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "Global.h"
|
||||
#ifdef ESP32
|
||||
#if USE_LITTLEFS
|
||||
#include <LITTLEFS.h>
|
||||
#include <LittleFS.h>
|
||||
#define FileFS LittleFS
|
||||
#define FS_NAME "LittleFS_32"
|
||||
#define CONFIG_LITTLEFS_SPIFFS_COMPAT 1
|
||||
|
||||
@@ -139,4 +139,6 @@ extern bool _time_isTrust;
|
||||
|
||||
// extern DynamicJsonDocument settingsFlashJsonDoc;
|
||||
// extern DynamicJsonDocument paramsFlashJsonDoc;
|
||||
// extern DynamicJsonDocument paramsHeapJsonDoc;
|
||||
// extern DynamicJsonDocument paramsHeapJsonDoc;
|
||||
|
||||
void scanI2C();
|
||||
@@ -9,7 +9,7 @@ board = nodemcuv2
|
||||
board_build.ldscript = eagle.flash.4m1m.ld
|
||||
platform = espressif8266 @4.0.1
|
||||
monitor_filters = esp8266_exception_decoder
|
||||
upload_speed = 921600
|
||||
upload_speed = 115200
|
||||
monitor_speed = 115200
|
||||
board_build.filesystem = littlefs
|
||||
build_src_filter =
|
||||
@@ -29,7 +29,7 @@ framework = arduino
|
||||
board = esp32dev
|
||||
platform = espressif32 @5.1.1
|
||||
monitor_filters = esp32_exception_decoder
|
||||
upload_speed = 921600
|
||||
upload_speed = 115200
|
||||
monitor_speed = 115200
|
||||
debug_tool = esp-prog
|
||||
board_build.filesystem = littlefs
|
||||
@@ -53,7 +53,7 @@ lib_deps_external =
|
||||
|
||||
[env:esp8266_4mb_fromitems]
|
||||
lib_deps =
|
||||
Adafruit AHTX0
|
||||
https://github.com/enjoyneering/AHTxx.git
|
||||
adafruit/Adafruit BME280 Library
|
||||
adafruit/Adafruit BMP280 Library
|
||||
beegee-tokyo/DHT sensor library for ESPx
|
||||
@@ -69,37 +69,39 @@ lib_deps =
|
||||
adafruit/Adafruit MCP23017 Arduino Library@^2.1.0
|
||||
adafruit/Adafruit BusIO @ ^1.13.2
|
||||
dfrobot/DFRobotDFPlayerMini @ ^1.0.5
|
||||
adafruit/Adafruit BusIO @ ^1.13.2
|
||||
marcoschwartz/LiquidCrystal_I2C@^1.1.4
|
||||
build_src_filter =
|
||||
+<modules\virtual\Loging>
|
||||
+<modules\virtual\LogingDaily>
|
||||
+<modules\virtual\Timer>
|
||||
+<modules\virtual\Variable>
|
||||
+<modules\virtual\VButton>
|
||||
+<modules\sensors\Acs712>
|
||||
+<modules\sensors\Aht20>
|
||||
+<modules\sensors\AnalogAdc>
|
||||
+<modules\sensors\Bme280>
|
||||
+<modules\sensors\Bmp280>
|
||||
+<modules\sensors\Dht1122>
|
||||
+<modules\sensors\Ds18b20>
|
||||
+<modules\sensors\GY21>
|
||||
+<modules\sensors\Hdc1080>
|
||||
+<modules\sensors\Max6675>
|
||||
+<modules\sensors\Pzem004t>
|
||||
+<modules\sensors\RCswitch>
|
||||
+<modules\sensors\Sht20>
|
||||
+<modules\sensors\Sht30>
|
||||
+<modules\sensors\Sonar>
|
||||
+<modules\sensors\UART>
|
||||
+<modules\exec\ButtonIn>
|
||||
+<modules\exec\ButtonOut>
|
||||
+<modules\exec\IoTServo>
|
||||
+<modules\exec\Mcp23017>
|
||||
+<modules\exec\Mp3>
|
||||
+<modules\exec\Pwm8266>
|
||||
+<modules\exec\TelegramLT>
|
||||
+<modules\display\Lcd2004>
|
||||
+<modules/virtual/Loging>
|
||||
+<modules/virtual/LogingDaily>
|
||||
+<modules/virtual/Timer>
|
||||
+<modules/virtual/Variable>
|
||||
+<modules/virtual/VButton>
|
||||
+<modules/sensors/Acs712>
|
||||
+<modules/sensors/AhtXX>
|
||||
+<modules/sensors/AnalogAdc>
|
||||
+<modules/sensors/Bme280>
|
||||
+<modules/sensors/Bmp280>
|
||||
+<modules/sensors/Dht1122>
|
||||
+<modules/sensors/Ds18b20>
|
||||
+<modules/sensors/GY21>
|
||||
+<modules/sensors/Hdc1080>
|
||||
+<modules/sensors/Max6675>
|
||||
+<modules/sensors/Pzem004t>
|
||||
+<modules/sensors/RCswitch>
|
||||
+<modules/sensors/Sht20>
|
||||
+<modules/sensors/Sht30>
|
||||
+<modules/sensors/Sonar>
|
||||
+<modules/sensors/UART>
|
||||
+<modules/exec/ButtonIn>
|
||||
+<modules/exec/ButtonOut>
|
||||
+<modules/exec/IoTServo>
|
||||
+<modules/exec/Mcp23017>
|
||||
+<modules/exec/Mp3>
|
||||
+<modules/exec/Pcf8574>
|
||||
+<modules/exec/Pwm8266>
|
||||
+<modules/exec/TelegramLT>
|
||||
+<modules/display/Lcd2004>
|
||||
|
||||
[env:esp32_4mb_fromitems]
|
||||
lib_deps =
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "NTP.h"
|
||||
|
||||
#include "Global.h"
|
||||
#include "Utils\SerialPrint.h"
|
||||
#include "utils/SerialPrint.h"
|
||||
|
||||
void ntpInit() {
|
||||
synchTime();
|
||||
|
||||
@@ -6,7 +6,7 @@ void* getAPI_Timer(String subtype, String params);
|
||||
void* getAPI_Variable(String subtype, String params);
|
||||
void* getAPI_VButton(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_Bme280(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_Mcp23017(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_TelegramLT(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_VButton(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_Bme280(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_Mcp23017(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_TelegramLT(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
|
||||
#define PCF8574_I2CADDR_DEFAULT 0x20 ///< DS3502 default I2C address
|
||||
|
||||
void scanI2C();
|
||||
|
||||
class Adafruit_PCF8574_mod {
|
||||
public:
|
||||
Adafruit_PCF8574_mod() {};
|
||||
@@ -82,7 +80,6 @@ class Pcf8574Driver : public IoTGpio {
|
||||
|
||||
int digitalRead(uint8_t pin) {
|
||||
return _pcf.digitalRead(pin);
|
||||
//return 0;
|
||||
}
|
||||
|
||||
void digitalInvert(uint8_t pin) {
|
||||
|
||||
@@ -33,11 +33,9 @@
|
||||
|
||||
"devices": {
|
||||
"esp32_4mb": [
|
||||
"adafruit/Adafruit PCF8574@^1.0.0",
|
||||
"adafruit/Adafruit BusIO @ ^1.13.2"
|
||||
],
|
||||
"esp8266_4mb": [
|
||||
"adafruit/Adafruit PCF8574@^1.0.0",
|
||||
"adafruit/Adafruit BusIO @ ^1.13.2"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
@@ -2,57 +2,60 @@
|
||||
"menuSection": "Сенсоры",
|
||||
"configItem": [
|
||||
{
|
||||
"name": "AHT20 Температура",
|
||||
"name": "AHTXX Температура",
|
||||
"type": "Reading",
|
||||
"subtype": "Aht20t",
|
||||
"subtype": "AhtXXt",
|
||||
"id": "Temp20",
|
||||
"widget": "anydataTmp",
|
||||
"page": "Сенсоры",
|
||||
"descr": "AHT20 Температура",
|
||||
"descr": "AHTXX Температура",
|
||||
"int": 15,
|
||||
"addr": "0x38",
|
||||
"shtType":1,
|
||||
"round": 1
|
||||
},
|
||||
{
|
||||
"name": "AHT20 Влажность",
|
||||
"name": "AHTXX Влажность",
|
||||
"type": "Reading",
|
||||
"subtype": "Aht20h",
|
||||
"subtype": "AhtXXh",
|
||||
"id": "Hum20",
|
||||
"widget": "anydataHum",
|
||||
"page": "Сенсоры",
|
||||
"descr": "AHT20 Влажность",
|
||||
"descr": "AHTXX Влажность",
|
||||
"int": 15,
|
||||
"addr": "0x38",
|
||||
"shtType":1,
|
||||
"round": 1
|
||||
}
|
||||
],
|
||||
"about": {
|
||||
"authorName": "Serghei Crasnicov",
|
||||
"authorContact": "https://t.me/Serghei63",
|
||||
"authorGit": "https://github.com/Serghei63",
|
||||
"specialThanks": "",
|
||||
"moduleName": "Aht20",
|
||||
"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": [
|
||||
"Aht20t",
|
||||
"Aht20h"
|
||||
"AhtXXt",
|
||||
"AhtXXh"
|
||||
],
|
||||
"title": "Сенсор температуры и влажности AHT20",
|
||||
"moduleDesc": "Позволяет получить температуру и влажность с Aht20.",
|
||||
"title": "Сенсор температуры и влажности AHTXX",
|
||||
"moduleDesc": "Позволяет получить температуру и влажность с AhtXX.",
|
||||
"propInfo": {
|
||||
"pin": "GPIO номер, к которому подключен датчик.",
|
||||
"addr": "Адрес датчика на шине, обычно 0x38.",
|
||||
"int": "Количество секунд между опросами датчика."
|
||||
"int": "Количество секунд между опросами датчика.",
|
||||
"shtType": "Модель датчика. 0 - AHT1x, 1 - AHT2x"
|
||||
}
|
||||
},
|
||||
"defActive": true,
|
||||
"devices": {
|
||||
"esp32_4mb": [
|
||||
"Adafruit AHTX0"
|
||||
"https://github.com/enjoyneering/AHTxx.git"
|
||||
],
|
||||
"esp8266_4mb": [
|
||||
"Adafruit AHTX0"
|
||||
"https://github.com/enjoyneering/AHTxx.git"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,7 @@ class Bme280t : public IoTItem {
|
||||
|
||||
void doByInterval() {
|
||||
value.valD = _bme->readTemperature();
|
||||
if (value.valD < 145)
|
||||
if (value.valD != NAN && value.valD < 145)
|
||||
regEvent(value.valD, "Bme280t");
|
||||
else
|
||||
SerialPrint("E", "Sensor Bme280t", "Error");
|
||||
@@ -43,7 +43,7 @@ class Bme280h : public IoTItem {
|
||||
|
||||
void doByInterval() {
|
||||
value.valD = _bme->readHumidity();
|
||||
if (value.valD < 100)
|
||||
if (value.valD != NAN && value.valD < 100)
|
||||
regEvent(value.valD, "Bme280h");
|
||||
else
|
||||
SerialPrint("E", "Sensor Bme280h", "Error");
|
||||
@@ -63,7 +63,7 @@ class Bme280p : public IoTItem {
|
||||
|
||||
void doByInterval() {
|
||||
value.valD = _bme->readPressure();
|
||||
if (value.valD > 0) {
|
||||
if (value.valD != NAN && value.valD > 0) {
|
||||
value.valD = value.valD / 1.333224 / 100;
|
||||
regEvent(value.valD, "Bme280p");
|
||||
} else
|
||||
@@ -77,19 +77,23 @@ void* getAPI_Bme280(String subtype, String param) {
|
||||
if (subtype == F("Bme280t") || subtype == F("Bme280h") || subtype == F("Bme280p")) {
|
||||
String addr;
|
||||
jsonRead(param, "addr", addr);
|
||||
if (addr == "") {
|
||||
scanI2C();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (bmes.find(addr) == bmes.end()) {
|
||||
bmes[addr] = new Adafruit_BME280();
|
||||
bmes[addr]->begin(hexStringToUint8(addr));
|
||||
}
|
||||
|
||||
if (subtype == F("Bme280t")) {
|
||||
return new Bme280t(bmes[addr], param);
|
||||
} else if (subtype == F("Bme280h")) {
|
||||
return new Bme280h(bmes[addr], param);
|
||||
} else if (subtype == F("Bme280p")) {
|
||||
return new Bme280p(bmes[addr], param);
|
||||
}
|
||||
if (bmes.find(addr) == bmes.end()) {
|
||||
bmes[addr] = new Adafruit_BME280();
|
||||
bmes[addr]->begin(hexStringToUint8(addr));
|
||||
}
|
||||
|
||||
if (subtype == F("Bme280t")) {
|
||||
return new Bme280t(bmes[addr], param);
|
||||
} else if (subtype == F("Bme280h")) {
|
||||
return new Bme280h(bmes[addr], param);
|
||||
} else if (subtype == F("Bme280p")) {
|
||||
return new Bme280p(bmes[addr], param);
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
||||
@@ -23,7 +23,7 @@ class Bmp280t : public IoTItem {
|
||||
|
||||
void doByInterval() {
|
||||
value.valD = _bmp->readTemperature();
|
||||
if (String(value.valD) != "nan")
|
||||
if (value.valD != NAN && value.valD < 150)
|
||||
regEvent(value.valD, "Bmp280t");
|
||||
else
|
||||
SerialPrint("E", "Sensor Bmp280t", "Error");
|
||||
@@ -43,7 +43,7 @@ class Bmp280p : public IoTItem {
|
||||
|
||||
void doByInterval() {
|
||||
value.valD = _bmp->readPressure();
|
||||
if (String(value.valD) != "nan") {
|
||||
if (value.valD != NAN && value.valD > 0) {
|
||||
value.valD = value.valD / 1.333224 / 100;
|
||||
regEvent(value.valD, "Bmp280p");
|
||||
} else
|
||||
@@ -57,6 +57,10 @@ void* getAPI_Bmp280(String subtype, String param) {
|
||||
if (subtype == F("Bmp280t") || subtype == F("Bmp280p")) {
|
||||
String addr;
|
||||
jsonRead(param, "addr", addr);
|
||||
if (addr == "") {
|
||||
scanI2C();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (bmps.find(addr) == bmps.end()) {
|
||||
bmps[addr] = new Adafruit_BMP280();
|
||||
|
||||
@@ -5,88 +5,84 @@
|
||||
#include <OneWire.h>
|
||||
#include <map>
|
||||
|
||||
//глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина
|
||||
// глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина
|
||||
std::map<int, OneWire*> oneWireTemperatureArray;
|
||||
std::map<int, DallasTemperature*> sensorsTemperatureArray;
|
||||
|
||||
|
||||
class Ds18b20 : public IoTItem {
|
||||
private:
|
||||
//для работы библиотеки с несколькими линиями необходимо обеспечить каждый экземпляр класса ссылками на объекты настроенные на эти линии
|
||||
OneWire* oneWire;
|
||||
DallasTemperature* sensors;
|
||||
|
||||
//описание параметров передаваемых из настроек датчика из веба
|
||||
String _addr;
|
||||
int _pin;
|
||||
int _index;
|
||||
OneWire* _oneWire;
|
||||
DallasTemperature* _sensor;
|
||||
DeviceAddress _deviceAddress;
|
||||
|
||||
public:
|
||||
//=======================================================================================================
|
||||
// setup()
|
||||
//это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора.
|
||||
//Такие как ...begin и подставлять в них параметры полученные из web интерфейса.
|
||||
//Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции:
|
||||
// это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора.
|
||||
// Такие как ...begin и подставлять в них параметры полученные из web интерфейса.
|
||||
// Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции:
|
||||
// jsonReadStr, jsonReadBool, jsonReadInt
|
||||
Ds18b20(String parameters) : IoTItem(parameters) {
|
||||
jsonRead(parameters, "pin", _pin);
|
||||
jsonRead(parameters, "index", _index, false);
|
||||
jsonRead(parameters, "addr", _addr, false);
|
||||
int index, pin;
|
||||
String addr;
|
||||
|
||||
jsonRead(parameters, "pin", pin);
|
||||
jsonRead(parameters, "index", index, false);
|
||||
jsonRead(parameters, "addr", addr, false);
|
||||
|
||||
//учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась
|
||||
if (oneWireTemperatureArray.find(_pin) == oneWireTemperatureArray.end()) {
|
||||
oneWire = new OneWire((uint8_t)_pin);
|
||||
sensors = new DallasTemperature();
|
||||
sensors->setOneWire(oneWire);
|
||||
sensors->begin();
|
||||
sensors->setResolution(12);
|
||||
|
||||
oneWireTemperatureArray[_pin] = oneWire;
|
||||
sensorsTemperatureArray[_pin] = sensors;
|
||||
if (oneWireTemperatureArray.find(pin) == oneWireTemperatureArray.end()) {
|
||||
_oneWire = new OneWire((uint8_t)pin);
|
||||
oneWireTemperatureArray[pin] = _oneWire;
|
||||
} else {
|
||||
oneWire = oneWireTemperatureArray[_pin];
|
||||
sensors = sensorsTemperatureArray[_pin];
|
||||
_oneWire = oneWireTemperatureArray[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);
|
||||
}
|
||||
}
|
||||
//=======================================================================================================
|
||||
// doByInterval()
|
||||
//это аналог loop из arduino, но вызываемый каждые int секунд, заданные в настройках. Здесь вы должны выполнить чтение вашего сенсора
|
||||
//а затем выполнить regEvent - это регистрация произошедшего события чтения
|
||||
//здесь так же доступны все переменные из секции переменных, и полученные в setup
|
||||
//если у сенсора несколько величин то делайте несколько regEvent
|
||||
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
|
||||
//и выполнить за несколько тактов
|
||||
// это аналог loop из arduino, но вызываемый каждые int секунд, заданные в настройках. Здесь вы должны выполнить чтение вашего сенсора
|
||||
// а затем выполнить regEvent - это регистрация произошедшего события чтения
|
||||
// здесь так же доступны все переменные из секции переменных, и полученные в setup
|
||||
// если у сенсора несколько величин то делайте несколько regEvent
|
||||
// не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
|
||||
// и выполнить за несколько тактов
|
||||
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] = "";
|
||||
hex2string(deviceAddress, 8, addrStr);
|
||||
|
||||
if (value.valD != -127)
|
||||
regEvent(value.valD, "addr: " + String(addrStr)); //обязательный вызов для отправки результата работы
|
||||
if (value.valD != DEVICE_DISCONNECTED_C)
|
||||
regEvent(value.valD, ""); //обязательный вызов для отправки результата работы
|
||||
else
|
||||
SerialPrint("E", "Sensor Ds18b20", "Error");
|
||||
}
|
||||
//=======================================================================================================
|
||||
|
||||
~Ds18b20() {};
|
||||
~Ds18b20() {
|
||||
if (_sensor) delete _sensor;
|
||||
};
|
||||
};
|
||||
|
||||
//после замены названия сенсора, на функцию можно не обращать внимания
|
||||
//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть
|
||||
//создание и контроль соответствующих глобальных переменных
|
||||
// после замены названия сенсора, на функцию можно не обращать внимания
|
||||
// если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть
|
||||
// создание и контроль соответствующих глобальных переменных
|
||||
void* getAPI_Ds18b20(String subtype, String param) {
|
||||
if (subtype == F("Ds18b20")) {
|
||||
return new Ds18b20(param);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "Utils\TimeUtils.h"
|
||||
#include "utils/TimeUtils.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_WITH_DAYS PROGMEM = "%dd %02d:%02d";
|
||||
|
||||
Reference in New Issue
Block a user