STM32F103温湿度监控系统设计与实现
1. 项目概述与核心功能这个基于STM32F103的温湿度监控系统通过DHT11和DS18B20两个传感器实现了环境参数的实时采集与异常报警功能。作为嵌入式开发的经典案例它完美展示了如何利用单片机处理多传感器数据并实现人机交互。系统核心功能包括双传感器数据采集DHT11获取温湿度DS18B20获取温度TFTLCD屏幕实时显示测量值串口调试输出数据可配置的阈值报警功能默认85℃/90%RH蜂鸣器声光报警按键控制报警模式开关注意DS18B20虽然只测量温度但与DHT11的温度数据形成交叉验证这种双传感器设计既能提高可靠性又能发现单个传感器的异常情况。2. 硬件架构设计2.1 主控芯片选型STM32F103C8T6作为核心控制器其优势在于72MHz主频满足实时性要求内置ADC和多个定时器丰富的GPIO接口需要至少3个普通IO成本低廉且生态完善2.2 传感器模块对比传感器测量范围精度接口响应时间特点DHT1120-90%RH, 0-50℃±5%RH, ±2℃单总线2s集成温湿度测量DS18B20-55~125℃±0.5℃单总线750ms防水封装可选2.3 电路连接方案// 典型接线配置正点原子精英版 #define DS18B20_DQ_PIN PG11 // 温度传感器数据线 #define DHT11_DATA_PIN PB10 // 温湿度传感器数据线 #define BUZZER_PIN PB8 // 蜂鸣器控制 #define KEY1_PIN PA0 // 报警启用按键 #define KEY0_PIN PC13 // 报警禁用按键3. 软件实现细节3.1 主程序流程设计ststart: 系统初始化 op1operation: 传感器初始化 op2operation: LCD初始化 op3operation: 读取DHT11数据 op4operation: 读取DS18B20数据 op5operation: 数据显示更新 condcondition: 报警模式激活? op6operation: 阈值判断 op7operation: 触发蜂鸣器 eend: 循环执行 st-op1-op2-op3-op4-op5-cond cond(yes)-op6-op7-e cond(no)-e3.2 关键驱动实现DHT11通信协议解析void DHT11_Read_Data(uint8_t *temp, uint8_t *humi) { // 主机拉低18ms后拉高20-40us DHT11_OUT(0); Delay_ms(18); DHT11_OUT(1); Delay_us(30); // 等待传感器响应 while(DHT11_IN); while(!DHT11_IN); while(DHT11_IN); // 接收40bit数据16bit湿度16bit温度8bit校验 for(uint8_t i0; i5; i) { for(uint8_t j0; j8; j) { while(!DHT11_IN); Delay_us(40); data[i] 1; if(DHT11_IN) data[i] | 1; while(DHT11_IN); } } }DS18B20温度转换float DS18B20_GetTemp(void) { uint8_t tempL, tempH; DS18B20_Start(); // 启动温度转换 DS18B20_Read(tempL, tempH); // 读取温度值 float temp (tempH 8) | tempL; return temp * 0.0625; // 12位精度转换 }3.3 报警逻辑实现void Alarm_Check(float temp, float humi) { static uint8_t alarm_flag 0; if(alarm_mode) { // 报警模式激活 if(temp TEMP_THRESHOLD || humi HUMI_THRESHOLD) { BEEP_ON; alarm_flag 1; printf([ALARM] Temp:%.1fC Humi:%.1f%%\r\n, temp, humi); } else if(alarm_flag) { BEEP_OFF; alarm_flag 0; } } else { BEEP_OFF; // 强制关闭报警 } }4. 开发经验与优化建议4.1 常见问题排查表现象可能原因解决方案DHT11无响应接线错误/供电不足检查VCC-GND电压(3.3-5V)温度值异常总线干扰缩短导线长度加1K上拉电阻LCD显示乱码初始化时序错误调整延时参数检查复位信号蜂鸣器不响驱动电流不足改用NPN三极管驱动4.2 性能优化技巧传感器轮询策略将DHT11和DS18B20的读取操作交错进行避免同时等待显示刷新优化仅更新变化的数据区域减少LCD刷新量报警消抖处理增加3-5秒的延迟判断避免瞬时波动误触发低功耗设计在非采样时段将MCU切到Sleep模式4.3 扩展功能建议增加RTC模块记录报警事件通过蓝牙/NB-IoT实现远程监控添加EEPROM存储阈值配置开发上位机数据分析软件5. 关键参数配置参考5.1 定时器配置2秒周期void TIM3_Init(u16 arr, u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period arr; // 自动重装值 TIM_TimeBaseStructure.TIM_Prescaler psc; // 预分频系数 TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_Cmd(TIM3, ENABLE); } // 示例72MHz/(71991)/(9991) 10Hz - 100ms中断5.2 LCD显示布局设计--------------------- | DS18B20: 25.6℃ | | DHT11: 26.1℃ 45%RH | | | | Alarm: OFF | ---------------------6. 传感器校准建议交叉验证法将DHT11和DS18B20置于同一环境对比温度读数参考源校准使用专业温湿度计作为基准软件补偿发现DHT11在高温下偏差较大时可添加补偿公式float humidity_compensation(float raw) { if(raw 70.0) return raw * 0.98; // 高湿区补偿 return raw; }实际部署时建议将传感器远离MCU板避免主板发热影响测量精度。我在一个农业大棚项目中将传感器通过1米延长线引出后温度测量偏差从2℃降到了0.5℃以内。