實驗材料:
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 傳感器的庫文件實際采集傳感器的數據,通過 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 秒更新一次的溫濕度值。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。