2015-09-06 4 views
1

Я начал использовать nodemcu на esp8266. Я подключил esp с hc-sr04 (ультразвуковой датчик для измерения расстояния). hc-sr04 необходимо получить высокое состояние для триггера для 10us. После этого hc посылает высокое состояние эхо-сигнала. Время высокого состояния от эхо-сигнала может быть различным (зависит от расстояния). Время подсчитывается в нас. Проблема в том, что на этот раз из эхо-сигнала неверно (IMHO). Я не уверен, но возможно ли, что tmr. от nodemcu не так точно, как нужно? И почему существует так большая разница между временами в каждом цикле?nodemcu + esp8266 + hc-sr04 - неверно неверно tmr.now()

Мой код и ниже вы найдете время тиражи из кода:

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 

Спасибо за подсказки и решения.

+0

Есть Распознать [Когда и почему следует избегать использования tmr.delay()?] (Http://www.esp8266.com/wiki/doku.php?id=nodemcu-unofficial-faq#when_and_why_should_i_avoid_using_tmrdelay) – TerryE

+0

@TerryE Я читал это, и я сделал несколько изменений. Больше нет задержки в петле (только для подъема штыря для 10us). Вместо этого я использовал tmr.alarm. Как вы заметили, времена все еще странные. – Petre

ответ

0

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 SDK не является реальным в реальном масштабе времени O/S, он приводится в движение события это ваше мышление, что нужно, чтобы получить переориентирована

U.. петь tmr.delay(), этот способ - правильное использование, но вам нужны инструменты тестирования HW, такие как осциллограф или логический анализатор, чтобы проверить, что такое фактическая задержка, потому что вам нужно добавить время для обработки инструкций Lua. Или даже поместите вызовы tmr.now() inline.

Настоящая утилита для триггера - это то, где у вас есть вход, подключенный к датчику, такой как механический детектор открытия/закрытия, и это позволяет избежать опроса.

Смежные вопросы