解释方波的问题
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
(除非你有外部上拉电阻)。
- 您的设置似乎与例如使用按钮或开关触发某些事件。因此,您可能想使用某种去抖或节流功能。
- 因为你似乎对上升 和 下降沿都感兴趣(当你在
up
和 down
之间切换时)你不妨听听对于 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 定时器芯片作为施密特触发器解决了这个问题:
我正在尝试使用 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
(除非你有外部上拉电阻)。- 您的设置似乎与例如使用按钮或开关触发某些事件。因此,您可能想使用某种去抖或节流功能。
- 因为你似乎对上升 和 下降沿都感兴趣(当你在
up
和down
之间切换时)你不妨听听对于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 定时器芯片作为施密特触发器解决了这个问题: