diff --git a/data_svelte/items.json b/data_svelte/items.json index 37fbeb62..6216f176 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -78,6 +78,10 @@ "descr": "Введите число", "int": "0", "val": "0.0", + "map": "1024,1024,1,100", + "plus": 0, + "multiply": 1, + "round": 0, "num": 5 }, { @@ -545,7 +549,6 @@ "int": 5 }, { - "global": 0, "name": "39. UART", "type": "Reading", "subtype": "UART", @@ -555,7 +558,9 @@ "id": "u", "tx": 12, "rx": 13, + "line": 2, "speed": 9600, + "eventFormat": 0, "num": 39 }, { @@ -639,7 +644,25 @@ }, { "global": 0, - "name": "45. Расширитель портов Pcf8574", + "name": "45. Сенсорная кнопка", + "type": "Writing", + "subtype": "Multitouch", + "id": "impulse", + "widget": "anydataDef", + "page": "Кнопки", + "descr": "Количество нажаний", + "needSave": 0, + "int": 300, + "inv": 1, + "pin": 16, + "pinMode": "INPUT", + "debounceDelay": 50, + "PWMDelay": 500, + "num": 45 + }, + { + "global": 0, + "name": "46. Расширитель портов Pcf8574", "type": "Reading", "subtype": "Pcf8574", "id": "Pcf", @@ -649,11 +672,11 @@ "int": "0", "addr": "0x20", "index": 1, - "num": 45 + "num": 46 }, { "global": 0, - "name": "46. PWM ESP8266", + "name": "47. PWM ESP8266", "type": "Writing", "subtype": "Pwm8266", "id": "pwm", @@ -665,11 +688,11 @@ "freq": 5000, "val": 0, "apin": -1, - "num": 46 + "num": 47 }, { "global": 0, - "name": "47. Телеграм-Лайт", + "name": "48. Телеграм-Лайт", "type": "Writing", "subtype": "TelegramLT", "id": "tg", @@ -678,14 +701,14 @@ "descr": "", "token": "", "chatID": "", - "num": 47 + "num": 48 }, { "header": "Экраны" }, { "global": 0, - "name": "48. LCD экран 2004", + "name": "49. LCD экран 2004", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -697,10 +720,10 @@ "size": "20,4", "coord": "0,0", "id2show": "id датчика", - "num": 48 + "num": 49 }, { - "name": "49. LCD экран 1602", + "name": "50. LCD экран 1602", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -712,11 +735,11 @@ "size": "16,2", "coord": "0,0", "id2show": "id датчика", - "num": 49 + "num": 50 }, { "global": 0, - "name": "50. Strip ws2812b", + "name": "51. Strip ws2812b", "type": "Reading", "subtype": "Ws2812b", "id": "strip", @@ -732,6 +755,6 @@ "min": "15", "max": "30", "idshow": "t", - "num": 50 + "num": 51 } ] \ No newline at end of file diff --git a/myProfile.json b/myProfile.json index 9918d45c..132010d9 100644 --- a/myProfile.json +++ b/myProfile.json @@ -107,6 +107,10 @@ "path": "src/modules/sensors/Hdc1080", "active": true }, + { + "path": "src/modules/sensors/Ina219", + "active": false + }, { "path": "src/modules/sensors/IoTWiegand", "active": false @@ -173,6 +177,10 @@ "path": "src/modules/exec/Mp3", "active": true }, + { + "path": "src/modules/exec/Multitouch", + "active": true + }, { "path": "src/modules/exec/Pcf8574", "active": true diff --git a/platformio.ini b/platformio.ini index c68e8c20..3a5c9816 100644 --- a/platformio.ini +++ b/platformio.ini @@ -185,6 +185,7 @@ build_src_filter = + + + + + + + + diff --git a/src/modules/API.cpp b/src/modules/API.cpp index 5756874b..2935ae36 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -27,6 +27,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_Multitouch(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); @@ -62,6 +63,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_Multitouch(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; diff --git a/src/modules/exec/Multitouch/Multitouch.cpp b/src/modules/exec/Multitouch/Multitouch.cpp new file mode 100644 index 00000000..9e6b30ba --- /dev/null +++ b/src/modules/exec/Multitouch/Multitouch.cpp @@ -0,0 +1,94 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +extern IoTGpio IoTgpio; + +class Multitouch : public IoTItem +{ +private: + int _pin; + int _int; + int _inv; + String _pinMode; + int _lastButtonState = LOW; + unsigned long _lastDebounceTime = 0; + unsigned long timing; + long _debounceDelay = 50; + long _PWMDelay = 500; + int _buttonState; + int _reading; + int _count = 0; + int duration = 0; + +public: + Multitouch(String parameters) : IoTItem(parameters) + { + jsonRead(parameters, "pin", _pin); + jsonRead(parameters, "pinMode", _pinMode); + jsonRead(parameters, "debounceDelay", _debounceDelay); + jsonRead(parameters, "PWMDelay", _PWMDelay); + jsonRead(parameters, "int", _int); + jsonRead(parameters, "inv", _inv); + _round = 0; + + IoTgpio.pinMode(_pin, INPUT); + if (_pinMode == "INPUT_PULLUP") + IoTgpio.digitalWrite(_pin, HIGH); + else if (_pinMode == "INPUT_PULLDOWN") + IoTgpio.digitalWrite(_pin, LOW); + + value.valD = _buttonState = IoTgpio.digitalRead(_pin); + // сообщаем всем о стартовом статусе без генерации события + regEvent(_buttonState, "", false, false); + } + + void loop() + { + _reading = IoTgpio.digitalRead(_pin); + if (_reading != _lastButtonState) + { + _lastDebounceTime = millis(); + } + + if ((millis() - _lastDebounceTime) > _debounceDelay) + { + if (millis() - timing > _int && _reading == _inv && millis() - _lastDebounceTime > _PWMDelay) + { + timing = millis(); + duration = millis() - _lastDebounceTime - _PWMDelay; + value.valD = duration / 50; + regEvent(value.valD, "Multitouch"); + _count = -1; + } + + if (_reading != _buttonState) + { + _buttonState = _reading; + _count++; + duration = 0; + } + + if (1 < _count && millis() > _lastDebounceTime + _PWMDelay) + { + value.valD = _count / 2; + regEvent(value.valD, "Multitouch"); + _count = 0; + } + } + _lastButtonState = _reading; + } + + ~Multitouch(){}; +}; + +void *getAPI_Multitouch(String subtype, String param) +{ + if (subtype == F("Multitouch")) + { + return new Multitouch(param); + } + else + { + return nullptr; + } +} \ No newline at end of file diff --git a/src/modules/exec/Multitouch/modinfo.json b/src/modules/exec/Multitouch/modinfo.json new file mode 100644 index 00000000..26d5c6ca --- /dev/null +++ b/src/modules/exec/Multitouch/modinfo.json @@ -0,0 +1,51 @@ +{ + "menuSection": "Исполнительные устройства", + "configItem": [ + { + "global": 0, + "name": "Сенсорная кнопка", + "type": "Writing", + "subtype": "Multitouch", + "id": "impulse", + "widget": "anydataDef", + "page": "Кнопки", + "descr": "Количество нажаний", + "needSave": 0, + "int": 300, + "inv": 1, + "pin": 16, + "pinMode": "INPUT", + "debounceDelay": 50, + "PWMDelay": 500 + } + ], + "about": { + "authorName": "AVAKS", + "authorContact": "https://t.me/@avaks_dev", + "authorGit": "https://github.com/avaksru", + "specialThanks": "", + "moduleName": "Multitouch", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Модуль чтения состояния GPIO (pin)", + "moduleDesc": "Считает количество нажатий на выключатель без фиксации или сенсорную кнопку. При удержании кнопки нажатой - считает длительность нажатия. Позволяет реализовать логику работы: включения различных устройств в зависимости от количества нажатий, диммировать яркость удержанием выключателя нажатым, а так же счетчик импульсов, дверной звонок, сенсорный выключатель, концевой выключатель, датчик открытия окна, и т.п.", + "propInfo": { + "int": "Интервал отправки времени удержания кнопки (миллисекунд)", + "pin": "Укажите GPIO номер пина для чтения состояний подключенной кнопки", + "inv": "Инверсия GPIO", + "pinMode": "Может быть INPUT_PULLUP INPUT_PULLDOWN INPUT", + "debounceDelay": "Время обработки дребезга (миллисекунд)", + "PWMDelay": "Время ожидания повторного нажатия. И время после которого начитается отсчет длительности непрерывного ражатия (миллисекунд)" + } + }, + "defActive": true, + "usedLibs": { + "esp32_4mb": [], + "esp8266_4mb": [], + "esp8266_1mb": [], + "esp8266_1mb_ota": [] + } +} diff --git a/src/modules/sensors/Ina219/Ina219.cpp b/src/modules/sensors/Ina219/Ina219.cpp new file mode 100644 index 00000000..6ab65897 --- /dev/null +++ b/src/modules/sensors/Ina219/Ina219.cpp @@ -0,0 +1,136 @@ +/****************************************************************** + Used Adafruit INA219 Current Sensor + Support for INA219 + https://github.com/adafruit/Adafruit_INA219 + + adapted for version 4dev @Serghei63 + ******************************************************************/ + +#include "Global.h" +#include "classes/IoTItem.h" + +#include +#include + +Adafruit_INA219 ina219; + + float shuntvoltage = 0; + float busvoltage = 0; + float current_mA = 0; + float loadvoltage = 0; + float power_mW = 0; + + // shuntvoltage = ina219.getShuntVoltage_mV(); // Получение напряжение на шунте + // busvoltage = ina219.getBusVoltage_V(); // Получение значение напряжения V + // current_mA = ina219.getCurrent_mA(); // Получение значение тока в мА + // power_mW = ina219.getPower_mW(); // Получение значение мощности + // loadvoltage = busvoltage + (shuntvoltage / 1000); // Расчет напряжение на нагрузки + + class Ina219loadvoltage : public IoTItem { + public: + Ina219loadvoltage(String parameters) : IoTItem(parameters) { + + // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 + } + + void doByInterval() { + + loadvoltage = busvoltage + (shuntvoltage / 1000); + value.valD = loadvoltage; + + regEvent(value.valD, "Ina219loadvoltage"); + } + + ~Ina219loadvoltage(){}; +}; + + class Ina219busvoltage : public IoTItem { + public: + Ina219busvoltage(String parameters) : IoTItem(parameters) { + + // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 + } + + void doByInterval() { + + busvoltage = ina219.getBusVoltage_V(); + value.valD = busvoltage; + + regEvent(value.valD, "Ina219busvoltage"); + } + + ~Ina219busvoltage(){}; +}; + + +class Ina219curr : public IoTItem { + public: + Ina219curr(String parameters) : IoTItem(parameters) { + + // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 + } + void doByInterval() { + + current_mA = ina219.getCurrent_mA(); + value.valD = current_mA; + + regEvent(value.valD, "Ina219curr"); + } + + ~Ina219curr(){}; +}; + +class Ina219shuntvoltage : public IoTItem { + public: + Ina219shuntvoltage(String parameters) : IoTItem(parameters) { + + // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 + } + void doByInterval() { + + shuntvoltage = ina219.getShuntVoltage_mV(); + value.valD = shuntvoltage; + + regEvent(value.valD, "Ina219shuntvoltage"); + } + + ~Ina219shuntvoltage(){}; +}; + +class Power_mW : public IoTItem { + public: + Power_mW(String parameters) : IoTItem(parameters) { + + // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 + } + void doByInterval() { + + power_mW = ina219.getPower_mW(); + value.valD = power_mW; + + regEvent(value.valD, "Ina219power"); // TODO: найти способ понимания ошибки получения данных + + } + + ~Power_mW(){}; +}; +void* getAPI_Ina219(String subtype, String param) { + if (subtype == F("Ina219curr")) { + ina219.begin(); + return new Ina219curr(param); + } else if (subtype == F("Ina219shuntvoltage")) { + ina219.begin(); + return new Ina219shuntvoltage(param); + } else if (subtype == F("power_mW")) { + ina219.begin(); + return new Power_mW(param); + } else if (subtype == F("Ina219busvoltage")) { + ina219.begin(); + return new Ina219busvoltage(param); + } else if (subtype == F("Ina219loadvoltage")) { + ina219.begin(); + return new Ina219loadvoltage(param); + } else { + return nullptr; + } +} diff --git a/src/modules/sensors/Ina219/modinfo.json b/src/modules/sensors/Ina219/modinfo.json new file mode 100644 index 00000000..1dc9638f --- /dev/null +++ b/src/modules/sensors/Ina219/modinfo.json @@ -0,0 +1,99 @@ +{ + "menuSection": "Сенсоры", + + "configItem": [{ + "global": 0, + "name": "INA219 Tок", + "type": "Reading", + "subtype": "Ina219curr", + "id": "Ina219current", + "widget": "anydatamAmp", + "page": "INA 219", + "descr": "219 Датчик тока", + "int": 10 + }, + { + "global": 0, + "name": "INA219 Напряжение", + "type": "Reading", + "subtype": "Ina219busvoltage", + "id": "Ina219busvoltage", + "widget": "anydataVlt", + "page": "INA 219", + "descr": "219 Датчик напряжения", + "int": 10 + }, + { + "global": 0, + "name": "INA219 Мощность", + "type": "Reading", + "subtype": "power_mW", + "id": "Ina219power", + "widget": "anydatamWtt", + "page": "INA 219", + "descr": "219 Мощность", + "int": 10 + }, + { + "global": 0, + "name": "INA219 Напряжение нагрузки", + "type": "Reading", + "subtype": "Ina219loadvoltage", + "id": "Ina219loadvoltage", + "widget": "anydataVlt", + "page": "INA 219", + "descr": "219 Напряжение нагрузки", + "int": 10 + }, + { + "global": 0, + "name": "INA219 Шунт", + "type": "Reading", + "subtype": "Ina219shuntvoltage", + "id": "Ina219shuntvoltage", + "widget": "anydatamVlt", + "page": "INA 219", + "descr": "219 Напряжение шунта", + "int": 10 + }], + + "about": { + "authorName": "Serghei Crasnicov", + "authorContact": "https://t.me/Serghei63", + "authorGit": "https://github.com/Serghei63", + "specialThanks": "Дмитрий , Serg", + "moduleName": "Ina219", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "subTypes": [ + "Ina219curr", + "Ina219busvoltage", + "power_mW", + "Ina219loadvoltage", + "Ina219shuntvoltage" + ], + "title": "Милливатметр постоянного тока", + "moduleDesc": "Измеряет постоянный ток до 3.2 ампера, напряжение до 26 вольт и мощность на нагрузке", + "propInfo": { + "int": "Количество секунд между опросами датчика." + } + }, + + "defActive": false, + + "usedLibs": { + "esp32_4mb": [ + "https://github.com/adafruit/Adafruit_INA219.git" + ], + + "esp8266_4mb": [ + "https://github.com/adafruit/Adafruit_INA219.git" + ] + } + + } + + \ No newline at end of file