首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >nodemcu + esp8266 + hc-sr04 - tmr.now()差异不正确

nodemcu + esp8266 + hc-sr04 - tmr.now()差异不正确
EN

Stack Overflow用户
提问于 2015-09-07 05:01:47
回答 1查看 3.7K关注 0票数 1

我已经开始在esp8266上使用nodemcu了。我已经把esp和hc-sr04 (超声波测距传感器)连接起来了。hc-sr04需要接收触发引脚10us的高状态。在此之后,hc发送echo引脚的高状态。从回波引脚到高状态的时间可以是不同的(取决于距离)。时间是以我们为单位计算的。问题是这次来自回声引脚的时间不正确(IMHO)。我不确定,但是有没有可能是tmr。来自nodemcu的数据不够精确吗?为什么每个循环的时间会有这么大的差异?

我的代码和下面的代码,你会发现代码中的时间打印:

代码语言:javascript
运行
复制
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)

// -此部分已更改

代码语言:javascript
运行
复制
while i<10 do
    if flag==0 then
        trigger()
    end
    tmr.delay(1000000)
    print(time)
    i=i+1
end

//

代码语言:javascript
运行
复制
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)

代码打印:

代码语言:javascript
运行
复制
0
440184038
1999856
442183990
4000221
444184055
6000175
446184287
7999686

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

EN

回答 1

Stack Overflow用户

发布于 2015-09-10 05:48:03

Petre,我之所以这样做是因为它不适合快速评论。:(

您需要阅读FAQ中关于整体SDK如何调度任务的其他一些讨论。你在你的代码中假设会发生这样的事情:

代码语言:javascript
运行
复制
<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

在现实中发生的事情更接近于:

代码语言:javascript
运行
复制
<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()调用内联。

触发器的真正用法是将输入连接到传感器,例如机械打开/关闭检测器,这样就不需要轮询它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32428274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档