更新:重写代码,但仍然没有工作问题转换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
任何帮助将不胜感激!
这就好了!看起来像很多工作来摆脱python插座... 你有任何建议,使其工作? 或者我应该看看从node.js调用python脚本的最佳方式? – Oliver
@ user3047558,如果您的代码将对从GPIO生成的事件作出反应,并发送可能不会立即响应的命令,则此类应用程序对于Node.js可能实际上是一个很好的用例。如果您有非常复杂的事件序列,我可以使用异步库来防止深层嵌套。 – Cyclone