>应用场景>
/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

构建与烧录: 只需点击界面工具栏中的“构建”和“烧录”按钮。