2013-11-28 110 views
2

更新:重寫代碼,但仍然沒有工作問題轉換Python腳本的Node.js

下面的新代碼仍然是複製的Python腳本的功能,但試圖把事情簡單化(也使用一個不同的庫https://npmjs.org/package/rpi-gpio) 現在的問題是總會得到類似的回讀,所以顯然不使用來自GPIO引腳的反饋。

var gpio = require('rpi-gpio'); 

var pin = 12, 
    delay = 0.0005, 
    startTime, 
    endTime, 
    duration, 
    distance; 

function on(){ 
    setTimeout(gpio.write(pin,1,off),delay); 
} 

function off(){ 
    setTimeout(gpio.write(pin,0,listen),delay); 
} 

function listen(){ 
    gpio.setup(pin, gpio.DIR_IN); 
    startTime = Date.now(); 
    console.log('Start: ' + String(startTime)); 
    return; 
} 

gpio.on('change', function(channel, value) { 
    endTime = Date.now(); 
    console.log('End: ' + String(endTime)); 
    duration = endTime - startTime; 
    console.log('Duration: ' + String(duration)); 
    distance = ((duration/100) * 3400)/2; 
    console.log(distance); 
    return process.exit(0); 
}); 
gpio.setup(pin, gpio.DIR_OUT, on); 

原帖

我想工作的python腳本轉換爲我的RPI開發項目的一部分,爲的node.js,以避免需要使用WebSockets。

這是工作Python腳本:

import time 
import RPi.GPIO as GPIO 
import websocket 

for x in range(0, 10): 

    GPIO.setmode(GPIO.BOARD) 
    GPIO.setup(12, GPIO.OUT) 

    #cleanup output 
    GPIO.output(12, 0) 

    time.sleep(0.000002) 

    #send signal 
    GPIO.output(12, 1) 

    time.sleep(0.000005) 

    GPIO.output(12, 0) 

    GPIO.setup(12, GPIO.IN) 

    while GPIO.input(12)==0: 
      starttime=time.time() 

    while GPIO.input(12)==1: 
      endtime=time.time() 

    duration=endtime-starttime 
    distance=duration*34000/2 

    print str(x + 1) + ": " + str(distance) 

    time.sleep(1) 

這個腳本的功能是利用一個附加的接近傳感器來測量距離。

我現在的(凌亂)於Node.js(使用https://github.com/rakeshpai/pi-gpio的GPIO部分)重寫:

var gpio = require("pi-gpio"); 

function rightPingOn() { 
gpio.write(12, 1, function(err){ 
    //if(err) throw err; 
    console.log("Sent 1"); 
});   // Set pin 12 high 
} 

function rightPingOff() { 
gpio.write(12, 0, function(err){ 
    //if(err) throw err; 
    console.log("Sent 0"); 
});   // Set pin 12 low 
} 

function setRightListen() { 
gpio.setDirection(12, "input"); // Open pin 16 for input 
} 

function setRightOutput(){ 
gpio.setDirection(12, "output"); // Open pin 12 for output 
} 

function right_listen(){ 
gpio.read(12, function(err, value){ 
    //if(err) throw err; 
    console.log("Listened"); 
    return value; 
}); 
} 

gpio.open(12); 
setRightOutput(); 
rightPingOff(); 
setTimeout(rightPingOn, 0.5); 
setTimeout(rightPingOff, 0.5); 
setRightListen(); 

while (right_listen == 0){ 
var startTime = getTime(); 
} 

while (right_listen == 1){ 
var endTime = getTime(); 
} 

gpio.close(12); 

var duration = endTime - startTime; 
var distance = duration * 3400/2 

console.log(distance); 

所有我現在有作爲這個腳本的輸出是:

NaN 
Sent 0 
Sent 1 
Sent 0 

任何幫助將不勝感激!

回答

0

哦。我想你會遇到困難。我猜Python的GPIO接口是同步的?

要下手,輪詢是這樣的:

while (right_listen == 0){ 
    var startTime = getTime(); 
} 

while (right_listen == 1){ 
    var endTime = getTime(); 
} 

很可能會導致一個無限循環,因爲本應該被改變right_listen值的回調是永遠不會有機會運行。如果下面的部分應該在一組順序發生:

gpio.open(12); 
setRightOutput(); 
rightPingOff(); 
setTimeout(rightPingOn, 0.5); 
setTimeout(rightPingOff, 0.5); 
setRightListen(); 

和這些電話真的是異步的,你將不得不鏈在一起明確。

編輯:注意這只是代碼最終可能看起來的指導原則。

(1)注意我不處理錯誤。 (2)深層嵌套通常被稱爲「回調地獄」,像異步這樣的模塊可以使代碼變得更好 (3)這裏可能存在小錯誤。

gpio.open(12, function(error) { 
    gpio.setDirection(12, "output", function(error) { 
     gpio.write(12, 0, function(error) { 
      setTimeout(function() { 
       var started = getTime(); 
       gpio.setDirection(12, "input", function(error, value) { 
        console.log("received:", value, "after:", getTime()-started); 
       }) 
      }, 500) 
     }) 
    }) 
}) 
+0

這就好了!看起來像很多工作來擺脫python插座... 你有任何建議,使其工作? 或者我應該看看從node.js調用python腳本的最佳方式? – Oliver

+0

@ user3047558,如果您的代碼將對從GPIO生成的事件作出反應,併發送可能不會立即響應的命令,則此類應用程序對於Node.js可能實際上是一個很好的用例。如果您有非常複雜的事件序列,我可以使用異步庫來防止深層嵌套。 – Cyclone