Last active
December 7, 2019 06:05
-
-
Save marcelstoer/59563e791effa4acb65f to your computer and use it in GitHub Desktop.
NodeMCU debounce based on timer with GPIO pullup
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- inspired by https://github.com/hackhitchin/esp8266-co-uk/blob/master/tutorials/introduction-to-gpio-api.md | |
-- and http://www.esp8266.com/viewtopic.php?f=24&t=4833&start=5#p29127 | |
local pin = 4 --> GPIO2 | |
function debounce (func) | |
local last = 0 | |
local delay = 50000 -- 50ms * 1000 as tmr.now() has μs resolution | |
return function (...) | |
local now = tmr.now() | |
local delta = now - last | |
if delta < 0 then delta = delta + 2147483647 end; -- proposed because of delta rolling over, https://github.com/hackhitchin/esp8266-co-uk/issues/2 | |
if delta < delay then return end; | |
last = now | |
return func(...) | |
end | |
end | |
function onChange () | |
print('The pin value has changed to '..gpio.read(pin)) | |
end | |
gpio.mode(pin, gpio.INT, gpio.PULLUP) -- see https://github.com/hackhitchin/esp8266-co-uk/pull/1 | |
gpio.trig(pin, 'both', debounce(onChange)) |
@Bop4yN you're missing that debounce
returns a function (line 9-17). So, every time the GPIO triggers it doesn't run debounce
but the function it returned when it was once (i.e. initially) called. That inner function has access to last
and keeps changing it.
-> https://en.wikipedia.org/wiki/Closure_(computer_programming)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm using the same routine for debouncing and the switch is having issues with controlling inductive loads. The button would get triggered as soon as the relay is switched remotely. I think the code would need to include some kind of logic to detect minimum time the button is pressed.
Also there is some chance (0.002%) that the code doesn't respond to button press due to the rollover of tmr.now() and the initial value of "last". Obviously not a problem for majority of applications but good to keep in mind.