我已经开始在esp8266上使用nodemcu了。我已经把esp和hc-sr04 (超声波测距传感器)连接起来了。hc-sr04需要接收触发引脚10us的高状态。在此之后,hc发送echo引脚的高状态。从回波引脚到高状态的时间可以是不同的(取决于距离)。时间是以我们为单位计算的。问题是这次来自回声引脚的时间不正确(IMHO)。我不确定,但是有没有可能是tmr。来自nodemcu的数据不够精确吗?为什么每个循环的时间会有这么大的差异?
我的代码和下面的代码,你会发现代码中的时间打印:
gpio.write(3,gpio.LOW)
gpio.mode(3,gpio.OUTPUT)
gpio.write(4,gpio.LOW)
gpio.mode(4,gpio.INT)
time=0
flag=0
i=1
function startDis(level)
time=tmr.now()
end
function endDis(level)
time=tmr.now()-time
flag=0
end
function trigger()
gpio.write(3,gpio.HIGH)
tmr.delay(10)
gpio.write(3,gpio.LOW)
flag=1
end
gpio.trig(4,'up',startDis)
gpio.trig(4,'down',endDis)
// -此部分已更改
while i<10 do
if flag==0 then
trigger()
end
tmr.delay(1000000)
print(time)
i=i+1
end
//
tmr.alarm(0,2000,1,function()
print(time)
print(i)
if flag==0 then
trigger()
end
i=i+1
if i==10 then tmr.stop(0) end
end)
代码打印:
0
440184038
1999856
442183990
4000221
444184055
6000175
446184287
7999686
感谢您提供的线索和解决方案。
发布于 2015-09-10 05:48:03
Petre,我之所以这样做是因为它不适合快速评论。:(
您需要阅读FAQ中关于整体SDK如何调度任务的其他一些讨论。你在你的代码中假设会发生这样的事情:
<every 2mSec>
print(time)
print(i)
if flag==0 then
gpio.write(3,gpio.HIGH)
time=tmr.now()
tmr.delay(10)
gpio.write(3,gpio.LOW)
time=tmr.now()-time
flag=0
flag=1
end
i=i+1
if i==10 then tmr.stop(0) end
在现实中发生的事情更接近于:
<every 2mSec task starts>
print(time)
print(i)
if flag==0 then
gpio.write(3,gpio.HIGH)
<H/W interupts calls low level GPIO which books up callback>
time=tmr.now()
tmr.delay(10)
<H/W interupts calls low level GPIO which books down callback>
gpio.write(3,gpio.LOW)
flag=1
end
i=i+1
if i==10 then tmr.stop(0) end
<task ends>
<possible TCP and other tasks run>
<up trigger is delivered>
time=tmr.now()
<task ends>
<possible TCP and other tasks run>
<down trigger is delivered>
time=tmr.now()-time
flag=0
<task ends>
Esp8266软件开发工具包不是实时操作系统;它是事件驱动的。需要重新定位的是你的心态。
以这种方式使用tmr.delay()
是正确的,但您需要使用示波器或逻辑分析仪等硬件测试工具来检查实际延迟是多少,因为您需要增加处理Lua指令的时间。或者甚至将tmr.now()调用内联。
触发器的真正用法是将输入连接到传感器,例如机械打开/关闭检测器,这样就不需要轮询它。
https://stackoverflow.com/questions/32428274
复制相似问题