从 Arduino 传递温湿度值给 Node 网站

更新时间:2017-09-14 09:18:07 点击次数:1680次

实验材料:

Arduino 实验程序:Arduino 将把采集到的温湿度值,传到Node 服务器的 /th 路径,并且在 URL 地址附加 t 和 h 参数,分别代表温度和湿度值。

以太网络客户端连接程序如下,首先声明保存地址的变量,采用DHCP(动态分配 IP 地址)的代码请参阅下文。

#include <SPI.h> #include <Ethernet.h> // 以太网卡的实体地址 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(192, 168, 1, 19); // Node 服务器的IP 地址,请自行修改 IPAddress ip(192, 168, 1, 177); // Arduino 的IP 地址,请自行修改 IPAddress subnet(255, 255, 255, 0); // 子网掩码 IPAddress gateway(192, 168, 1, 1); // 网关地址,请自行修改 EthernetClient client; // 声明以太网络客户端连接对象,命名为client

客户端对象通过connect() 方法与服务器创建连接,如下代码将在连接成功时,发送虚构的温湿度数据:

本示例程序,loop() 保留空白即可:

void loop() { }

如果你的电脑网络环境采用动态IP 地址配置(DHCP),请将代码改成:

Node.js 程序:接收来自Arduino 的温湿度数据,并将它们显示在终端窗口中的 Node 程序如下。

var express = require('express'); var app = express();

app.get("/", function(req, res) { res.send("arduino 信息网页");
});

app.get("/th", function(req, res) { var temp = req.query.t; // 读取查询字符串的t 值 var humid = req.query.h; // 读取查询字符串的h 值 // 确认收到温度和湿度值(两者都不是undefined) if (temp != undefined && humid != undefined) {
console.log(" 温度: " + temp + ",湿度: " + humid);
res.send(" 温度: " + temp + "° C,湿度: " + humid +"%");
} else {
console.log(" 没收到数据! ");
}
});
app.use("*",function(req,res){ res.status(404).send(' 查无此页! ');
}); var server = app.listen(5438, function () { console.log(" 网站服务器在5438 端口开工了! ");
});

程序运行结果:运行 Node 程序后,再开启 Arduino,即可在终端窗口中看到所传入的数据。

让 Arduino 定时上传 DHT11 数据

上面 Arduino 程序只会发送一次温湿度值,接下来将把它改成可定时上传数据的形式,并且引用 DHT11 传感器的库文件实际采集传感器的数据,通过 Streaming 库文件输出动态字符串。

关于这两个库文件的说明,请分别参阅《完美图解Arduino 互动设计入门》的第 9 章与第 16 章。

请在程序开头引用下列库文件并初始化dht11 传感器对象:

#include <SPI.h> #include <Ethernet.h> #include <dht11.h> #include <Streaming.h> dht11 DHT11; // 声明dht11 对象,命名为DHT11 const byte dataPin = 2; // dht11 传感器的数据输出接在数字2 脚

为了方便查看实验结果,本程序设置让Arduino 每隔5 秒返回一次温湿度值,读者可在实验成功后自行修改间隔时间。本例的延时间隔不用delay() 函数,因为在 delay 期间,Arduino 将会停摆,不做任何运算,也不接收输入值。

此延迟程序采用比较时间差的方式,首先声明两个用于计时的长整型变量,interval 存放间隔时间:

发送 DHT11 传感器数据时,将目前的毫秒数存入past 变量中,后面的代码将不停地比对时间差(目前的毫秒数减去past 值),若时间差大于“间隔时间”,则再次读取 DHT11 数据。

实际的 Arduino 主程序如下:

void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip); // 初始化以太网络连接 // 等待1 秒钟,让以太网卡有时间进行初始化 delay(1000);
Serial.println(“connecting...”);
}

发送数据给服务器的程序写成httpSend() 自定义函数,来自DHT11 传感器的动态数据以“<<”运算符合成为字符串:

将上面的程序上传到 Arduino,即可在电脑的终端窗口中看到每5 秒更新一次的温湿度值。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!