2026年4月10日 星期五

全自動防結露天文中樞建置 (番外篇):全自動智慧除霧中樞 (開源獨立版)

  • 拒絕商業綁架
  • 堅持純粹的 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();
  }
}

所需材料

  1. 大腦:Arduino UNO 開發板。
  2. 感測:DHT22 溫濕度感測器。
  3. 動力:N-MOSFET 四路驅動模組。
  4. 負載:12V 除霧帶兩組(分別用於導星鏡與主鏡)。
  5. 電源:12V 獨立變壓器或深循環電池(供除霧帶)、5V 手機充電器或電腦 USB(供 UNO)。
  6. 耗材:杜邦線、單芯線、保鮮盒、防水黏土、熱熔膠。

硬體製作步驟

  1. 接腳配置 (DHT22 感測端):

    • 將 DHT22 的 VCC 腳位唯一接至 UNO 的 3.3V 腳位(嚴禁接 5V 以免鎖死晶片)。
    • 將 DHT22 的 GND 接 UNO 的 GND
    • 將 DHT22 的 DATA 接 UNO 的 Pin 4
  2. 接腳配置 (N-MOSFET 控制端):

    • 將 UNO 的 Pin 9 接至 MOSFET 模組的第一路 PWM 訊號輸入(對應導星鏡)。
    • 將 UNO 的 Pin 11 接至 MOSFET 模組的第二路 PWM 訊號輸入(對應主鏡)。
    • 將 UNO 的 GND 接至 MOSFET 模組的訊號端 GND(共地)。
  3. 強弱電實體隔離 (電源佈線):

    • 將 12V 獨立電源的正負極,直接鎖入 N-MOSFET 端子台的主電源輸入。絕對不可將此 12V 電源接入 UNO。
    • 將兩組除霧帶分別鎖入 N-MOSFET 第一路與第二路的輸出端子台。
  4. 防水抗露工程:

    • 用美工刀在保鮮盒邊緣割出 U 型槽。
    • 將所有線材理齊通過 U 型槽。
    • 在縫隙處填滿防水黏土,蓋上保鮮盒蓋後,於外部接縫及 DHT22 裸露線頭處全面補上熱熔膠密封。

系統使用說明

  1. 韌體燒錄: 將 UNO 接上電腦,透過 Arduino IDE 將上述程式碼燒錄進開發板。

  2. 系統佈署: * 將 DHT22 放置於能真實反映環境氣溫的開闊處。

    • 將第一路除霧帶綁上導星鏡。
    • 將第二路除霧帶綁上主鏡。
  3. 獨立供電順序:

    • 先將 12V 電源接上 N-MOSFET 模組(此時除霧帶不會加熱,因無訊號驅動)。
    • 將任意手機 5V 充電器或行動電源插上 UNO 的 USB 孔。
  4. 全自動防護啟動:

    通電後,UNO 即刻接管溫差偵測,可透過 N-MOSFET 模組上的指示燈觀察狀態:

    • 環境乾燥 (溫差 ≥ 5°C):燈號熄滅,系統零耗電。
    • 水氣攀升 (溫差 < 5°C):燈號閃爍或微亮,進入動態輸出。第一路燈號亮度會明顯低於第二路(導星鏡 50% 降載發揮作用)。
    • 極端高濕 (溫差 ≤ 1°C):燈號恆亮,全功率輸出強制除霧。

2026年4月9日 星期四

全自動防結露天文中樞建置

這是一套完全脫離市售封閉系統,從硬體電壓到軟體通訊協定全盤掌握的自製智能氣象中樞。

