手把手教你用STM32F103C8T6和DS18B20做一个带OLED屏的智能温度计(附源码) 从零构建STM32智能温度监测系统硬件选型到代码实战在创客圈子里温度监测项目堪称嵌入式开发的Hello World但要想做出专业级的作品需要打通传感器协议、显示驱动和用户交互的全链路。本文将用STM32F103C8T6这款性价比之王作为主控搭配高精度DS18B20传感器和0.96寸OLED屏打造一个支持双温度单位切换、报警阈值设置的实用工具。不同于市面上简单的教程我们会深入单总线协议时序细节解析I2C显示优化技巧并分享按键消抖的实战经验。1. 硬件架构设计1.1 核心器件选型对比选择硬件时需要考虑精度、接口复杂度和成本因素。下表对比了常见温度传感器的关键参数型号测量范围精度接口类型供电电压特殊功能DS18B20-55~125℃±0.5℃单总线3.0-5.5V多点组网LM35-55~150℃±0.5℃模拟电压4-30V线性输出DHT110~50℃±2℃单总线3-5.5V集成湿度测量PT100-200~850℃±0.1℃电阻式无源工业级高精度为什么选择DS18B20其单总线接口节省IO资源且支持寄生供电模式在布线受限的场景下尤为实用。0.96寸OLEDSSD1306驱动则因其高对比度和低功耗特性成为小型显示设备的首选。1.2 电路连接示意图关键连接点需要特别注意DS18B20的DQ引脚需接4.7K上拉电阻OLED的I2C地址通常为0x3C或0x3DSTM32的GPIO模式配置// DS18B20引脚配置 GPIO_InitStruct.Pin GPIO_PIN_4; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_OD; // 开漏输出 GPIO_InitStruct.Pull GPIO_PULLUP; // I2C引脚配置 GPIO_InitStruct.Pin GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode GPIO_MODE_AF_OD; // 复用开漏2. 开发环境搭建2.1 工具链配置推荐使用STM32CubeIDEPlatformIO组合既可以利用STM32CubeMX的图形化配置优势又能享受PlatformIO的库管理便利安装STM32CubeMX并配置时钟树72MHz主频生成基础工程时勾选I2C1和USART1用于调试输出在PlatformIO中添加依赖库lib_deps adafruit/Adafruit SSD1306^2.5.7 milesburton/DallasTemperature^3.9.12.2 单总线协议驱动开发DS18B20的通信时序要求严格下面是关键操作的核心代码// 复位脉冲发送 void DS18B20_Reset(void) { SET_DQ_OUT(); DQ_LOW(); delay_us(480); // 保持480us低电平 SET_DQ_IN(); delay_us(60); // 等待从机响应 if(!(GPIOB-IDR GPIO_PIN_4)) { delay_us(420); // 等待复位完成 } } // 写入一个bit void DS18B20_WriteBit(uint8_t bit) { DQ_LOW(); delay_us(2); // 保持至少1us if(bit) SET_DQ_IN(); // 写1时释放总线 delay_us(60); // 保持整个时隙周期 SET_DQ_IN(); // 恢复高电平 }注意所有延时函数必须使用硬件定时器实现SysTick定时器是理想选择避免因中断导致的时序错乱。3. 用户界面设计3.1 OLED显示优化技巧SSD1306驱动的OLED虽然小巧但通过以下技巧可以提升显示效果双缓冲机制减少屏幕闪烁void OLED_Refresh() { HAL_I2C_Mem_Write(hi2c1, OLED_ADDR, 0x40, I2C_MEMADD_SIZE_8BIT, buffer, sizeof(buffer), 100); }自定义字体使用PCtoLCD2003工具生成点阵字模动态刷新策略温度值变化时才更新显示区域3.2 交互逻辑实现通过旋转编码器替代普通按键可实现更精细的参数调整// 编码器中断处理 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { static uint8_t last_state; uint8_t new_state READ_ENCODER(); if((last_state 0x03) (new_state 0x01)) { temp_setpoint 0.5; // 顺时针旋转 } else if((last_state 0x03) (new_state 0x02)) { temp_setpoint - 0.5; // 逆时针旋转 } last_state new_state; }4. 系统集成与调试4.1 报警功能实现温度超限时触发声光报警同时记录事件到EEPROMvoid check_alarm(float temp) { static uint32_t last_beep 0; if(temp high_threshold) { BUZZER_ON(); if(HAL_GetTick() - last_beep 500) { BUZZER_TOGGLE(); // 产生间歇蜂鸣 last_beep HAL_GetTick(); } LED_RED_ON(); } else { BUZZER_OFF(); LED_RED_OFF(); } }4.2 功耗优化策略通过STM32的低功耗模式可大幅延长电池供电时间配置RTC唤醒中断HAL_RTCEx_SetWakeUpTimer_IT(hrtc, 2047, RTC_WAKEUPCLOCK_RTCCLK_DIV16); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);传感器采样间隔设置为10秒显示超时自动关闭背光在项目调试阶段建议先用USB供电通过ST-Link的SWD接口实时查看变量值。当发现温度读数异常时用逻辑分析仪捕捉单总线时序波形检查高低电平持续时间是否符合DS18B20的规格要求。OLED显示乱码往往是I2C速率设置不当导致可尝试降低时钟频率到100kHz。