当前位置: 首页 > news >正文

告别串口助手!用STM32F103+DHT11做个OLED屏显温湿度计,附电路与程序

从串口到OLED:基于STM32F103与DHT11的桌面级温湿度监测仪开发实战

在嵌入式开发领域,温湿度监测是最基础却又最实用的应用场景之一。许多开发者最初接触传感器时,都会选择DHT11这类性价比极高的温湿度传感器作为入门,并通过串口打印数据来验证采集结果。但当我们希望将这个简单的实验转化为一个真正可用的独立设备时,串口显示就显得不够直观和专业了。本文将带你完成从"调试工具依赖"到"独立产品原型"的跃迁,使用STM32F103微控制器驱动OLED屏幕,打造一个可直接放置在桌面的精致温湿度监测仪。

1. 硬件选型与系统架构设计

1.1 核心组件选型考量

构建一个可靠的温湿度监测系统,硬件选型是首要考虑因素。我们的系统主要由三个核心部件组成:

  • 主控芯片:STM32F103C8T6(最小系统板)

    • 72MHz Cortex-M3内核,性能足够处理传感器数据
    • 丰富的GPIO和外设接口(I2C、SPI等)
    • 低功耗特性适合电池供电场景
    • 成本低廉且开发资源丰富
  • 温湿度传感器:DHT11

    • 数字信号输出,免去额外ADC电路
    • 已校准输出,无需复杂算法处理
    • 单总线接口,节省IO资源
    • 测量范围:20-90%RH(湿度),0-50℃(温度)
  • 显示模块:0.96寸OLED(SSD1306驱动)

    • I2C接口版本(节省IO,简化布线)
    • 128x64分辨率,支持图形显示
    • 自发光无需背光,功耗极低
    • 超薄设计,适合紧凑型产品

1.2 系统连接方案对比

在实际连接时,我们需要考虑两种主要接口方案的优劣:

特性I2C方案SPI方案
接线复杂度仅需2线(SCL+SDA)通常需要4线(CS+SCK+MOSI+DC)
通信速度标准模式100kHz可达数MHz
屏幕刷新率满足基本需求更适合动画或快速刷新
占用IO数量2个4-5个
代码复杂度简单稍复杂

对于我们的温湿度监测应用,数据更新频率要求不高(DHT11最快1Hz采样),因此I2C接口的OLED是最佳选择,既能简化电路连接,又能节省宝贵的IO资源。

2. 硬件电路设计与实现

2.1 完整电路原理图

系统电路连接主要分为三个部分:

  1. STM32最小系统电路

    • 包括晶振电路(8MHz主晶振+32.768kHz RTC晶振)
    • 复位电路(10k上拉电阻+100nF电容)
    • 电源滤波(每电源引脚接100nF去耦电容)
  2. DHT11连接电路

    VCC ---- 3.3V DATA --- PB11(通过4.7k上拉电阻) GND ---- GND
  3. OLED连接电路

    VCC ---- 3.3V GND ---- GND SCL ---- PB6(I2C1_SCL) SDA ---- PB7(I2C1_SDA)

注意:DHT11的数据线必须接上拉电阻(典型值4.7kΩ),否则可能无法正常读取数据。部分模块已内置此电阻,需确认模块规格。

2.2 供电方案优化

为了使设备真正实现便携化,我们需要考虑多种供电方案:

  • USB供电:最简单的方式,通过开发板的Micro USB接口供电
  • 锂电池供电:采用3.7V锂电池+TP4056充电管理模块
    • 优点:完全无线,可移动使用
    • 缺点:需要定期充电
  • CR2032纽扣电池:适合超低功耗设计
    • 优点:体积小,更换方便
    • 缺点:容量有限,需优化功耗

推荐方案:对于常驻桌面的使用场景,可采用USB供电;如需完全便携,建议使用600mAh以上的锂电池,配合低功耗设计可连续工作数周。

3. 软件架构与核心代码实现

3.1 工程框架设计

合理的软件架构能大幅提升代码可维护性。我们采用模块化设计,主要分为以下几个部分:

├── Drivers │ ├── STM32F1xx_HAL_Driver │ └── CMSIS ├── Inc │ ├── dht11.h │ ├── oled.h │ └── ui.h ├── Src │ ├── main.c │ ├── dht11.c │ ├── oled.c │ └── ui.c └── Middlewares └── FreeRTOS (可选)

3.2 DHT11驱动优化

相比原始串口版本,我们需要对DHT11驱动进行可靠性增强:

// dht11.h typedef struct { uint8_t temp_int; uint8_t temp_deci; uint8_t humi_int; uint8_t humi_deci; uint8_t checksum; } DHT11_Data; uint8_t DHT11_Read(DHT11_Data *data); // dht11.c uint8_t DHT11_Read(DHT11_Data *data) { uint8_t buf[5] = {0}; // 发送开始信号 DHT11_Start(); // 检查响应 if(!DHT11_Check()) return 0; // 读取40位数据 for(int i=0; i<5; i++) { buf[i] = DHT11_ReadByte(); } // 校验数据 if(buf[4] != (buf[0]+buf[1]+buf[2]+buf[3])) { return 0; } // 填充数据结构 >// oled.h void OLED_Init(void); void OLED_Clear(void); void OLED_ShowString(uint8_t x, uint8_t y, char *str); void OLED_ShowTempHum(float temp, float hum); // oled.c void OLED_WriteCmd(uint8_t cmd) { HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, 0x00, 1, &cmd, 1, 100); } void OLED_WriteData(uint8_t data) { HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, 0x40, 1, &data, 1, 100); } void OLED_ShowTempHum(float temp, float hum) { char buffer[16]; OLED_Clear(); // 显示温度 sprintf(buffer, "Temp: %.1fC", temp); OLED_ShowString(0, 0, buffer); // 显示湿度 sprintf(buffer, "Hum: %.1f%%", hum); OLED_ShowString(0, 2, buffer); // 添加简单图形 OLED_DrawRect(0, 4, 127, 63); }

4. 用户界面设计与产品化思考

4.1 信息可视化设计

优秀的UI设计能让数据更直观。我们可以考虑以下元素:

  • 基本数据区:清晰显示当前温湿度数值
  • 趋势指示:使用简易箭头表示变化趋势(▲升高 ▼降低)
  • 舒适度提示:根据温湿度给出舒适度评价
    • 温度舒适范围:18-26℃
    • 湿度舒适范围:40-60%RH
  • 历史极值:显示最近24小时内的最高/最低记录
