- 拒絕商業綁架
- 堅持純粹的 DIY:會算露點的 Arduino 獨立防結露系統
- 擺脫電腦束縛:隨插即用的獨立除霧演算法全自動智慧除霧帶
- 免連 NINA 也懂露點:獨立型智慧氣象中樞實作
- 雙通道精準降載:Arduino 獨立運作版防結露中樞
前情提要:全自動防結露天文中樞建置
⚠️ 重要提醒:本篇釋出的 UNO 代碼為隨插即用的獨立運作版。為了達成免接電腦即可獨立運作的目標,此版本去除了原本架構中 Raspberry Pi 4 與 ASCOM Alpaca 協議的橋接功能。因此,完成後的裝置無法連線至電腦,也無法透過 NINA 等天文軟體讀取溫濕度數據或進行控制。前文能與 NINA 連動的版本是針對我個人設備特製的雙核心架構,特此說明。
獨立運作版:智慧除霧帶核心代碼
本專案將露點運算與動態 PWM 邏輯下放至 Arduino UNO,只要接上電源即可獨立運作,完全脫離外部電腦。代碼採 CC BY-NC 4.0 授權,僅供同好 DIY 交流,嚴禁商業量產。
C++
/*
* Project: Auto-Dew Controller (Standalone Version)
* Author: Luke
* License: CC BY-NC 4.0 (Non-Commercial Use Only)
* Copyright (c) 2026 Luke. All rights reserved.
* * 本專案代碼與硬體架構設計僅供個人與同好交流使用,
* 嚴禁任何未經授權的套件販賣、量產或其他商業牟利行為。
* * 【免責聲明】
* 本程式碼僅提供概念驗證與邏輯參考。使用者須自行承擔 DIY 風險,
* 若因線路短接、供電錯誤造成設備燒毀或硬體損壞,作者概不負責。
*/
#include <DHT.h>
#include <math.h> // 引入數學函式庫計算 log
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
const int pwmPin1 = 9; // 第一路 (導星鏡)
const int pwmPin2 = 11; // 第二路 (主鏡)
// 導星鏡火力權重 (避免過熱產生熱擾動影響導星)
const float GUIDE_WEIGHT = 0.5;
unsigned long lastReadTime = 0;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(pwmPin1, OUTPUT);
pinMode(pwmPin2, OUTPUT);
analogWrite(pwmPin1, 0);
analogWrite(pwmPin2, 0);
}
void loop() {
// 每 5 秒讀取一次溫濕度,防止 DHT22 積熱
if (millis() - lastReadTime >= 5000) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (!isnan(h) && !isnan(t)) {
// 1. 計算露點溫度 (Magnus-Tetens 公式)
float alpha = log(h / 100.0) + (17.62 * t) / (243.12 + t);
float dewPoint = (243.12 * alpha) / (17.62 - alpha);
// 2. 計算溫差
float deltaT = t - dewPoint;
int basePwm = 0;
// 3. 動態 PWM 演算法判斷
if (deltaT >= 5.0) {
// 安全區
basePwm = 0;
} else if (deltaT <= 1.0) {
// 高危險區
basePwm = 255;
} else {
// 動態警戒區 (1.0°C ~ 5.0°C)
// 將溫差線性轉換為 0~255 的 PWM 數值 (放大 10 倍處理浮點數對應)
long dT_10 = deltaT * 10;
basePwm = map(dT_10, 50, 10, 0, 255);
basePwm = constrain(basePwm, 0, 255);
}
// 4. 計算雙通道實際輸出
int pwm1 = basePwm * GUIDE_WEIGHT; // 導星鏡吃 50% 火力
int pwm2 = basePwm; // 主鏡吃 100% 火力
// 5. 執行硬體輸出
analogWrite(pwmPin1, constrain(pwm1, 0, 255));
analogWrite(pwmPin2, constrain(pwm2, 0, 255));
// 6. 序列埠監控輸出 (獨立運作時不影響,接電腦可看數據)
Serial.print("T:"); Serial.print(t, 1); Serial.print("C, ");
Serial.print("H:"); Serial.print(h, 1); Serial.print("%, ");
Serial.print("Dew:"); Serial.print(dewPoint, 1); Serial.print("C, ");
Serial.print("Diff:"); Serial.print(deltaT, 1); Serial.print("C -> ");
Serial.print("PWM1(導星鏡):"); Serial.print(pwm1); Serial.print(", ");
Serial.print("PWM2(主鏡):"); Serial.println(pwm2);
} else {
Serial.println("DHT22 Read Error!");
}
lastReadTime = millis();
}
}
所需材料
- 大腦:Arduino UNO 開發板。
- 感測:DHT22 溫濕度感測器。
- 動力:N-MOSFET 四路驅動模組。
- 負載:12V 除霧帶兩組(分別用於導星鏡與主鏡)。
- 電源:12V 獨立變壓器或深循環電池(供除霧帶)、5V 手機充電器或電腦 USB(供 UNO)。
- 耗材:杜邦線、單芯線、保鮮盒、防水黏土、熱熔膠。
硬體製作步驟
-
接腳配置 (DHT22 感測端):
- 將 DHT22 的
VCC腳位唯一接至 UNO 的3.3V腳位(嚴禁接 5V 以免鎖死晶片)。
- 將 DHT22 的
GND接 UNO 的GND。
- 將 DHT22 的
DATA接 UNO 的Pin 4。
- 將 DHT22 的
-
接腳配置 (N-MOSFET 控制端):
- 將 UNO 的
Pin 9接至 MOSFET 模組的第一路 PWM 訊號輸入(對應導星鏡)。
- 將 UNO 的
Pin 11接至 MOSFET 模組的第二路 PWM 訊號輸入(對應主鏡)。
- 將 UNO 的
GND接至 MOSFET 模組的訊號端GND(共地)。
- 將 UNO 的
-
強弱電實體隔離 (電源佈線):
- 將 12V 獨立電源的正負極,直接鎖入 N-MOSFET 端子台的主電源輸入。絕對不可將此 12V 電源接入 UNO。
- 將兩組除霧帶分別鎖入 N-MOSFET 第一路與第二路的輸出端子台。
- 將 12V 獨立電源的正負極,直接鎖入 N-MOSFET 端子台的主電源輸入。絕對不可將此 12V 電源接入 UNO。
-
防水抗露工程:
- 用美工刀在保鮮盒邊緣割出 U 型槽。
- 將所有線材理齊通過 U 型槽。
- 在縫隙處填滿防水黏土,蓋上保鮮盒蓋後,於外部接縫及 DHT22 裸露線頭處全面補上熱熔膠密封。
- 用美工刀在保鮮盒邊緣割出 U 型槽。
系統使用說明
-
韌體燒錄: 將 UNO 接上電腦,透過 Arduino IDE 將上述程式碼燒錄進開發板。
-
系統佈署: * 將 DHT22 放置於能真實反映環境氣溫的開闊處。
- 將第一路除霧帶綁上導星鏡。
- 將第二路除霧帶綁上主鏡。
- 將第一路除霧帶綁上導星鏡。
-
獨立供電順序:
- 先將 12V 電源接上 N-MOSFET 模組(此時除霧帶不會加熱,因無訊號驅動)。
- 將任意手機 5V 充電器或行動電源插上 UNO 的 USB 孔。
- 先將 12V 電源接上 N-MOSFET 模組(此時除霧帶不會加熱,因無訊號驅動)。
-
全自動防護啟動:
通電後,UNO 即刻接管溫差偵測,可透過 N-MOSFET 模組上的指示燈觀察狀態:
- 環境乾燥 (溫差 ≥ 5°C):燈號熄滅,系統零耗電。
- 水氣攀升 (溫差 < 5°C):燈號閃爍或微亮,進入動態輸出。第一路燈號亮度會明顯低於第二路(導星鏡 50% 降載發揮作用)。
- 極端高濕 (溫差 ≤ 1°C):燈號恆亮,全功率輸出強制除霧。
- 環境乾燥 (溫差 ≥ 5°C):燈號熄滅,系統零耗電。