0

我正在尝试使用 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)

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

4

2 回答 2

2

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

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

因此,假设我得出了正确的结论,类似以下通用骨架的东西可能会被证明是有用的:

-- 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))
于 2016-03-25T20:15:33.863 回答
1

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

原理图

于 2016-03-28T08:15:03.283 回答