DHT22(溫濕度)|GY-302 / BH1750(照度)|Watermark(土壤張力/濕度推估)
本專案使用 **8051 微控制器(MEGAWIN MPC82G 系列)**作為資料擷取端,整合多顆感測器並透過 UART 傳輸至電腦端,由 MATLAB 進行資料解析、換算、記錄與後處理。
- DHT22 one-wire 通訊自行實作:8051 端以時序控制方式讀取 40-bit 資料並組成封包(含 checksum)
- GY-302(BH1750)軟體 I²C(bit-bang)自行實作:因 8051 環境無原生 I²C 介面,手動完成 START/STOP/ACK/NACK、讀寫流程
- Watermark 以 ADC 取樣,MATLAB 端換算成電阻與土壤張力(tension):透過電路模型將 ADC 轉換為電壓,再推回電阻,並用 MATLAB 分段公式換算張力/含水狀態指標
- LMV358 實驗與電路量測差異分析:針對 Watermark 正反向量測電阻差異進行測試與改善方案(見
LMV358_test.pdf)
- 整合多感測器流程與排程:以 Timer0 中斷週期性觸發感測、資料整理與 UART 輸出(
All_Sensor.c) - DHT22 one-wire driver 自製
- 起始訊號、bit 時序判斷、40-bit 讀取與 5 bytes 組包(
DHT.c/.h)
- 起始訊號、bit 時序判斷、40-bit 讀取與 5 bytes 組包(
- GY-302 / BH1750 軟體 I²C 自製
- bit-bang 實作 I²C 協議並完成 BH1750 指令設定與資料讀取(
GY.c/.h)
- bit-bang 實作 I²C 協議並完成 BH1750 指令設定與資料讀取(
- Watermark 多通道掃描 + 正反向激勵 + ADC 讀取
- 控制 MUX 選通、enable、以及正反向激勵切換,讀取 ADCH/ADCL 並以 UART 回傳(
watermark.c/.h)
- 控制 MUX 選通、enable、以及正反向激勵切換,讀取 ADCH/ADCL 並以 UART 回傳(
- 通訊同步/復原機制
- 主機回傳特定值(例如 255)時可重置封包序號/狀態以利重新同步(依現有設計)
- 串口收資料、封包檢查與錯誤復原(flush + 重同步)
- Watermark:ADC → 電壓 → 電阻 → 張力(tension)分段換算(含溫度補償參數)
- 自動輸出 Excel、依日期建立資料夾(並可選擇同步拍照記錄)(
data_processing.m)
- 針對 Watermark 量測中「正反向阻值不一致」進行根因實驗
- 驗證 LMV358 在低電位輸出與非理想行為可能造成 ADC 偏差,並提出較佳配置建議
詳細內容請參考:LMV358_test.pdf
.
├─ All_Sensor.c # 主程式:Timer 排程 + 讀取所有感測器 + UART 輸出
├─ DHT.c
├─ DHT.h # DHT22 one-wire 時序實作
├─ GY.c
├─ GY.h # GY-302(BH1750) 軟體 I2C 實作
├─ watermark.c
├─ watermark.h # Watermark:MUX 掃描 + 正反向量測 + ADC 讀取
├─ data_processing.m # MATLAB:串口收資料、換算、寫 Excel(可含拍照)
├─ Sensor_testing_and_Plan_of_this_project.pdf # 各感測器測試實驗流程、結果與規劃
└─ LMV358_test.pdf # LMV358 測試與電路偏差分析報告
flowchart LR
DHT["DHT22\none-wire bitbang"] --> MCU["8051 Timer Scheduler"]
GY["GY-302/BH1750\nsoftware I2C"] --> MCU
WM["Watermark\nMUX + ADC + polarity swap"] --> MCU
MCU -->|UART bytes| PC["MATLAB data_processing.m"]
PC --> XLSX["Excel log"]
PC --> IMG["Camera snapshots (optional)"]
腳位可能依你的板子/接線略有不同,以下為程式內使用之 port 定義概念(請以實際硬體為準)
| 模組 | 訊號 | 8051 Port(範例) | 說明 |
|---|---|---|---|
| DHT22 | DATA | P2.5 |
one-wire,需上拉 |
| GY-302 (BH1750) | SDA | P2.0 |
軟體 I²C |
| SCL | P2.1 |
軟體 I²C | |
| Watermark | ADC_IN (bank1) | P1.0 |
ADC |
| Watermark | ADC_IN (bank2) | P1.1 |
ADC |
| Watermark 控制 | cc1/cc2/cc3/cc4 | P1.x |
正反向激勵/切換 |
| MUX 選擇 | s0/s1/s2 | P0.x |
多通道選擇 |
| MUX enable | m1en/m2en | P0.x / P2.x |
bank enable |
| UART | TX/RX | 依晶片/板子 | MATLAB 端連接 |
本專案 UART 端主要傳輸:
- DHT22:5 bytes(濕度高/低、溫度高/低、checksum)
- BH1750:2 bytes(照度 raw)
- Watermark:ADC raw(可包含多通道與正反向量測)
- 封包同步:可透過 header/footer 或序號機制進行重同步(依韌體/腳本設計)
📌 注意:目前韌體端可能輸出「多通道完整資料」,而
data_processing.m可能採用「簡化封包」解析。
建議在「能精進的部分」所述,將封包格式統一並加入 CRC/length。
data_processing.m 的主要概念:
- ADC code → 電壓(Vs 為供應電壓)
- 電壓 → 電阻(依分壓/電路模型)
- 正反向電阻取平均以降低偏差
- 電阻 → soil tension(分段公式 + 溫度補償)
在 Watermark 量測中發現「正反向量測電阻不一致」現象,因此針對 LMV358 做實驗分析:
- 驗證運放低電位輸出、非理想特性可能使 ADC 讀值偏離理論
- 比較「有/無 LMV358」時線性校正效果,並提出較佳電路配置方向
詳細流程、量測數據與結論請見9.9報告.pdf。
- 使用 Keil C51 或對應 8051 toolchain 編譯
- 確認包含晶片對應暫存器/標頭檔(例如
REG_MPC82G516.h) - 燒錄後上電,系統將定期量測並透過 UART 輸出
- 開啟
data_processing.m - 修改:
- COM port(例如
COM6) - BaudRate(例如 9600)
- 參數:
Vs / R / temp(依實際電路與環境)
- COM port(例如
- 執行後開始接收、解析、換算並寫入 Excel(可選拍照觀察植物狀態)
以下是本專案可以再進一步強化的方向(可作為 repo 的 roadmap):
- 目前韌體端可能輸出「多通道 + 序號」,MATLAB 端可能使用「簡化封包」
✅ 建議統一為固定格式,例如: - Header(2 bytes)
- Payload length(1 byte)
- Payload(N bytes)
- CRC8/CRC16(1~2 bytes)
- Footer(1 byte)
這會讓 MATLAB 端在遇到雜訊/掉 byte 時更容易重同步,也更適合長時間紀錄。
- 目前可先支援單通道(或少數通道)以利驗證
- 後續擴充到完整 bank1/bank2 所有通道 (透過於電路中外加多工器以切換不同通道):
- 輸出成表格(時間 × 通道 tension)
- 每通道可視化(趨勢圖、濾波、異常偵測)
- DHT22 checksum 在韌體端也可做快速驗證(錯誤直接丟棄或重讀)
- BH1750 讀取可加入 ACK 檢查與 retry
- UART 傳輸可加入重送/序號對齊策略
- Watermark 換算公式可整理為「校正參數檔」(CSV/JSON 或 MATLAB struct)
- 將 LMV358 造成的偏差以校正曲線/offset 的形式納入(視硬體配置而定)
建議可使用 MIT License(或依課程/實驗室規範調整)。
- 感測器:DHT22、GY-302(BH1750)、Watermark
- LMV358 測試與報告:見
LMV358_test.pdf