>應用案例>
/N32G031_OLED_DHT11

在 OLED 上顯示 DHT11 資料

N32G031_OLED_DHT11

專案簡介

這是一套即時溫溼度監測系統:使用 N32G031 微控制器和 DHT11 感測器擷取資料,並顯示在 OLED 螢幕上。本專案已針對 UnityMbed 跨平台工作流程完成最佳化。

目標 MCU

Nations N32G031 Cortex-M0

顯示介面

OLED I2C (PB6: SCL, PB7: SDA)

感測器

DHT11 單匯流排(PA5)

示範影片

接線與硬體連接

請依照下表,將 DHT11 感測器及 OLED(I2C)顯示器的接腳連接至 N32G031 開發板排針:

裝置裝置接腳N32G031 開發板接腳說明與注意事項
DHT11DATA / OUTPA5需要 4.7kΩ–10kΩ 上拉電阻(模組未內建時)
DHT11VCC3.3V / 5V請確認感測器的額定電壓
DHT11GNDGND系統共地
OLED (I2C)SCLPB6I2C 時脈訊號
OLED (I2C)SDAPB7I2C 資料訊號
OLED (I2C)VCC3.3V顯示器電源
OLED (I2C)GNDGND系統共地

運作方式與執行邏輯

螢幕提示與輸出

1

啟動畫面

系統啟動時,螢幕會顯示歡迎訊息 1.5 秒。

螢幕顯示:

System Ready

2

正常運作

系統只會在數值變更時更新顯示,以避免螢幕閃爍。

螢幕顯示:

Temp:    28 °C

Humidity: 65 %

3

錯誤狀態

如果 DHT11 連線中斷或損壞,系統會清除畫面並顯示警告。

螢幕顯示:

Sensor Error!

Check Wiring.

main.c
#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(&current_temp, &current_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 輔助延伸:

1

體感指數與舒適度

讓 AI 使用 Standard Peripheral Library(SPL)為 N32G031 規劃 main.c 的架構,讀取 DHT11 溫溼度資料並顯示在 128×32 OLED 上,再透過 if-else 邏輯判斷 Warning、Hot、Cool、Comfort 等舒適度狀態,同時練習透過 Direct Register 直接控制 LED。

2

最高與最低溫度統計

讓 AI 使用全域變數實作最高/最低溫度統計,並在每次成功讀取感測器後更新資料;同時整理 OLED 顯示配置,讓目前溫度和即時統計資訊一目了然。

3

以 Direct Register 實作非阻塞閃爍警示

讓 AI 在不依賴 HAL 的情況下,透過 Direct Register 設定 GPIO,並在溫度超過臨界值或感測器發生錯誤時驅動警示 LED。使用迴圈計數器取代 delay(),避免阻塞系統的其他工作。

4

即時雙折線圖(迷你示波器)

讓 AI 建立畫面緩衝區,並使用 Bresenham 直線演算法繪製可捲動的雙折線圖,以比較溫度和溼度;再加入背景網格,將 OLED 變成迷你示波器。

建置與燒錄指南

1

開啟專案: 在 IDE 中直接開啟此專案資料夾。

2

建置與燒錄: 只要點選介面工具列中的「建置」和「燒錄」按鈕。