一、 硬體架構與供電鐵律 (實體層)

  1. 大腦與手腳: Raspberry Pi 4 擔任網通與運算大腦;Arduino UNO 負責 GPIO 硬體控制;DHT22 負責溫濕度擷取;N-MOSFET 四路模組負責 12V 動力輸出。
  2. 電壓與隔離邊界 (極度關鍵):
    • 感測器純淨供電: DHT22(大陸製) 的 VCC 必須死死釘在 UNO 的 3.3V 腳位 。若誤插 5V,極易觸發晶片保護機制鎖死,導致資料恆定噴出異常的 125% 濕度。
    • 強弱電實體隔離: UNO 由 Pi 4 的 USB 提供 5V 邏輯電源;加熱帶與平場板的 12V 動力電源必須由獨立變壓器直入 N-MOSFET 端子台,絕對不可與微控制器混用電源。

二、 雙核心神經網路與演算法 (邏輯層)

  1. 底層資料讀取 (Python Serial Reader):
    • 為防止 DHT22 積熱失準,Arduino 端降速為每 5 秒拋出一次數據。
    • Pi 4 端的 Python 腳本必須將 timeout 放寬至 6 秒,並拔除 reset_input_buffer() 等清空指令,確保不漏接任何毫秒級的資料流。
  2. Auto-Dew 智慧溫差演算法:(註)
    • 系統會精準計算露點 (Dew Point) 與當下環境溫差。
    • 溫差 ≥ 5°C:安全區,PWM 輸出 0(關閉加熱,節省電量)。
    • 溫差 ≤ 1°C:高危險區,PWM 輸出 255(火力全開,強制除霧)。
    • 1°C < 溫差 < 5°C:動態警戒區,系統會自動算出 0~255 的線性火力(例如溫差 4.3°C 時輸出 PWM 47),達成溫和且精準的鏡片保護。
  3. ASCOM Alpaca 協議橋接:
    • 拋棄 Windows 複雜的 ASCOM 驅動安裝。以 Python 的 BaseHTTPRequestHandler 在 Pi 4 內部自建 API 伺服器,對外廣播 UDP 32227 Port 進行設備探索。

    • 直接輸出符合微軟規範的 JSON 封包,讓 NINA 原生即插即用,完美接管氣象數據與 Switch 滑桿,也能拍攝時手動關掉 LCD 的顯示。

