DIY智能温湿度计STM32F103C8T6驱动DS18B20与DHT11全攻略在创客圈里温湿度监测项目就像Hello World之于编程新手——看似简单却蕴含无限可能。今天我们要用一块售价不到20元的STM32F103C8T6最小系统板蓝桥杯比赛常用型号搭配经典的DS18B20温度传感器和DHT11温湿度传感器打造一个成本控制在50元以内的高性价比智能监测设备。不同于单纯的技术文档本文将带你体验从元器件选型到数据可视化的完整项目生命周期。1. 硬件选型与电路设计1.1 核心器件选型指南STM32F103C8T6最小系统板的选择有几点需要注意优先选择带有CH340G串口芯片的版本方便USB调试确认BOOT0/BOOT1跳线帽是否便于操作检查板载3.3V稳压芯片的型号AMS1117-3.3较常见传感器选型对比型号精度响应时间通信方式价格区间DS18B20±0.5℃750ms单总线3-8元DHT11±2℃/±5%RH2s单总线5-12元提示DS18B20有防水不锈钢封装版本适合户外场景价格会贵2-3元1.2 电路连接方案推荐两种接线方式基础版仅使用串口输出DS18B20数据线接PA04.7K上拉电阻到3.3VDHT11数据线接PA14.7K上拉电阻到3.3V共地连接所有器件进阶版增加OLED显示// OLED引脚配置I2C模式 #define OLED_SDA_PIN GPIO_PIN_6 #define OLED_SCL_PIN GPIO_PIN_7 #define OLED_I2C_PORT GPIOB常见问题排查表现象可能原因解决方案传感器无响应接线错误/接触不良检查杜邦线连接数据波动大电源干扰增加0.1uF去耦电容测量值明显偏差传感器位置不当远离MCU等发热元件2. 开发环境搭建2.1 STM32CubeMX配置要点创建新工程时关键设置选择STM32F103C8Tx系列开启USART1异步模式115200波特率配置PA0、PA1为GPIO_Output启用I2C1若使用OLED时钟树配置建议// 72MHz主频配置 SYSCLK HCLK PCLK2 72MHz PCLK1 36MHz2.2 工程文件结构规划推荐采用模块化设计├── Core │ ├── Inc │ └── Src ├── Drivers ├── Modules │ ├── ds18b20.c │ ├── dht11.c │ └── oled.c └── STM32CubeIDE3. 传感器驱动开发3.1 DS18B20精准测温实现单总线通信时序是关键这里给出优化后的驱动代码// 复位脉冲480us低电平 void DS18B20_Reset(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin DS18B20_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(DS18B20_PORT, GPIO_InitStruct); HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET); delay_us(480); HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET); delay_us(60); GPIO_InitStruct.Mode GPIO_MODE_INPUT; HAL_GPIO_Init(DS18B20_PORT, GPIO_InitStruct); }温度转换流程发送0xCC跳过ROM发送0x44开始转换等待750ms读取暂存器数据3.2 DHT11温湿度数据采集不同于DS18B20DHT11需要严格遵循时序uint8_t DHT11_Read_Byte(void) { uint8_t data 0; for(int i0; i8; i) { while(!HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待高电平 delay_us(30); if(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)) { data | (1 (7-i)); while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待低电平 } } return data; }数据校验机制if((humi_h humi_l temp_h temp_l) checksum) { // 数据有效 }4. 数据融合与显示优化4.1 多传感器数据融合策略针对DHT11温度精度不足的问题可以采用DS18B20温度数据优先DHT11湿度数据温度作为参考加权平均算法需校准float final_temp ds18b20_temp * 0.8 dht11_temp * 0.2;4.2 显示方案选择串口输出方案printf(Temp: %.1fC Humi: %d%%\r\n, temperature, humidity);OLED显示进阶方案void OLED_ShowData(float temp, uint8_t humi) { OLED_ShowString(0, 0, Temp:, 16); OLED_ShowNum(40, 0, (int)temp, 2, 16); OLED_ShowString(72, 0, ., 16); OLED_ShowNum(80, 0, (int)(temp*10)%10, 1, 16); OLED_ShowString(96, 0, C, 16); OLED_ShowString(0, 2, Humi:, 16); OLED_ShowNum(40, 2, humi, 2, 16); OLED_ShowString(64, 2, %, 16); }4.3 低功耗优化技巧间隔采样非连续测量传感器供电控制STM32睡眠模式配置// 进入停止模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后需要重新初始化时钟 SystemClock_Config();5. 项目进阶与扩展5.1 外壳设计与安装推荐使用3D打印外壳设计要点预留传感器通风孔考虑OLED显示窗口加入挂墙安装孔5.2 数据记录与分析添加SD卡模块实现数据记录// 文件写入示例 fprintf(file, %d,%.1f,%d\r\n, timestamp, temperature, humidity);5.3 无线传输方案可选扩展方案对比方案传输距离功耗成本适用场景ESP8266100m中等15元室内IoTNRF24L0150m低10元点对点传输LoRa1km超低50元远距离监测实际测试中发现DHT11在长期运行后容易出现湿度漂移建议每三个月进行人工校准。而DS18B20的稳定性令人惊喜连续工作半年后温差仍保持在±0.3℃以内。