From d3fb354a1edb7cb03abcecbde5ff89413d877dbf Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:31:26 +0300 Subject: [PATCH 1/9] =?UTF-8?q?=D0=9C=D0=B5=D0=BD=D1=8F=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=20=D1=87=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20Ds18b20=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=98?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D1=8F=D0=B5=D0=BC=20=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=B0=D0=B4=D1=80=D0=B5=D1=81=D0=B0=20=D0=B4=D0=B0=D1=82=D1=87?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0.=20=D0=9D=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81,=20=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=D1=82=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20=D0=BF=D0=BE=20index=20=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D0=BC=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=B5=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/Ds18b20/Ds18b20.cpp | 100 ++++++++++++------------ 1 file changed, 48 insertions(+), 52 deletions(-) diff --git a/src/modules/sensors/Ds18b20/Ds18b20.cpp b/src/modules/sensors/Ds18b20/Ds18b20.cpp index 1845a16e..e6518e03 100644 --- a/src/modules/sensors/Ds18b20/Ds18b20.cpp +++ b/src/modules/sensors/Ds18b20/Ds18b20.cpp @@ -5,88 +5,84 @@ #include #include -//глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина +// глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина std::map oneWireTemperatureArray; -std::map 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); From 1a605e1135045ade3f67d89e59a26f2b4c56a71b Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:38:53 +0300 Subject: [PATCH 2/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=B0=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D0=B0=20=D0=BD=D0=B0=20=D1=88=D0=B8=D0=BD?= =?UTF-8?q?=D0=B5=20I2C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/Bme280/Bme280.cpp | 34 +++++++++++++++------------ src/modules/sensors/Bmp280/Bmp280.cpp | 8 +++++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/modules/sensors/Bme280/Bme280.cpp b/src/modules/sensors/Bme280/Bme280.cpp index 6ef5d160..aa9050c8 100644 --- a/src/modules/sensors/Bme280/Bme280.cpp +++ b/src/modules/sensors/Bme280/Bme280.cpp @@ -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; diff --git a/src/modules/sensors/Bmp280/Bmp280.cpp b/src/modules/sensors/Bmp280/Bmp280.cpp index 454f1c3b..fae4ccfa 100644 --- a/src/modules/sensors/Bmp280/Bmp280.cpp +++ b/src/modules/sensors/Bmp280/Bmp280.cpp @@ -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(); From 4cc46a777ab6c5ff18a3a1a269fb2ecf48578815 Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:39:46 +0300 Subject: [PATCH 3/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20AHTxx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/AhtXX/AhtXX.cpp | 115 +++++++++++++++++++++++++ src/modules/sensors/AhtXX/modinfo.json | 61 +++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 src/modules/sensors/AhtXX/AhtXX.cpp create mode 100644 src/modules/sensors/AhtXX/modinfo.json diff --git a/src/modules/sensors/AhtXX/AhtXX.cpp b/src/modules/sensors/AhtXX/AhtXX.cpp new file mode 100644 index 00000000..f32487bf --- /dev/null +++ b/src/modules/sensors/AhtXX/AhtXX.cpp @@ -0,0 +1,115 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +#include +#include + + +std::map ahts; + +void printStatus(AHTxx *aht) { + switch (aht->getStatus()) { + case AHTXX_NO_ERROR: + Serial.println(F("no error")); + break; + + case AHTXX_BUSY_ERROR: + Serial.println(F("sensor AHT busy, increase polling time")); + break; + + case AHTXX_ACK_ERROR: + Serial.println(F("sensor AHT didn't return ACK, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)")); + break; + + case AHTXX_DATA_ERROR: + Serial.println(F(" AHT: received data smaller than expected, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)")); + break; + + case AHTXX_CRC8_ERROR: + Serial.println(F("AHT: computed CRC8 not match received CRC8, this feature supported only by AHT2x sensors")); + break; + + default: + Serial.println(F("AHT: unknown status")); + break; + } +} + +class AhtXXt : public IoTItem { + private: + AHTxx *_aht = nullptr; + + public: + AhtXXt(AHTxx* aht, String parameters) : IoTItem(parameters) { + _aht = aht; + } + + void doByInterval() { + value.valD = _aht->readTemperature(); + if (value.valD != AHTXX_ERROR) { + regEvent(value.valD, "AhtXXt"); + } else { + printStatus(_aht); //print temperature command status + } + } + + ~AhtXXt(){}; +}; + +class AhtXXh : public IoTItem { + private: + AHTxx *_aht = nullptr; + + public: + AhtXXh(AHTxx* aht, String parameters) : IoTItem(parameters) { + _aht = aht; + } + + void doByInterval() { + value.valD = _aht->readHumidity(); + if (value.valD != AHTXX_ERROR) { + regEvent(value.valD, "AhtXXh"); + } else { + printStatus(_aht); //print temperature command status + } + } + + ~AhtXXh(){}; +}; + +void* getAPI_AhtXX(String subtype, String param) { + if (subtype == F("AhtXXt") || subtype == F("AhtXXh")) { + String addr; + jsonRead(param, "addr", addr); + if (addr == "") { + scanI2C(); + return nullptr; + } + + if (ahts.find(addr) == ahts.end()) { + int shtType; + jsonRead(param, "type", shtType); + + ahts[addr] = new AHTxx(hexStringToUint8(addr), (AHTXX_I2C_SENSOR)shtType); + + int pinSCL, pinSDA, i2cFreq; + jsonRead(settingsFlashJson, "pinSCL", pinSCL, false); + jsonRead(settingsFlashJson, "pinSDA", pinSDA, false); + jsonRead(settingsFlashJson, "i2cFreq", i2cFreq, false); + if (!pinSCL || !pinSDA || !i2cFreq) { + pinSCL = SCL; + pinSDA = SDA; + i2cFreq = 100000; + } + ahts[addr]->begin(pinSDA, pinSCL, i2cFreq); + } + + if (subtype == F("AhtXXt")) { + return new AhtXXt(ahts[addr], param); + } else if (subtype == F("AhtXXh")) { + return new AhtXXh(ahts[addr], param); + } + } + + return nullptr; +} diff --git a/src/modules/sensors/AhtXX/modinfo.json b/src/modules/sensors/AhtXX/modinfo.json new file mode 100644 index 00000000..e37c1813 --- /dev/null +++ b/src/modules/sensors/AhtXX/modinfo.json @@ -0,0 +1,61 @@ +{ + "menuSection": "Сенсоры", + "configItem": [ + { + "name": "AHTXX Температура", + "type": "Reading", + "subtype": "AhtXXt", + "id": "Temp20", + "widget": "anydataTmp", + "page": "Сенсоры", + "descr": "AHTXX Температура", + "int": 15, + "addr": "0x38", + "shtType":1, + "round": 1 + }, + { + "name": "AHTXX Влажность", + "type": "Reading", + "subtype": "AhtXXh", + "id": "Hum20", + "widget": "anydataHum", + "page": "Сенсоры", + "descr": "AHTXX Влажность", + "int": 15, + "addr": "0x38", + "shtType":1, + "round": 1 + } + ], + "about": { + "authorName": "Ilya Belyakov", + "authorContact": "https://t.me/Biveraxe", + "authorGit": "https://github.com/biveraxe", + "specialThanks": "Sergey @Serghei63, @avaks_dev", + "moduleName": "AhtXX", + "moduleVersion": "1.0", + "usedRam": 15, + "subTypes": [ + "AhtXXt", + "AhtXXh" + ], + "title": "Сенсор температуры и влажности AHTXX", + "moduleDesc": "Позволяет получить температуру и влажность с AhtXX.", + "propInfo": { + "pin": "GPIO номер, к которому подключен датчик.", + "addr": "Адрес датчика на шине, обычно 0x38.", + "int": "Количество секунд между опросами датчика.", + "shtType": "Модель датчика. 0 - AHT1x, 1 - AHT2x" + } + }, + "defActive": true, + "devices": { + "esp32_4mb": [ + "https://github.com/enjoyneering/AHTxx.git" + ], + "esp8266_4mb": [ + "https://github.com/enjoyneering/AHTxx.git" + ] + } +} \ No newline at end of file From 9e204da12736a1577aa2b7dec8b52b036fc581fc Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:40:27 +0300 Subject: [PATCH 4/9] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D0=B8=D0=BC=20Pcf8?= =?UTF-8?q?574?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/exec/Pcf8574/Pcf8574.cpp | 3 --- src/modules/exec/Pcf8574/modinfo.json | 2 -- 2 files changed, 5 deletions(-) diff --git a/src/modules/exec/Pcf8574/Pcf8574.cpp b/src/modules/exec/Pcf8574/Pcf8574.cpp index 3eabb9ff..d5403752 100644 --- a/src/modules/exec/Pcf8574/Pcf8574.cpp +++ b/src/modules/exec/Pcf8574/Pcf8574.cpp @@ -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) { diff --git a/src/modules/exec/Pcf8574/modinfo.json b/src/modules/exec/Pcf8574/modinfo.json index 4408fd16..5c0777b6 100644 --- a/src/modules/exec/Pcf8574/modinfo.json +++ b/src/modules/exec/Pcf8574/modinfo.json @@ -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" ] } From c41bf277ecd31798b6d9cc060f9451545f4c653e Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:41:07 +0300 Subject: [PATCH 5/9] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=BE=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20scanI2C?= =?UTF-8?q?=20=D0=B2=20=D0=B3=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Global.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/Global.h b/include/Global.h index 6c873eb6..558ace8f 100644 --- a/include/Global.h +++ b/include/Global.h @@ -139,4 +139,6 @@ extern bool _time_isTrust; // extern DynamicJsonDocument settingsFlashJsonDoc; // extern DynamicJsonDocument paramsFlashJsonDoc; -// extern DynamicJsonDocument paramsHeapJsonDoc; \ No newline at end of file +// extern DynamicJsonDocument paramsHeapJsonDoc; + +void scanI2C(); \ No newline at end of file From 6ef9d2fe99cc0f28095f961ac899b34023937076 Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:42:34 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B5=D0=B4=D0=B8=D0=BD=D1=8B=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BB=D1=8D=D1=88=D0=B8=20=D0=B2=20=D0=BF=D1=83=D1=82=D1=8F?= =?UTF-8?q?=D1=85=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D1=81=20Lin?= =?UTF-8?q?ux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrepareProject.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index 94798627..096d1d5f 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -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") \ No newline at end of file From c9a386c01b38d6dd489d4554a3c34f3c1e63a038 Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:44:32 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D1=8F=D0=B5=D0=BC?= =?UTF-8?q?=20Aht20=20=D1=82.=D0=BA.=20=D0=BF=D0=BE=D1=8F=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=83?= =?UTF-8?q?=D0=BD=D0=B8=D0=B2=D0=B5=D1=80=D1=81=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/Aht20/Aht20.cpp | 61 -------------------------- src/modules/sensors/Aht20/modinfo.json | 58 ------------------------ 2 files changed, 119 deletions(-) delete mode 100644 src/modules/sensors/Aht20/Aht20.cpp delete mode 100644 src/modules/sensors/Aht20/modinfo.json diff --git a/src/modules/sensors/Aht20/Aht20.cpp b/src/modules/sensors/Aht20/Aht20.cpp deleted file mode 100644 index 0c8a569b..00000000 --- a/src/modules/sensors/Aht20/Aht20.cpp +++ /dev/null @@ -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 - -// 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; - } -} diff --git a/src/modules/sensors/Aht20/modinfo.json b/src/modules/sensors/Aht20/modinfo.json deleted file mode 100644 index 8d2bc3a7..00000000 --- a/src/modules/sensors/Aht20/modinfo.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "menuSection": "Сенсоры", - "configItem": [ - { - "name": "AHT20 Температура", - "type": "Reading", - "subtype": "Aht20t", - "id": "Temp20", - "widget": "anydataTmp", - "page": "Сенсоры", - "descr": "AHT20 Температура", - "int": 15, - "addr": "0x38", - "round": 1 - }, - { - "name": "AHT20 Влажность", - "type": "Reading", - "subtype": "Aht20h", - "id": "Hum20", - "widget": "anydataHum", - "page": "Сенсоры", - "descr": "AHT20 Влажность", - "int": 15, - "addr": "0x38", - "round": 1 - } - ], - "about": { - "authorName": "Serghei Crasnicov", - "authorContact": "https://t.me/Serghei63", - "authorGit": "https://github.com/Serghei63", - "specialThanks": "", - "moduleName": "Aht20", - "moduleVersion": "1.0", - "usedRam": 15, - "subTypes": [ - "Aht20t", - "Aht20h" - ], - "title": "Сенсор температуры и влажности AHT20", - "moduleDesc": "Позволяет получить температуру и влажность с Aht20.", - "propInfo": { - "pin": "GPIO номер, к которому подключен датчик.", - "addr": "Адрес датчика на шине, обычно 0x38.", - "int": "Количество секунд между опросами датчика." - } - }, - "defActive": true, - "devices": { - "esp32_4mb": [ - "Adafruit AHTX0" - ], - "esp8266_4mb": [ - "Adafruit AHTX0" - ] - } -} \ No newline at end of file From f32b05dd5bec7e5fe5d149c3a1a289d938f61515 Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:53:27 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D1=83=D0=B5=D0=BC=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20Linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/EspFileSystem.h | 2 +- src/NTP.cpp | 2 +- src/utils/TimeUtils.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/EspFileSystem.h b/include/EspFileSystem.h index 1906a6e2..5554dd49 100644 --- a/include/EspFileSystem.h +++ b/include/EspFileSystem.h @@ -2,7 +2,7 @@ #include "Global.h" #ifdef ESP32 #if USE_LITTLEFS -#include +#include #define FileFS LittleFS #define FS_NAME "LittleFS_32" #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1 diff --git a/src/NTP.cpp b/src/NTP.cpp index 2a3887fe..495ff9d2 100644 --- a/src/NTP.cpp +++ b/src/NTP.cpp @@ -1,7 +1,7 @@ #include "NTP.h" #include "Global.h" -#include "Utils\SerialPrint.h" +#include "utils/SerialPrint.h" void ntpInit() { synchTime(); diff --git a/src/utils/TimeUtils.cpp b/src/utils/TimeUtils.cpp index 8ed69931..d82467a8 100644 --- a/src/utils/TimeUtils.cpp +++ b/src/utils/TimeUtils.cpp @@ -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"; From e3ec40dec25797df406e472090c2f28a5c568df0 Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 21:07:49 +0300 Subject: [PATCH 9/9] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D1=83=D0=B5=D0=BC=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=BF=D1=80=D0=BE=D1=88=D0=B8=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=B4=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B4=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_svelte/items.json | 43 ++++++++++++++++++--------- platformio.ini | 66 ++++++++++++++++++++++-------------------- src/modules/API.cpp | 6 ++-- 3 files changed, 67 insertions(+), 48 deletions(-) diff --git a/data_svelte/items.json b/data_svelte/items.json index 9ac762bd..46e6b216 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -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 } ] \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 13928626..920bc4f8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -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 = - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [env:esp32_4mb_fromitems] lib_deps = diff --git a/src/modules/API.cpp b/src/modules/API.cpp index 467f8588..ab864765 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -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;