Модуль антидребезга для ESP-8266 (lua debounce)

Руки дошли, накидал модуль. Оный узнает три длительности нажатия, короткое, среднее и (никогда не догадаетесь!) длинное.

Короткое до секунды, среднее — более секунды, длинное — более 2,5. Или сами настроите.

При удержании более 2,5 с оно срабатывает без дальнейшего выяснения физических возможностей нажимающего.
Можно применять не все или пропускать применение нажатия.

Вот модуль с именем debMod.lua:

do
local function setnew (pin)
    return {}
end
local M = {}
M.set = function(pin, short, med, long)
    gpio.mode(pin, gpio.INPUT, gpio.PULLUP)
    local o = setnew ()
    o.buttonPin = pin
    o.cicle = 0
    o.startcount = false
    o.gotpress = false
    o.doshort = short
    o.domedium = med or o.doshort
    o.doendcile = long or o.domedium
    o.startpin = function(self)
        gpio.trig(self.buttonPin, "down",function (level)
            if self.gotpress == false then
                self.gotpress = true
                local endflag = false
                local function exitnow(buf)
                    tmr.stop(buf); tmr.unregister( buf)
                    if not endflag then
                        if self.cicle < 20 then self.doshort()
                        else self.domedium() end
                    end
                    self.cicle, self.gotpress, self.startcount = 0, false, false
                end
                local buf = tmr.create()
                buf:alarm(50, 1, function()
                    if gpio.read(self.buttonPin) == 0 then
                        self.cicle = self.cicle + 1
                    else
                        if not self.startcount then
                            self.cicle = self.cicle - 1
                            if self.cicle &amp;amp;amp;lt; 0 then exitnow(buf) end
                        else
                            exitnow(buf)
                        end
                    end
                    if self.cicle &amp;amp;amp;gt; 3 then self.startcount = true end
                    if self.cicle &amp;amp;amp;gt; 50 and not endflag then
                        endflag = true; self.doendcile()
                    end
                end)
            end
        end)
    end
    return o:startpin()
end
return M
end

Применение:

do
-- Это пример функций для завеса на кнопки
function doshort()
    print("Short pressed 3")
end
function domedium()
    print("Medium pressed 3")
end
function dolong()
    print("Stop pressing 3, enough!")
end
function doshort4()
    print("Short pressed 4")
end
function domedium4()
    print("Medium pressed 4")
end
function dolong4()
    print("Stop pressing 4, enough!")
end

-- Загружаем модуль
deb = require("debMod")
-- И запускаем в работу одной строкой на каждую кнопку
deb.set(3, doshort, domedium, dolong)
deb.set(4, doshort4, domedium4, dolong4)

-- Иные варианты применения
-- Можно использовать одну или несколько кнопок
--[[
deb.set(3, doshort) -- только кнопка, сколько не жми
deb.set(3, doshort, nil, dolong) -- здесь короткое(оно же среднее)  или длинное
deb.set(3, doshort, domedium) -- здесь длинное дублирует среднее
deb.set(4, doshort, dolong4) -- здесь пересечение функций на разных кнопках (вместе с предыдущей строкой)
--]]
end

Модуль антидребезга для ESP-8266 (lua debounce): 9 комментариев

      1. Спасибо за ответ! Но что то паника у нас тут(
        PANIC: unprotected error in call to Lua API (key.lua:22: attempt to call field ‘stop’ (a nil value))

        Нравится

Оставьте комментарий