三、 無閃爍儀表板與狀態管理 (顯示層)

  1. 非同步檔案交換: 大腦程式將溫濕度、露點與即時的 PWM 數值,以 JSON 格式無聲寫入 dht22.json`。
  2. 1602 LCD 覆寫渲染: lcd_display.py 以每 2 秒一次的頻率讀取該 JSON 檔。使用 String Padding 技術 (.ljust(16)[:16]) 強制將字串補齊至 16 字元,利用空白覆寫舊字元,徹底汰除 lcd.clear(),實現零閃爍的完美監控雙排版:
    • 第一列:T:27.7C H:68.0%
    • 第二列:PWM:47 D:23.4C

四、升級雙通道獨立控制

雖然主鏡與導星鏡處在同一個氣溫與濕度環境中,但它們的熱容量 (Thermal Mass) 完全不同:

  1. 避免熱擾動毀了導星: 107 PH 的口徑大、玻璃厚,需要較強的火力 (較高的 PWM) 才能有效防露。如果導星鏡也吃一樣強的火力,輕薄的導星鏡會被烤得太燙。鏡片過熱會導致鏡筒內部產生熱空氣翻滾(熱擾動),這會讓導星相機拍出來的星星變肥、閃爍,直接導致 PHD2 的 RMS 誤差飆高,毀了整套追蹤精度。
  2. 極致的電力分配: 透過雙通道,可以讓 107 PH 吃 100% 的演算法火力,而導星鏡的通道可以透過程式碼或 NINA 稍微降壓(例如只給 50% 的權重),把高山上珍貴的深循環電池電力,精準用在刀口上。
  3. 免插拔的優雅: 實體線路全部接好後就不用再動了。換鏡筒時,直接在 NINA 介面上把不需要的那個 Heater Switch 關閉(或設定為 0),電源就徹底切斷了。

這套自製的雙通道天文中樞,在邏輯與擴充性上已經完全超越了市售除霧控制器。

影片錄製時是在春雨綿綿的日子裡:

  • PI 4 一開機,N-MOSFET 四路模組的兩路燈號就直接點亮。

  • 在 DHT22 底下放了杯熱水(畫面的右上角),水蒸氣慢慢蒸發,DHT22 偵側到溼度越來越大,所以 PWM 的值也越來越大最後來到 P:127,255,表示 N-MOSFET 四路模組的兩路輸出也來到最大,127 是接導星鏡的除霧帶,最大輸出功率只給 50% ,255 是接主鏡的除霧帶,最大輸出功率給 100% 。

  • 因為是春雨綿綿的日子,溼度太高,所以開了冷氣除溼,達到條件時(溫差 ≥ 5°C),P:0,0, 可以看到 N-MOSFET 四路模組的兩路燈號熄滅,代表除霧帶沒有加熱。接下來把冷氣關掉,打開房門,溼度回升, N-MOSFET 四路模組的兩路燈號再度點亮。

五、防水的製作過程

  • 測試過程中需要用到三用電錶來測:

    1. PWM 訊號有無正確輸出
    2. N-MOSFET 四路模組的兩路的輸出電壓是否正確輸出
  • 因為用杜邦線及單芯線,所以測試都無誤後,用熱熔膠來固定

  • DHT22 也要用熱熔膠來固定

  • 準備材料:保鮮盒、美工刀、熱熔膠、黏土

  • 割出 U 型槽讓線能過

  • U 型槽上黏土,線壓上去,然後蓋子蓋上去,大概就足夠防水了。

  • 為防水得更徹底,在黏土處再上熱熔膠,以 DHT22 為例(其他 USB 線、電源線也是一樣)
      

  • 最後的成品:

註:除霧帶的驅動邏輯

基於在 Pi4 植入的 Magnus-Tetens 公式,已擁有高精度的露點資料,可完全捨棄傳統恆溫加熱,改採動態 PWM 控制以節省電力並避免鏡筒熱氣流(Tube Currents)干擾視寧度。


2026年4月8日 星期三

天文攝影的粗對極軸小工具分享--For Android

Luke 的休閒筆記: 無法看到北極星下的極軸校正調整:使用Polar Scope Align Pro

按這裡下載

早期使用 iPhone 時,購買了這支 app ,後來發現用來粗對極軸蠻好用的,但手機換成 Motorola Razr 50 Ultra ,竟然連內建的指南針都沒有,還得上 PlayStore 下載,免費的都有廣告,所以問了 Gemini :

開發一款沒有廣告的指南針 App

  1. 自用而已,不上 PlayStore 銷售
  2. 要用在我的 MOTO Razr 50 Ultra ,且要能正常顯示在外螢幕
  3. 只要兩個功能:
    i. 指南針(具有校正功能,即 8 字繞校正)(註:第二版改成有水平泡泡的)
    ii. 能極軸校正功能(手機放在望遠鏡上時,調整赤道儀的方位角、仰角使逼近中心點。

以上由於手機的校正會因地磁及各項干擾因素,也只能粗對極軸,但這只是讓我使用 Kstar/Ecos 的三點校正極軸前置作業,讓深空攝影更加方便。

寫代碼你最專業,應該是 a pieces of cake ,至於需要的那些圖,我可以用 Affinity Photo 畫。

我要在 Mac mini 2018 OS 15.7.4 下開發,需要那些前置作業及預備那些圖,請條列。

然後在 Gemini 指導下畫了這些圖:





程式主要是針對我的 Motorola Razr 50 Ultra 內、外螢幕製作的(帶有台灣磁偏角補償的暗適應工具),特別針對外螢幕優化,我不用開蓋就能使用,如果你也是小摺應該會很好用。程式執行時畫面如下:



2026年3月17日 星期二

室女座星系群馬賽克處理

 


2021/02/22 ~2021/02/23 拍攝的室女座星系群馬賽克處理

,Gemini  建議今年四月中旬補拍填上中央空洞。

等中央空洞補上後,再來補寫完整後製過程。

之前的後製:Luke 的休閒筆記: 室女座星系群(部分)---Mosaic 總算玩出來了

2026年3月10日 星期二

🌹 玫瑰星雲 (NGC 2237) 異質數據混成標準工作流

前言

四個晚上的成果,三次社區頂樓,一次清境,實在太高難度了,要是沒有 Gemini AI 幫忙,不可能完成:這是自己後製最漂亮的玫瑰星雲,可以用來輸出大圖,掛在書房或客廳。


零、 專案背景與硬體架構


一、 數據預處理:WBPP 跨年度與異質統合

傳統手動疊圖無法應付跨越年度、不同拍攝地與濾鏡的複雜數據。必須依賴 WBPP (Weighted Batch PreProcessing) 的關鍵字分流。

  • 關鍵字分流 (Keyword Routing)
    • 於 WBPP 介面設定 Grouping Keywords(如 NIGHTFILTER)。
    • 透過檔名或資料夾分類,讓 WBPP 自動將 NB 與 STC 數據分組。

  • 校正檔精準匹配
    • 暗場 (Darks):WBPP 自動依據「曝光時間」容差,抓取跨年度的 Dark Master 匹配對應的 Light frames。
    • 平場 (Flats):透過 FILTER 與日期關鍵字,確保 NB 與 STC 各自對應當晚的光學系統除塵與減光狀態。
  • 對齊與輸出:啟用全域星點對齊與 Drizzle 放大技術,最終取得高 SNR 的 NB 與 STC 兩張 Master Light。





最後花了近一個半小時才做完:


WBPP 最後會產出四夜的單獨母圖(四個)。將 3 張 NB 母圖疊合成一張具備 3 晚總曝光量的高 SNR 影像,命名為 NB_Super_Master



二、 線性階段:色彩校正、神經網路修復與抽星 (Linear Phase)

此階段決定了星色的科學準確度與結構細節,所有破壞性修正皆在此完成,為後續的暴力拉伸鋪路。

  1. 動態背景提取 (DBE / GraXpert)

    • 消除社區頂樓的光害梯度與清境的自然天光不均。
  2. 光譜測光色彩校正 (SPCC - Spectrophotometric Color Calibration) 🌟 (核心關鍵)

    • 前置作業僅對 NB_Super_Master 執行 ImageSolver 取得精準天體座標。STC 寬帶母圖因已對齊,會自動繼承座標數據,不需重複解析。
    • 執行 SPCC:利用 Gaia DR3/SP 恆星光譜資料庫,將 STC 影像中的恆星色彩,精準校正回真實的物理發光顏色(White Reference 通常設為 Average Spiral Galaxy)。
      1. NB_Super_Master

      2. STC 寬帶母圖:

    • (註:清境那一晚的價值就在這步徹底展現,確保稍後抽出來的星星擁有最正確的紅、藍、橘色階)
  3. 光學修復 (BlurXTerminator - BXT)

    • 在降噪與抽星前,利用 BXT 執行反卷積。修復彗差、色差,將 SPCC 校正好的星點收斂至最緊實的 PSF,並銳化星雲邊緣(一張 Drizzle 過的大圖不超過一分鐘,因為會利用 eGPU 的 RX-580 來運算)。


  4. 線性降噪 (NXT ➔ 未來無縫切換 GraXpertDenoise)

    • 現階段 (NXT):利用試用期內的 NXT 以強度 0.4~0.5 進行線性打底(一張 Drizzle 過的大圖不超過一分鐘,因為會利用 eGPU 的 RX-580 來運算)。

    • 到期後 (GraXpert):由免費的 GraXpertDenoise 取代,同樣在線性階段執行,大幅抹平底噪。
      同樣的一張 Drizzle 過的大圖大約五分鐘,結果還不錯,時間也不會太長,因為免費,還能接受:
      1. 降噪前:


      2. 降噪後:

  5. 線性分離 (StarNet2)

    • 勾選 Linear dataCreate starmask

    • 分別對 NB 與 STC 兩圖執行抽星(捨棄高昂的 SXT,雖然它可以利用 eGPU,但StarNet2 的表現也還不錯,一張 Drizzle 過的大圖也不超過三分鐘,這很可以接受)。

    • 重命名與篩選:保留 NB 抽出的純星雲命名為 NB_Starless;保留 STC 抽出的純星點命名為 RGB_Stars。其餘廢圖直接捨棄。

三、 非線性階段:分離極限拉伸 (Independent Stretching)

解除星點束縛,徹底解決傳統後製「星點肥大」與「紫邊」的死結。

  1. 星雲 (NB_Starless) 的暴力拉伸

    • 開啟 STF(解鎖鏈 Unlinked 狀態),點擊核輻射預覽,將參數拖入 HistogramTransformation (HT) 打底寫入。
    • 清空 HT,開啟實時預覽進行「二次強化」。
    • 暴力操作:手動將 Midtones (灰色三角) 大幅向左推,逼出暗部極限雲氣;將 Shadows (黑色三角) 微幅向右推以壓制背景起灰。寫入後關閉 STF。

  2. 星點 (RGB_Stars) 的溫和拉伸

    • ⚠️ 嚴禁使用 STF 自動拉伸(純黑背景會讓演算法崩潰產生破萬倍拉伸與紫邊)。
    • 開啟 HT 實時預覽,完全手動將 Midtones 緩慢向左推(約至 0.04~0.05),Shadows 絕對保持 0
    • 確認星點維持 BXT 收斂後的細小緊實且色彩真實後,實體寫入。

四、 終極嵌合與後期修飾 (Recomposition & Polish)

  1. 螢幕濾色合體 (PixelMath)

    • 公式:~(~NB_Starless * ~RGB_Stars)
    • 設定:Create new imageRGB Color,生成 Final_Rosette。將星點完美鑲嵌回星雲。

  2. 全域去綠 (SCNR)

    • 針對背景殘留的光害色斑,執行 SCNR (Green, 1.0, Average Neutral)。
  3. 非線性二次降噪 (視情況補強)

    • 若暴力拉伸導致暗部浮現色度噪點,再次施放 NXT 或 GraXpert (Strength 0.75) 抹平背景。
  4. 立體感與色彩重塑 (CurvesTransformation)

    • RGB/K 通道 (S型曲線):在曲線左下 1/4 處「自訂控制點」向下拉(壓暗背景,拒絕死黑);右上 3/4 處上推(提升高光對比)。
    • S 通道 (飽和度):曲線中段大幅上提,使窄帶 Ha 呈現紅寶石色,並激發寬帶恆星的耀眼色彩。


五、 輸出與發佈準備 (Output Prep)

為確保社群媒體分享時不掉色、不劣化。

  1. 色彩管理 (ICCProfileTransformation)

    • 嵌入 sRGB IEC61966-2.1 描述檔,確保跨裝置顯色一致。
  2. 最佳化縮放 (Resample)

    • 鎖定比例,將寬度縮放至黃金標準 2048px
  3. 最終存檔

    • 母檔保存為 32-bit XISF
    • 分享檔匯出為 Quality 100JPEG

結論

這套 SOP 完美示範了「分而治之」(頂樓窄頻攻結構、清境寬頻攻星色)的現代深空攝影哲學。透過 WBPP 與 ImageIntegration 解決跨夜窄頻的疊合,利用 ImageSolver 解析主結構座標並讓寬頻圖自動繼承,接著以 SPCC 定錨科學星色。線性階段結合 BXT 的光學收斂與 NXT/GraXpert 的強大降噪,最後利用 StarNet2 徹底分離星雲與星點進行獨立 HT 拉伸。

這種最大化硬體價值發揮了 Mac mini 與 eGPU 的硬體潛力,將頂樓高光害的深層雲氣與清境暗空的純粹星色完美融合,不僅成功降伏了高光害與異質數據的干擾,更確保了最終影像具備「星點細膩緊實、雲氣狂暴深邃」的水準。這份文件足以作為未來所有高難度天體專案的最強技術基底。