解释方波的问题

Problems interpreting a square wave

我正在尝试使用 ESP8266 SoC 读取据说会产生方波作为输出的水流传感器。我认为在中断模式下使用 GPIO 端口来计算上升沿转换是一件简单的事情——事实上这最初似乎可行。然后我将固件从0.96升级到1.5,然后它就停止工作了,轮子旋转时我看不到任何过渡。

但是,如果我 运行 将一根线连接到引脚 [用于我正在使用的 GPIO] 并立即将其连接到 VCC,中断例程将按预期调用,因此我知道传感器已连接到正确的引脚,并且中断例程已正确注册。我的代码:

function intCb(level)
    SpinCount = SpinCount + 1
    local levelString = "up"
    if level == gpio.HIGH then
        levelString = "down"
    end
    gpio.trig(pin, levelString, intCb)
end
gpio.write(pin, 0)
gpio.trig(pin, "up", intCb)
gpio.mode(pin, gpio.INT, gpio.FLOAT)

那我错过了什么?我是否需要更多支持电路来读取方波作为输入?如果是这样,那么它最初是如何工作的?

对于涉及硬件的任何事情,在这里很难给出明确的答案。在大多数情况下,它基于提示(有时是预感)。一些想法:

  • gpio.FLOAT 可能应该是 gpio.PULLUP(除非你有外部上拉电阻)。
  • 您的设置似乎与例如使用按钮或开关触发某些事件。因此,您可能想使用某种去抖或节流功能。
  • 因为你似乎对上升 下降沿都感兴趣(当你在 updown 之间切换时)你不妨听听对于 both,没有?

所以,假设我得出了正确的结论,类似下面的内容 generic skeleton 可能会被证明是有用的:

-- 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 = 5000

    return function (...)
        local now = tmr.now()
        local delta = now - last
        -- if delta < 0 then delta = delta + 2147483647 end; proposed because of delta rolling over
        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))

我使用 555 定时器芯片作为施密特触发器解决了这个问题: