项目简介
这是一个实时温湿度监测系统:使用 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 中直接打开此项目文件夹。
构建与烧录: 只需点击界面工具栏中的“构建”和“烧录”按钮。