//MAX485_DS18B20溫度檢知器 室內接收端 (Arduino B)
#include <SoftwareSerial.h>
#define RO_PIN 10 // 接室內 MAX485 的 RO 腳 (耳朵)
#define DI_PIN 11 // 接室內 MAX485 的 DI 腳 (懸空不接)
#define DE_RE 4 // 控制室內 MAX485 的 DE/RE 短路端
// 建立軟體序列埠,命名為 RS485Serial
SoftwareSerial RS485Serial(RO_PIN, DI_PIN);
void setup() {
Serial.begin(9600); // 開啟連接電腦的序列埠
RS485Serial.begin(9600); // 開啟連接 50 米長線的虛擬序列埠
pinMode(DE_RE, OUTPUT);
digitalWrite(DE_RE, LOW); // 室內機專職「接收監聽」,永久保持低電位
Serial.println("=========================================");
Serial.println(" 室內監控主機:50米長距離溫度系統已就緒 ");
Serial.println("=========================================");
}
void loop() {
// 檢查 50 米長線緩衝區是否有屋外傳來的資料
if (RS485Serial.available() > 0) {
// 讀取一行字串 (直到讀到屋外送來的 \n 換行符為止)
String inputData = RS485Serial.readStringUntil('\n');
// 去除字串前後可能因為線路雜訊產生的空白字元
inputData.trim();
// 【長途傳送資料校验機制】
// 檢查收到的字串長度是否足夠,且開頭必須是 'T',結尾必須是 'C'
if (inputData.length() >= 7 && inputData.startsWith("T:") && inputData.endsWith(":C")) {
// 擷取中間的溫度數值(剃除掉 "T:" 與 ":C")
// "T:25.43:C" -> 擷取索引 2 到倒數第 2 個字元之間的內容
String tempStr = inputData.substring(2, inputData.length() - 2);
// 將字串安全地轉換成浮點數
float outdoorTemp = tempStr.toFloat();
// 輸出正確解析的即時數據到電腦螢幕上
Serial.print("🏡 屋外即時溫度: ");
Serial.print(outdoorTemp);
Serial.println(" °C");
} else {
// 如果 50 米線路受到外在電磁干擾(如屋外雷擊、日光燈突波),字串會變形,直接丟棄不處理
Serial.println("⚠️ [警告] 50米線路偵測到雜訊突波,已自動過濾毀損封包。");
}
}
}
沒有留言:
張貼留言