Debounce кнопки. настройка. lua

Тема в разделе "ESP8266, ESP32", создана пользователем Nikomas, 4 июн 2020.

  1. Nikomas

    Nikomas Нерд

    Друзья, нашел код на просторах для подавления дребезга кнопки:
    Код (Lua):

    do
       local pin = 2
     
       function debounce (func)
         local last = 0
         local delay = 50000
     
         return function (...)
           local now = tmr.now()
           if now - last < 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.trig(pin, 'both', debounce(onChange))
    end
     
    какие значения не подставлял в local last и local delay иногда дребезг проскакивает:
    Код (Lua):

    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 1 -- вот повтор
    The pin value has changed to 1
    The pin value has changed to 0
    The pin value has changed to 1
    The pin value has changed to 0
     
     
  2. ИгорьК

    ИгорьК Гуру

    Нет бы на этом сайте поискать или на моем личном.
     
  3. Nikomas

    Nikomas Нерд

    Искал)) Нашел!
    Код (Lua):
    do-- нога номр 4
    local pin = 4    --> GPIO2

    -- Принимаем в качестве аргумента функцию
    function debounce (func)
        -- Переменные для работой со временем
        local last = 0
        local delay = 200000
        -- возвращаем функцию, которая принимает любой набор аргументов, если таковые есть
        return function (...)
            -- время сейчас
            local now = tmr.now()
            -- прошло времени - дельта
            local delta = now - last
            -- исправляем дельту с учетом того, что счетчик сбрасывается
            -- в 0 при достижении 31 разряда в 32 битном числе
            if delta < 0 then delta = delta + 2147483647 end
            -- если меньше уставновленного времени - возврат
            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.trig(pin, 'both', debounce(onChange))
    end
    Но все равно дребезг проскакивает. Ваш личный сайт тоже нашел. Код ваш на различные поведения кнопок - видел. На досуге его ковыряю и изучаю.