2017-08-20 97 views
0

我試圖從主版本中的NodeMU中讀取運行Lua 5.1.4的IR信息,截止日期爲8/19/2017。NodeMCU gpio觸發不正確

我可能會誤解GPIO的工作原理,而且我很難找到與我正在做什麼有關的示例。

pin = 4 
pulse_prev_time = 0 
irCallback = nil 

function trgPulse(level, now) 
    gpio.trig(pin, level == gpio.HIGH and "down" or "up", trgPulse) 

    duration = now - pulse_prev_time 
    print(level, duration) 

    pulse_prev_time = now 
end 

function init(callback) 
    irCallback = callback 
    gpio.mode(pin, gpio.INT) 
    gpio.trig(pin, 'down', trgPulse) 
end 

-- example 
print("Monitoring IR") 
init(function (code) 
    print("omg i got something", code) 
end) 

我觸發低頻初始中斷,然後從低交替到高trgPulse。在這樣做的時候,我希望水平從1到0以完美的模式交替出現。但是,輸出顯示其他:

1 519855430 
1 1197 
0 609 
0 4192 
0 2994 
1 589 
1 2994 
1 1198 
1 3593 
0 4201 
1 23357 
0 608 
0 5390 
1 1188 
1 4191 
1 1198 
0 3601 
0 3594 
1 25147 
0 608 
1 4781 
0 2405 
1 3584 
0 4799 
0 1798 
1 1188 
1 2994 

所以我清楚地做錯事或根本不明白GPIO是如何工作的。如果這是預期的,爲什麼如果低/高電平沒有改變,中斷被多次調用?如果這看起來不對,任何想法如何解決它?

+0

我對這個平臺並不熟悉,但是你確定你沒有在IR輸入上發出噪聲?我要做的第一件事是斷開連接並將輸入連接到地並看看會發生什麼。也不確定該平臺,但在某些微控制器上,如果您有空閒輸入可能連接到IR接收器併爲每個邊緣設置一個,則在中斷例程中更改中斷邊沿不能很好地工作。 – PeterJ

+0

閱讀IR信息是什麼意思?你連接到第4針是什麼? – Piglet

+0

我懷疑我是否聽到噪音,只是在點擊遙控器上的一個按鈕後,我纔看到數據中斷更改。它持續按下按鈕的時間,所以它看起來相當穩定。 我有一個紅外接收器連接到引腳4. – holmes

回答

0

我清楚地做錯事或根本不明白GPIO是如何工作的

我懷疑這是一個有點兩者的結合 - 後者可能是前者的原因。

從機械/電子的角度來看,我的解釋可能不是100%正確的(但不是我的世界),但只要爲GPIO編寫軟件就足夠了。開關傾向於在0和1之間反彈,直到它們最終達到一個。閱讀這篇文章的好文章是https://www.allaboutcircuits.com/technical-articles/switch-bounce-how-to-deal-with-it/。效果可以通過硬件和/或軟件解決。

與軟件做它通常涉及引入某種形式的延遲來跳過反彈信號,因爲你只對「穩定狀態」感興趣。我記錄我使用的是NodeMCU Lua的功能在https://gist.github.com/marcelstoer/59563e791effa4acb65f

-- inspired by https://github.com/hackhitchin/esp8266-co-uk/blob/master/tutorials/introduction-to-gpio-api.md 
-- and http://www.esp8266.com/viewtopic.php?f=24&t=4833&start=5#p29127 
local pin = 4 --> GPIO2 

function debounce (func) 
    local last = 0 
    local delay = 50000 -- 50ms * 1000 as tmr.now() has μs resolution 

    return function (...) 
     local now = tmr.now() 
     local delta = now - last 
     if delta < 0 then delta = delta + 2147483647 end; -- proposed because of delta rolling over, https://github.com/hackhitchin/esp8266-co-uk/issues/2 
     if delta < delay then return end; 

     last = now 
     return func(...) 
    end 
end 

function onChange() 
    print('The pin value has changed to '..gpio.read(pin)) 
end 

gpio.mode(pin, gpio.INT, gpio.PULLUP) -- see https://github.com/hackhitchin/esp8266-co-uk/pull/1 
gpio.trig(pin, 'both', debounce(onChange)) 

注:delay是特定於傳感器的經驗值/開關!

+0

聽起來很可能。我會試試看! – holmes