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
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")

View File

@@ -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
}
]

View File

@@ -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

View File

@@ -139,4 +139,6 @@ extern bool _time_isTrust;
// extern DynamicJsonDocument settingsFlashJsonDoc;
// 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
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 =

View File

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

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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"
]
}

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": "Сенсоры",
"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"
]
}
}

View File

@@ -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;

View File

@@ -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();

View File

@@ -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);

View File

@@ -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";