專案簡介
這是一套即時溫溼度監測系統:使用 N32G031 微控制器和 DHT11 感測器擷取資料,並顯示在 OLED 螢幕上。本專案已針對 UnityMbed 跨平台工作流程完成最佳化。
Nations N32G031 Cortex-M0
OLED I2C (PB6: SCL, PB7: SDA)
DHT11 單匯流排(PA5)
示範影片
接線與硬體連接
請依照下表,將 DHT11 感測器及 OLED(I2C)顯示器的接腳連接至 N32G031 開發板排針:
| 裝置 | 裝置接腳 | N32G031 開發板接腳 | 說明與注意事項 |
|---|---|---|---|
| DHT11 | DATA / OUT | PA5 | 需要 4.7kΩ–10kΩ 上拉電阻(模組未內建時) |
| DHT11 | VCC | 3.3V / 5V | 請確認感測器的額定電壓 |
| DHT11 | GND | GND | 系統共地 |
| OLED (I2C) | SCL | PB6 | I2C 時脈訊號 |
| OLED (I2C) | SDA | PB7 | I2C 資料訊號 |
| OLED (I2C) | VCC | 3.3V | 顯示器電源 |
| OLED (I2C) | GND | GND | 系統共地 |
運作方式與執行邏輯
螢幕提示與輸出
啟動畫面
系統啟動時,螢幕會顯示歡迎訊息 1.5 秒。
System Ready
正常運作
系統只會在數值變更時更新顯示,以避免螢幕閃爍。
Temp: 28 °C
Humidity: 65 %
錯誤狀態
如果 DHT11 連線中斷或損壞,系統會清除畫面並顯示警告。
Sensor Error!
Check Wiring.
#include "n32g031.h"
#include "n32g031_gpio.h"
#include "n32g031_rcc.h"
#include "core_cm0.h"
#include "dht11.h"
#include "oled.h"
#include "utils.h"
#include <stdio.h>
int main(void)
{
uint8_t current_temp = 0;
uint8_t current_humi = 0;
uint8_t last_temp = 255;
uint8_t last_humi = 255;
uint8_t was_error = 1;
// 1. 新增變數,用來記錄連續讀取失敗的次數
uint8_t error_count = 0;
char buffer[20];
SystemInit();
SystemCoreClockUpdate();
delay_ms(500);
OLED_Init();
OLED_Clear();
DHT11_Init();
OLED_ShowString(10, 24, "System Ready", 16);
delay_ms(1500);
OLED_Clear();
while (1)
{
if (DHT11_Read_Data(¤t_temp, ¤t_humi) == 1)
{
// 2. 讀取成功後,立即將錯誤計數器重設為 0
error_count = 0;
if (was_error) {
OLED_Clear();
OLED_ShowString(0, 0, "Temp: ", 8);
OLED_ShowString(0, 32, "Humidity: ", 8);
was_error = 0;
last_temp = 255;
last_humi = 255;
}
if (current_temp != last_temp) {
sprintf(buffer, "%02d C ", current_temp);
OLED_ShowString(0, 12, buffer, 16);
OLED_ShowString(24, 12, "o", 8);
last_temp = current_temp;
}
if (current_humi != last_humi) {
sprintf(buffer, "%02d %% ", current_humi);
OLED_ShowString(0, 44, buffer, 16);
last_humi = current_humi;
}
}
else
{
// 3. 讀取失敗時,將錯誤計數器加 1
error_count++;
// 4. 連續失敗 3 次後(通常表示接線中斷),清除畫面並顯示錯誤訊息
if (error_count >= 3) {
if (!was_error) {
OLED_Clear();
was_error = 1;
}
OLED_ShowString(0, 0, "Sensor Error! ", 16);
OLED_ShowString(0, 24, "Check Wiring. ", 16);
}
}
delay_ms(2000);
}
}學習與 AI 延伸構想
透過分析程式碼架構和狀態追蹤變數(如 error_count、last_temp、last_humi),學習者可以探索以下 AI 輔助延伸:
體感指數與舒適度
讓 AI 使用 Standard Peripheral Library(SPL)為 N32G031 規劃 main.c 的架構,讀取 DHT11 溫溼度資料並顯示在 128×32 OLED 上,再透過 if-else 邏輯判斷 Warning、Hot、Cool、Comfort 等舒適度狀態,同時練習透過 Direct Register 直接控制 LED。
最高與最低溫度統計
讓 AI 使用全域變數實作最高/最低溫度統計,並在每次成功讀取感測器後更新資料;同時整理 OLED 顯示配置,讓目前溫度和即時統計資訊一目了然。
以 Direct Register 實作非阻塞閃爍警示
讓 AI 在不依賴 HAL 的情況下,透過 Direct Register 設定 GPIO,並在溫度超過臨界值或感測器發生錯誤時驅動警示 LED。使用迴圈計數器取代 delay(),避免阻塞系統的其他工作。
即時雙折線圖(迷你示波器)
讓 AI 建立畫面緩衝區,並使用 Bresenham 直線演算法繪製可捲動的雙折線圖,以比較溫度和溼度;再加入背景網格,將 OLED 變成迷你示波器。
建置與燒錄指南
開啟專案: 在 IDE 中直接開啟此專案資料夾。
建置與燒錄: 只要點選介面工具列中的「建置」和「燒錄」按鈕。