1

我已经开始在 esp8266 上使用 nodemcu。我已将 esp 与 hc-sr04(用于距离测量的超声波传感器)连接起来。hc-sr04 需要接收高电平触发引脚 10us。之后,hc 发送回显引脚的高电平状态。来自回波引脚的高状态时间可以不同(取决于距离)。时间在我们里面计算。问题是这次来自回显引脚的时间不正确(恕我直言)。我不确定,但这可能是 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

感谢您提供线索和解决方案。

4

1 回答 1

0

彼得,我会这样做作为答案,因为它不适合快速评论。:(

您需要阅读常见问题解答中关于整体 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 SDK 不是实时操作系统;它是事件驱动的。需要重新定位的是你的心态。

使用tmr.delay()这种方式是正确的使用方式,但是您需要硬件测试工具,例如示波器或逻辑分析仪来检查实际延迟是多少,因为您需要添加处理 Lua 指令的时间。或者甚至将 tmr.now() 调用内联。

触发器的真正用例是您将输入连接到传感器(例如机械开/关检测器),这样就无需轮询它。

于 2015-09-09T21:48:02.810 回答