Merge pull request #3 from avaksru/ver4dev

Multitouch
This commit is contained in:
2022-11-14 11:47:12 +05:00
committed by GitHub
6 changed files with 183 additions and 13 deletions

View File

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

View File

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

View File

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