Руки дошли, накидал модуль. Оный узнает три длительности нажатия, короткое, среднее и (никогда не догадаетесь!) длинное.
Короткое до секунды, среднее — более секунды, длинное — более 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;lt; 0 then exitnow(buf) end else exitnow(buf) end end if self.cicle &amp;amp;gt; 3 then self.startcount = true end if self.cicle &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
PANIC: unprotected error in call to Lua API (debMod.lua:17: bad argument #3 to ‘trig’ (invalid callback type))
НравитсяНравится
Прошу прощения.
17 строка модуля явно лишняя. Ее просто надо удалить.
Изменения внес. Спасибо!
НравитсяНравится
Здравствуйте! А if self.cicle &lt; 20 это self.cicle < 20 ?
НравитсяНравится
Да, никак не могу справиться с местным редактором.
НравитсяНравится
Спасибо за ответ! Но что то паника у нас тут(
PANIC: unprotected error in call to Lua API (key.lua:22: attempt to call field ‘stop’ (a nil value))
НравитсяНравится
Заглядывайте сюда: http://forum.amperka.ru/threads/arduino-esp8266-raspberry-pi-2-openhab-%D0%A3%D0%BC%D0%BD%D1%8B%D0%B9-%D0%B4%D0%BE%D0%BC-%D0%B0%D0%B7%D1%8B-%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F.5043/page-38#post-78140
Там обсудим. Местный редактор просто несносный.
НравитсяНравится
А что это за файл key.lua ?
НравитсяНравится
Это я так назвал файл с данным кодом!
НравитсяНравится
https://igorkandaurov.files.wordpress.com/2019/11/debmodthree.zip
НравитсяНравится