void UpdateUI(DHT11_Data data) { static float last_temp = 0, last_hum = 0; float current_temp = data.temp_int + data.temp_deci/10.0; float current_hum = data.humi_int + data.humi_deci/10.0; // 清除旧内容 OLED_ClearArea(0, 0, 127, 63); // 显示温度 OLED_ShowBigNumber(10, 0, current_temp, 1); OLED_ShowString(90, 0, "C"); // 显示湿度 OLED_ShowBigNumber(10, 3, current_hum, 1); OLED_ShowString(90, 3, "%"); // 显示趋势箭头 if(current_temp > last_temp) { OLED_ShowChar(80, 0, 0x18); // 上箭头 } else if(current_temp < last_temp) { OLED_ShowChar(80, 0, 0x19); // 下箭头 } // 更新记录 last_temp = current_temp; last_hum = current_hum; }

4.2 外壳设计与安装方案

产品化需要考虑物理形态设计。以下是几种可行的方案:

  1. 3D打印外壳

    • 优点:完全定制化,可完美贴合电路板
    • 缺点:需要3D建模和打印设备
  2. 现成塑料盒改装

    • 优点:成本低,易于获取
    • 缺点:美观度较差,需要手工开孔
  3. 亚克力层叠结构

    • 优点:现代感强,透明度可选
    • 缺点:加工精度要求高

推荐方案:对于个人项目,可使用Thingiverse等平台上的开源设计,如"OLED Weather Station Case",通常已经包含屏幕开孔和安装柱位。

4.3 低功耗优化技巧

如需电池供电,可实施以下优化措施:

  • 将STM32设置为低功耗模式(Stop模式)
  • 降低DHT11采样频率(如每30秒一次)
  • 在两次采样间关闭OLED电源
  • 使用硬件定时器唤醒而非Delay循环
void EnterLowPowerMode(void) { // 关闭OLED OLED_PowerOff(); // 配置唤醒定时器 HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 30, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); // 进入Stop模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新初始化时钟 SystemClock_Config(); OLED_Init(); }

5. 进阶功能扩展

基础功能实现后,可以考虑添加以下增值功能:

5.1 数据记录与导出

添加SD卡模块,实现温湿度数据记录:

void LogDataToSD(float temp, float hum) { FIL file; char buffer[64]; time_t now = RTC_GetTime(); // 打开文件(追加模式) f_open(&file, "datalog.txt", FA_OPEN_APPEND | FA_WRITE); // 格式化数据 sprintf(buffer, "%lu,%.1f,%.1f\r\n", now, temp, hum); // 写入文件 f_write(&file, buffer, strlen(buffer), NULL); // 关闭文件 f_close(&file); }

5.2 无线数据传输

通过ESP8266或HC-05模块实现蓝牙/WiFi数据传输:

  1. 蓝牙方案(HC-05)

    • 优点:功耗低,连接简单
    • 缺点:传输距离短(约10米)
  2. WiFi方案(ESP8266)

    • 优点:可接入互联网,远程查看
    • 缺点:功耗较高,需要网络环境

5.3 多节点组网监测

使用NRF24L01等射频模块构建多点监测网络:

  • 主节点:负责显示和记录
  • 子节点:分布在各个监测点
  • 通信协议:自定义简单协议或MQTT-SN
// 简单的RF数据包结构 typedef struct { uint8_t node_id; float temperature; float humidity; uint32_t timestamp; } SensorDataPacket;

在实际部署中发现,OLED屏幕在强光环境下的可视性是个挑战。一种解决方案是选用高对比度的SH1106驱动芯片的屏幕,或者添加环境光传感器,根据光线强度自动调整屏幕亮度。另一个常见问题是DHT11在长期运行后可能出现数据异常,可以通过软件滤波(如滑动平均)和定期自检机制来提高稳定性。

http://www.jsqmd.com/news/801611/

相关文章:

  • Android Studio可视化布局神器:ConstraintLayout Barrier的拖拽式实战教程
  • 基于FastAPI逆向封装Qwen官方接口,实现本地化AI对话API服务
  • SSRS报表中数据合并的艺术
  • 长期使用Taotoken聚合API的稳定性与可靠性观察
  • 淘金币自动化脚本:解放双手的终极指南
  • 在MATLAB与Unreal Engine中搭建自动驾驶高保真仿真环境
  • WarcraftHelper:如何让经典魔兽争霸3在现代系统上流畅运行?
  • Windows 11安卓子系统完整指南:让你的电脑秒变手机应用中心
  • 明日方舟基建自动化管理终极指南:如何用Arknights-Mower彻底解放双手
  • 从MATLAB报错‘错误使用open(第136行)’到函数命名冲突的深度排查
  • C++中vector与string的关键应用及区别解析
  • 1.Python中ORM基础启动连接步骤
  • Windows密码忘了怎么办?一分钟看懂Windows密码底层机制:无需重装系统也能无痕找回登录密码
  • 告别ImageNet!用CLIP+Prompt工程,5分钟搞定你的第一个零样本图像分类器
  • 2026花洒品牌排行榜推荐:口碑好高性价比国产花洒选购指南 - 博客湾
  • 终极免费工具:WindowResizer让你完全掌控Windows窗口大小
  • XUnity.AutoTranslator:Unity游戏实时本地化引擎的技术架构与实践
  • 厌氧发酵罐主流供应商硬核横评:佳德精密 vs 有道生工,谁才是你的“天选”方案? - 品牌推荐大师1
  • 【LLC】逻辑链路控制:数据链路层的“统一翻译官”与异构网络互联的幕后功臣
  • 项目经理实战指南:如何用权力/利益方格和凸显模型搞定难缠的客户与领导?(真实案例拆解)
  • Unity 气泡留言墙:无限滚动照片流的实现
  • 2026年二季度国内COD水质分析仪厂家十大品牌盘点 - 流量计品牌
  • Typora“激活”与“美化”实战指南
  • BetterOCR:基于LLM增强的本地化OCR工具,实现高精度文本识别与结构化处理
  • 基于Selenium的Web自动化任务执行器:从配置驱动到工程实践
  • 别再手动烧录了!用STM32CubeMX和串口IAP,5分钟搞定远程固件升级
  • 在峡谷中自由换装:R3nzSkin国服特供版的技术实现与实战指南
  • 二手变压器回收公司排行:五大核心选品指标对照 - 奔跑123
  • 2026年GEO优化系统横评:快米兔GEO、锐思优化GEO、聚力GEO,信息安全与合规性对比 - 速递信息
  • SMNet复合故障诊断用于工业机器人关节