ESP8266运行NodeMCU - 检测脉冲流的开始/停止

大家好!

我为我的狗狗建造了一个自动、自动灌水的水碗,使用水位控制器,现在我想使用ESP8266添加一些监控功能。例如检测水流或是否发生溢出。

监视水位传感器和溢流传感器都没有问题,但我卡在检测水流的地方。

我有一个霍尔效应流量传感器,当水流通过时发送一个1/0脉冲流,我可以使用GPIO引脚上的中断来检测它。我的问题是我无法理解一种可靠地检测脉冲何时停止的方法。

我目前的解决方案是计算脉冲并将值写入计数器,然后将测试计数器设置为它。我的想法是,只要水流不断,计数就会继续变化,一旦水停止,计数将保持相等。所有这些都是在触发GPIO中断时使用定时器来完成的。

它基本上可以正常工作,但是当定时器触发时,它会检查两个计数器的值,并且在某一时刻它们相同,因此表示流已经停止了一次,然后再次检测到流。这就是我试图克服的行为。

我的天啊,我知道这很长,很抱歉!

我的代码如下所示:

flow_sense_pin = 1

flow_counter = 0

test_counter = 0

flow = false

flow_timer = tmr.create()
flow_timer:register(4000, tmr.ALARM_AUTO, function() test_flow() end)

gpio.mode(flow_sense_pin,gpio.INT)

function flow_pin_cb(level)
    gpio.trig(flow_sense_pin, level == gpio.HIGH and "down" or "up")
    flow_counter = flow_counter + 1
    test_counter = flow_counter
    if flow == true then else print("Flow Detected") end
    flow = true
    flow_timer:start()
end

function test_flow()
    if test_counter == flow_counter then flow = false end
    if flow == false then flow_timer:stop() print("Flow Stopped") end
end

gpio.trig(flow_sense_pin, "down", flow_pin_cb)

终端输出如下:

1

我肯定是忽略了一些显而易见的东西,但我已经为此烦恼了几个小时了,还没有任何进展。如果我的啰嗦有意义,您有编码建议/解决方案,我很想听听。

谢谢!

点赞
用户2413201
用户2413201

我会用更简单和更健壮的方法来解决问题:

  • 创建 flow_timer 对象,就像您之前做过的那样
  • 在由流脉冲触发的函数中(flow_pin_cb),调用 flow_timer:alarm(timeout, tmr.ALARM_SINGLE, flow_stop),其中 timeout 是连续流脉冲之间最长时间稍长一点的时间, flow_stop 是在流停止时调用的函数
  • 使用一个标志,我们称之为 flowing
    • flow_pin_cb 中,如果 flowing 是 false,则打印“Flow Detected”,并将 flowing 设置为 true
    • flow_stop 中,打印“Flow Stopped”,并将 flowing 设置为 false
2021-02-09 19:02:32
用户15177097
用户15177097

我仍然需要进行一些脉冲宽度测试,但是它运行得很好,而且新代码要简单得多!谢谢!

新代码要简单得多:

flow_sense_pin = 1

timeout = 1000

flow_timer = tmr.create()

flowing = false

gpio.mode(flow_sense_pin,gpio.INT)

function flow_pin_cb(level)
    gpio.trig(flow_sense_pin, level == gpio.HIGH and "down" or "up")
    if flowing == false then print("Flow Detected") flowing = true end
    flow_timer:alarm(timeout, tmr.ALARM_SINGLE, flow_stop)
end

function flow_stop()
    print("Flow Stopped")
    flowing = false
end

gpio.trig(flow_sense_pin, "down", flow_pin_cb)
2021-02-10 11:47:01