4820浏览
查看: 4820|回复: 0

【转载】用树莓派和Node.js来控制湿度

[复制链接]
本帖最后由 凌风清羽 于 2016-4-27 23:05 编辑

ThingWorx是一家提供物联网平台的公司。利用ThingWorx开发平台,我们能快速搭建一套物联网应用。

终极游戏

我不是仅仅因为提到了树莓派,就称这是一篇关于物联网(Internet of Things)的文章,但我敢拍着胸脯说这是一个互联网自动化(Internet Automation)项目,不需我额外动作就能解决一个小问题。

在本文中,我将会提供大量有用的外部资源,使得我们能尽快熟悉项目中所涉及的node.js和JavaScript部分。

问题描述

在寒冷的冬季,我们希望用加热器来使家里/办公室处于温暖舒适的温度。然而,在封闭的环境里使用加热器会影响室内湿度。我们用{敏感词}解决了这个问题!文章里我将用到一个连接插座的便携式{敏感词}。

我的目的是根据屋内的湿度等级,能够自动调节{敏感词}的开关。

如何实现呢?硬件:

如果我们能实现自动控制{敏感词}所连接的插座(或开关),那么问题就迎刃而解了。因此,我们需要有一个能用互联网完美控制的插座。为了实现这个功能,我选用了Belkin公司互联网控制开关Wemo Switch。

(请注意:许多便携式{敏感词}也自带自动开关或者定时器,但我们为的是DIY。所以在此不讨论。)

IFTTT的Maker平台为我们提供了(需要注册后才能使用它们的服务):

  • 连接Wemo 开关
  • 使用Maker API来控制Wemo开关状态(根据你的账号和设备创建)
  • 连接Wemo 开关
  • 使用Maker API来控制Wemo开关状态(根据你的账号和设备创建)

显然我们还需要能连接树莓派的传感器。我强烈推荐使用树莓派SenseHAT而不是独立连接的传感器,SenseHAT已经集成了许多传感器,像一顶戴在树莓派上的帽子。它们还提供了丰富的Python库来读取传感器的数据。

最后,我们需要把树莓派连接到互联网。简单地把WiFi模块插在树莓派的USB端口上就能实现。当然,在树莓派上需要设置WiFi。(提示:使用Linux命令或者IDE)

软件:

因为树莓派上可以运行操作系统,比如Linux和Windows,我们很容易在上面安装Node.js。因此,node.js是我们从传感器读取数据并通过IFTTT Maker平台调用API控制Wemo Switch状态的核心骨干。

正如早先所提到的,我们还需要依赖大量SenseHAT所提供的python脚本。我们就不再介绍这些python脚本了,它们在SenseHAT API 手册里都能找到。但我们会讨论如何用node.js应用来驱动这些python脚本。

Node.js App
  • 驱动python脚本,以固定的频率读取传感器数据(也就是温度,也可以是湿度数据)
  • 比较读取到的数据和预设条件,判断Wemo Switch是否需要关闭
  • 调用IFTTT Maker的接口,打开或者关闭Wemo Switch开关

此应用分三步实现功能:

  • 驱动python脚本,以固定的频率读取传感器数据(也就是温度,也可以是湿度数据)
  • 比较读取到的数据和预设条件,判断Wemo Switch是否需要关闭
  • 调用IFTTT Maker的接口,打开或者关闭Wemo Switch开关

接下去我们来看每一步的具体代码:

步骤一:读取传感器数据

Node.js提供了child_process的模块,它的一个方法exec能够执行操作系统的命令。这一步需要此模块来驱动python脚本。还记得吗,我们想以固定的频率来执行python脚本,因此需要在外面包装一层JavaScript的setInterval函数。

  1. setInterval(function(){
  2.    require('child_process').exec(command, function(error, stdout, stderr) {
  3. if (error == null) {
  4. var data = stdout.replace("\n","");
  5. // ... Call Stage 2
  6. }
  7. else {
  8. console.log("Error occured. " + error);
  9. }
  10. }); child_process.exec
  11. }, 60000); // frequency = 60 seconds
复制代码



步骤二:判断条件

这里只是简单地比较一下上一步读取的信息。但是,你也可以在这里添加其它的功能,比如将数据存入数据库,保持最近几次读取值,判断最近几次的数值是否持续增加或减少,等等。这里我们则是基于最近一次传感器数据做出判断。

  1. // assumption: We are looking for Temperature in Stage 1
  2. var YOUR_API_KEY = "?????"; // obtain this from IFTTT
  3. var wemoState = "off"; // or as defined in IFTTT Maker
  4. if(data > 35) { // deg. Celsius is what SenseHat APIs returns
  5. wemoState = "on";
  6. }
  7. // ... Call Stage 3
复制代码



步骤三:调用IFTTT Maker接口

如上文所提到的,我们不再讨论如何创建一个IFTTT Maker API来控制某个设备的状态,或是调用另一个API。你可以参考手册或是这篇博客。

接下去,到了真正使用Node.js调用接口的时候了,我们使用node.js的https模块,它提供了request的方法。

  1. var makerAPI_host = "maker.ifttt.com";
  2. var makerAPI_path = "/trigger/"+wemoState+"/with/key/"+YOUR_API_KEY;
  3. var https = require('https');
  4. var optionsget = {
  5. method : "GET",
  6. host : makerAPI_host,
  7. port : 80,
  8. path : makerAPI_path
  9. };
  10. var reqGet = https.request(optionsget, function(resp) {
  11. var str = "";
  12. resp.setEncoding('utf8');
  13. resp.on('data', function(d) { // data chunk
  14. str += d;
  15. });
  16. resp.on('end', function() { // all data sent
  17. console.log(str); // We are Done!
  18. });
  19. });
  20. reqGet.on('error', function(e) {
  21. error = {
  22. message : "Error occured",
  23. error : e
  24. };
  25. console.log(error);
  26. });
  27. reqGet.end();
复制代码


或者,也可以使用第二步中的child_process.exec()方法。

  1. var callAPI = "curl -X GET https://maker.ifttt.com/trigger/"+wemoState+"/with/key/"+YOUR_API_KEY;   
  2. require('child_process').exec(callAPI, function(error, stdout, stderr) {
  3. if (error == null) {
  4. console.log(stdout); // We are Done!
  5. }
  6. else {
  7. console.log("Error occured. " + error);
  8. }
  9. }); child_process.exec
复制代码



小结

总而言之,本文旨在演示在树莓派上使用Node.js的不同模块,DIY项目也预留了扩展空间。我所想到的一个复用方法是用同样的装置来控制任何与互联网连接的设备,如Nest恒温器等,创造更多新奇的互联网自动化DIY项目。

请随时评论、分享您的经验,若有任何遗漏,请提供反馈或致电联系。




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail