Tag: pi

重复调用embedded在init函数中的函数

Noobish在这里。 我正在build造一个树莓派项目,每5分钟测量一个水箱的深度。 我已经在坦克中放置了一个超声波距离测量装置,并且已经使用节点和r-pi-usonic库运行了所有的程序。 我可以先打电话给超声波设备,以创build平均10个单独的措施(由于个别措施的变化)并将其logging到控制台。 但我想要做的是每5分钟重复一次。 我最初尝试通过设置一个setInterval(),并尝试使用cron。 但是,由于查询循环绑定在init函数中,它会引发以下错误… timers.js:274 callback.apply(this, args); ^ TypeError: Cannot read property 'apply' of undefined at wrapper [as _onTimeout] (timers.js:274:13) at Timer.listOnTimeout (timers.js:119:15) 所以我的问题是什么是最好的方法来得到这个每5分钟运行一次查询? 答案无疑会帮助我理解callback等。对不起,这样一个笨蛋! 我的代码在这里,为它的废话道歉! //Import required modules var usonic = require('r-pi-usonic'); console.log('starting water tank monitor'); var min_tank = 30 var max_tank = 90 var tank_percent = 0 usonic.init(function (error) { […]

Linux杀掉我的进程内存不足,怎么看我用了多less?

继我以前的问题( 防止我的node.js应用程序被操作系统杀死 ),我已经重写了我如何下载文件的gestion。 为了使它简短,我需要下载一些video文件(testing文件是3video,MP4,〜3分钟),我一次全部下载,过程中被杀死,dmesg说(2下载完成后): Out of memory: kill process (node) score 824 or sacrifice child Killed process (node)… 所以我通过下载video一个又一个地重试,但在第二次下载,我得到完全相同的消息,我的程序被杀害。 有什么方法可以看到我的代码的哪一部分出错了,或防止Linux杀死我的进程? 顺便说一句,不是三个同时下载比一个吃了更多的内存? 那么,为什么我会一个接一个地杀人呢? 该应用程序运行在树莓派,没有GUI,raspbian,我相信是唯一的应用程序正在运行(除了系统进程) 编辑:关于function的一些细节,以及我认为现在如何工作:应用程序是在节点启动,而不是在任何浏览器。 由于一个接一个下载video,我以为会less吃点内存,但是因为我一下子下载了更多的数据,似乎是错误的,原因是停止似乎是一样的。 这里的下载function,以防万一它可以帮助: file_url的types是http://adress.com/rpi/test.mp4 function download (file_url, callback){ var option={host:url.parse(file_url).host, port:80, path:url.parse(file_url).pathname}; var file_name=url.parse(file_url).pathname.split('/').pop(); var file=fs.createWriteStream(DOWNLOAD_DIR+file_name); //Seems to crash while here: http.get(options, function(res){ res.on('data', function(data){ file.write(data); }).on('end'), function(){ file.end(); callback(DOWNLOAD_DIR+file_name); }); }); […]

进程节点不断增长,直到吃完所有内存

