ESP8266运行NodeMCU - 检测脉冲流的开始/停止
2021-2-10 11:37:33
收藏:0
阅读:127
评论:2
大家好!
我为我的狗狗建造了一个自动、自动灌水的水碗,使用水位控制器,现在我想使用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)
终端输出如下:

我肯定是忽略了一些显而易见的东西,但我已经为此烦恼了几个小时了,还没有任何进展。如果我的啰嗦有意义,您有编码建议/解决方案,我很想听听。
谢谢!
点赞
用户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
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我会用更简单和更健壮的方法来解决问题:
flow_timer对象,就像您之前做过的那样flow_pin_cb),调用flow_timer:alarm(timeout, tmr.ALARM_SINGLE, flow_stop),其中timeout是连续流脉冲之间最长时间稍长一点的时间,flow_stop是在流停止时调用的函数flowingflow_pin_cb中,如果flowing是 false,则打印“Flow Detected”,并将flowing设置为 trueflow_stop中,打印“Flow Stopped”,并将flowing设置为 false