接續前一篇,本篇要實作將 NodeMCU 連接 AM2320,並上傳程式。在上傳程式前,看一下線路連接方式。
• AM2320 溫濕度感測器 x 1
• 麵包板(含電源模組) x 1
• 連接線 x 4
先到 Github 下載 knolleary/pubsubclient,按右邊綠色選項「Clone or download」,再選「Download ZIP」。
• 將下載的壓縮檔解壓縮,放在 Arduino 主程式下的 libraries目錄內,以我的電腦來說,Arduino安裝在 C:\User\[登入的帳號]\Documents\Arduino,點進目錄有一個 libraries的子目錄,下載後解壓縮的目錄,整個放進 libraries 目錄,重新啟動 Arduino即可。
左圖是開始執行約40分鐘的圖,右圖是關掉冷氣後的溫度變化:
[材料]
• NodeMCU x 1• AM2320 溫濕度感測器 x 1
• 麵包板(含電源模組) x 1
• 連接線 x 4
[線路連接]
NodeMCU
|
AM2320
|
3.3 V
|
VCC(Pin1)
|
GND
|
GND(Pin3)
|
D1
|
SCL(Pin4)
|
D2
|
SDA(Pin2)
|
[安裝PubSubClient Library]
PubSubClient 函式庫提供客戶端,透過簡單的發布/訂閱訊息與 MQTT 的服務器連接,等於讓你的 NodeMCU 與 Node-RED 直接交談。先到 Github 下載 knolleary/pubsubclient,按右邊綠色選項「Clone or download」,再選「Download ZIP」。
• 將下載的壓縮檔解壓縮,放在 Arduino 主程式下的 libraries目錄內,以我的電腦來說,Arduino安裝在 C:\User\[登入的帳號]\Documents\Arduino,點進目錄有一個 libraries的子目錄,下載後解壓縮的目錄,整個放進 libraries 目錄,重新啟動 Arduino即可。
[程式]
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <AM2320.h>
AM2320 sensor;
// 設定無線基地台SSID跟密碼
const char* ssid = "MyHome";
const char* password = "ceiling4895";
// 設定樹莓派 MQTT Broker 的 IP
const char* mqtt_server = "192.168.1.128";
// 初始化 espClient.
WiFiClient espClient;
PubSubClient client(espClient);
const int lamp = 4;
float temper, humidity;
// 當設備發訊息給一個標題(topic)時,這段函式會被執行
void callback(String topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// 假使收到訊息給主題 room/lamp, 可以檢查訊息是 on 或 off. 根據訊息開啟 GPIO
if(topic=="room/lamp"){
Serial.print("Changing Room lamp to ");
if(messageTemp == "on"){
digitalWrite(lamp, HIGH);
Serial.print("On");
}
else if(messageTemp == "off"){
digitalWrite(lamp, LOW);
Serial.print("Off");
}
}
Serial.println();
}
// ESP8266 重新連接到 MQTT Broker
void reconnect() {
// 持續迴圈直到連線
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP8266Client")) {
Serial.println("connected");
// 訂閱一個主題,可以設定多個主題
client.subscribe("room/lamp");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
pinMode(lamp, OUTPUT);
Serial.begin(115200);
// 連接無線網路
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
// 設定 mqtt server 及連接 port
client.setServer(mqtt_server, 1883);
// 設定 mqtt broker 並設定 callback function
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
if(!client.loop())
client.connect("ESP8266Client");
sensor.begin();
if (sensor.measure()) {
temper = sensor.getTemperature();
humidity = sensor.getHumidity();
}
else {
int errorCode = sensor.getErrorCode();
switch (errorCode) {
case 1: Serial.println("ERR: Sensor is offline"); break;
case 2: Serial.println("ERR: CRC validation failed."); break;
}
}
// dtostrf 將 float 數字改成文字
static char temperatureTemp[7];
dtostrf(temper, 6, 2, temperatureTemp);
static char humidityTemp[7];
dtostrf(humidity, 6, 2, humidityTemp);
// Publishes Temperature and Humidity values
client.publish("room/temperature", temperatureTemp);
client.publish("room/humidity", humidityTemp);
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t Temperature: ");
Serial.print(temper);
Serial.println(" *C ");
delay(5000); // 等待5秒
}
[執行結果]
Console連線結果:左圖是開始執行約40分鐘的圖,右圖是關掉冷氣後的溫度變化:




張貼留言