这个问题和我以前的问题是一样的,但是由于反复编辑变得太大了,我更喜欢再问一遍。 我正在研究覆盆子pi(raspbian,512M RAM),并在node.js(v0.10.2)中做一个JavaScript应用程序。 在这里,我需要下载一些video,至于我这样做的块: function download (file_url, callback){ var option={host:url.parse(file_url).host, port:80,path:url.parse(file_url).pathname}; var file_name=url.parse(file_url).pathname.split('/').pop(); var file=fs.createWriteStream(DOWNLOAD_DIR+file_name); http.get(options, function(res){ res.on('data', function(data){ file.write(data); }).on('end'), function(){ file.end(); callback(DOWNLOAD_DIR+file_name); }); }); }; 我相信与使用node.js下载大文件类似, 避免了高内存消耗 问题在于,节点进程的rss不停止增加,大约从100M开始,在400M左右(最大内存)时被os所杀死。 由于我新内存泄漏跟踪和运行应用程序以外的任何浏览器,我要么不能使用或不能理解如何使用内存工具,我已经从util库中获取rss。 我的问题是:为什么rss不断增加,甚至当我在飞行中写入大量数据,和/或在哪里寻找解决scheme? 编辑:第二次看看上面的链接,我注意到使用createWriteStream上的标志,但无法find它们的列表或效果,是否有任何人在这里谁知道任何方式来访问这样的文档,它可能是相关的 编辑2:我现在一味地遵循Corlosdp的代码,添加标志(附加?)使rss以随机间隔下降2M,并使我的应用程序持续更长时间,但它仍然最终死亡 编辑3:我发现了一些有趣的东西 我编辑了下载function,看看我在文件中的位置: function download (file_url, callback){ var i=0; var option={host:url.parse(file_url).host, port:80,path:url.parse(file_url).pathname}; var file_name=url.parse(file_url).pathname.split('/').pop(); var file=fs.createWriteStream(DOWNLOAD_DIR+file_name, {flags:'a', encoding:'binary'); setInterval(function(){ console.log(i+"o downloaded"); console.log(util.inspect(process.memoryUsage())); […]

避免两个video之间的时间间隔

自投票以来一直重复 我的目标是在没有转换的情况下播放video文件。 由于我在树莓派上工作,似乎我被迫停在omplayer上播放video文件。 我把它写在node.js中,因为asynchronous编程对应用程序的其他非相关部分很有用。 我的问题是,在每个video之间,播放下一个video之前屏幕显示控制台的时间很短。 我正在寻找任何方式来无瑕地进行转变。 对于那些想要重现这一点,这里的代码: var Playlist=[], PIndice=0, PATH=''; DOWNLOAD_DIR=''; exec=require('child_process').exec, execF=require('child_process').execFile; function start(){ Playlist.push('video1.mp4'); Playlist.push('video2.mp4'); PATH=process.argv[1].substr(0, process.argv[1].indexOf('app.js', 0)); DOWNLOAD_DIR=PATH+'downloads/'; play(Playlist[0]); } function play(file){ file=DOWNLOAD_DIR+file; execF(PATH+'play.sh', [file], function(error, stdout, stderr){ if (err){throw err;} if (stdout){console.log(stdout);} if (stderr){console.log(stderr);} if(PIndice < Playlist.length -1){ PIndice=PIndice+1; }else{ PIndice=0; } play(Playlist[PIndice]); }); } start(); 您将需要这个简单的脚本,在play.sh: #!/bin/sh omxplayer $1 […]

通过我的networking服务器与我的树莓派进行交stream

我想通过我的networking服务器与我的树莓派进行沟通。 我想在我的服务器上使用Web界面,通过这个界面我可以控制PI上的LED。 我可以使用“node js”吗? 还是有人有一个好主意或例子? 问候

Node.JS onoff没有正确拾取GPIO

我build立一个简单的红外breakbeam电路插入我的RPi 2.我有一些工作代码在python成功地拿起,当我的红外光束坏了,但我想用node.js而不是python。 这是我的Python代码,很好,很简单: import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(7, GPIO.IN) try: while True: print(GPIO.input(7)) time.sleep(0.01) except KeyboardInterrupt: GPIO.cleanup() 现在我做了一些关于node.js的不同软件包的阅读,这些软件包允许我在Pi上使用GPIO,并决定onoff看起来像最好的一个,因为它与我想要使用的callbackasynchronous工作。 这是我正在尝试用于节点的代码: var Gpio = require('onoff').Gpio, infrared = new Gpio(7, 'in'); var interval = setInterval(function() { console.log(infrared.readSync() ^ 1); }, 100); function exit() { infrared.unexport(); process.exit(); } process.on('SIGINT', exit); 问题是节点我总是得到相同的0信号,不pipe我做什么。 我试图通过使用一个简单的button来消除我的电路问题,甚至不工作(我使用pythontesting了相同的电路,并且工作正常)。 这甚至不使用它的asynchronous部分(因为没有发生中断,所以它也不起作用)。 我曾尝试使用GPIOpipe理导出我正在使用的引脚: pi@counter ~ […]

覆盆子pi邻近检测nodejs

我有一个运动和接近传感器连接到树莓派。 我想要发生的事情是,当运动传感器检测到运动时,它从接近传感器获取读数以查看人的距离。一旦人进入一定的距离,就会显示一条消息。 运动传感器正在被触发,我正从接近传感器读取数据,但接近传感器陷入一个循环,数值不会更新(即使有人在其上)。 议案: import gpio from 'gpio'; import proximity from './proximity'; const gpio4 = gpio.export(4, { direction: 'in', }); // bind to the "change" event gpio4.on('change', (val) => { // value will report either 1 or 0 (number) when the value changes if (val === 1) { console.log('checking proximity'); proximity.getDistance(); } }); 接近 : […]

在节点中不可能安装包

我想安装一个树莓派3.我想安装和运行节点代码,但是在使用npm安装软件包时遇到问题。 我尝试了几个版本的节点(包括armhf最新和更旧的版本),但我总是得到以下错误(在安装槽[npm安装槽] groove@2.5.1 install /home/pi/node_modules/groove node-gyp rebuild make: Entering directory '/home/pi/node_modules/groove/build' CXX(target) Release/obj.target/groove/src/groove.o In file included from ../src/groove.cc:4:0: ../src/file.h:6:27: fatal error: groove/groove.h: Aucun fichier ou dossier de ce type #include <groove/groove.h> ^ compilation terminated. groove.target.mk:95: recipe for target 'Release/obj.target/groove/src/groove.o' failed make: *** [Release/obj.target/groove/src/groove.o] Error 1 make: Leaving directory '/home/pi/node_modules/groove/build' gyp ERR! build error gyp ERR! […]

在MongoDb聚合上出错

我一直在本地build立我的应用程序,所有工作正常,它使用最新的MongoDB 3.4和我的聚合调用工作正常。 app.get('/random_menu', function (req, res) { Menus.aggregate([{$sample: {size: 1}}], function (err, data) { res.json(data); }); }); 我现在已经把我的代码移动到了我的树莓派,它仅限于MongoDB 2.4.10,看起来我的聚合函数不能工作。 我的应用程序不返回任何数据,并没有任何错误。 为了testing,我通过RoboMongo尝试了下面这个,它在当地的3.4版本上工作正常: db.getCollection('menus').aggregate([{$sample: {size: 1}}]) 但是,当我尝试通过RoboMongo pi分贝,我得到以下错误: assert: command failed: { "errmsg" : "Pipeline::parseCommand(): unrecognized field \"cursor", "ok" : 0 } : aggregate failed _getErrorWithCode@src/mongo/shell/utils.js:23:13 doassert@src/mongo/shell/assert.js:13:14 assert.commandWorked@src/mongo/shell/assert.js:266:5 DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1215:5 @(shell):1:1 Error: command failed: { "errmsg" : "Pipeline::parseCommand(): […]

将node.js服务器应用到Web服务器

我正在学习如何使用Node.js和Web套接字来创build简单的多用户交互式JavaScript程序。 我使用Daniel Shiffman的这个系列教程来创build这个示例项目。 我的下一步是使用WinSCP将其上传到我的RaspberryPi apache2 Web服务器,但是我还没有find一种方法来编辑代码,以便使其工作,而且我不知道该用什么要执行的程序才能正常工作。 任何援助将是伟大的。 我的Node / Socket.io知识的程度完全来自上面提到的video系列,所以你可以假设我几乎不知道其他东西。