一、项目介绍
基于RP2350B微控制器的OLED数字温度与电压表设计。系统集成DS18B20温度传感与电位器电压采集,通过OLED同屏显示数值与条形图,利用按键设置温度阈值并触发声光告警,辅以双位数码管指示工作状态。该设计实现了数据采集、图形化显示与交互控制的有机结合。
1.1 硬件介绍
本系统基于功能强大的RP2350B微控制器设计。RP2350B作为RP2040的升级版,拥有更多的GPIO引脚和更强的处理能力,为外设扩展提供了极大便利。本项目的硬件组成主要围绕一块集成了多种外设的扩展底板构建,具体包括:
- 主控核心:STEP-RP2350B核心板,利用其丰富的可编程IO(PIO)和ADC通道进行数据采集与控制。
- 感知单元:
- 温度采集:板载DS18B20数字温度传感器,通过单总线协议读取环境温度。
- 电压采集:板载电位计(电位器)连接至SPI接口的串行ADC,用于模拟电压信号的精确采集。
- 显示单元:
- 主显示屏:0.96寸 OLED(128x32),采用SPI协议驱动,用于同屏显示温度、电压数值及其对应的条形图。
- 状态显示屏:板载2个7段数码管,通过74HC595移位寄存器驱动,用于显示当前界面或工作模式代号。
- 警示与交互:
- 音频输出:三极管驱动的蜂鸣器,用于超限报警。
- 灯光指示:板载单色LED,用于告警状态的视觉指示。
- 用户输入:板载轻触按键,用于设置温度报警上限。

1.2 功能概览
本设备实现了对模拟量与数字量的综合采集与反馈,具体功能如下:
- 多源数据采集:实时读取电位器电压值及DS18B20环境温度值。
- 同屏图形化显示:在OLED上同时显示温度与电压的具体数值,并绘制对应的条形图(Bar Graph),直观展示模拟量比例。
- 交互式阈值设定:通过按键可自由设置温度告警的上限值。
- 分级声光告警:当环境温度超过设定上限时,触发蜂鸣器鸣响,同时点亮LED指示告警状态。
- 状态机指示:双位数码管实时显示当前的操作页面或工作模式(例如显示“1”代表电压/温度监测主界面,“2”代表阈值设置界面等)。
1.3 设计思路
本项目的设计遵循模块化与分层驱动的原则:
- 驱动层分离:首先为各外设编写底层驱动,包括DS18B20的单总线时序、SPI协议驱动OLED、通过74HC595间接驱动数码管以及ADC的轮询读取。
- 核心逻辑层:设计一个状态机来管理不同的工作模式。主循环中不断刷新传感器数据,并根据当前状态(正常显示/设置模式)决定数据的流向与显示内容。
- 人机交互优化:考虑到OLED屏幕较小,采用数值+条形图结合的方式,相比纯数字显示更直观。数码管用于辅助提示当前状态,避免用户在主屏幕操作时产生混淆。
- 告警机制:采用轮询比较法,在主循环中持续判断当前温度与设定的阈值关系,一旦触发立即驱动蜂鸣器和LED响应。

二、功能实现
系统软件流程围绕初始化、数据采集、显示刷新及告警判断展开。主循环采用非阻塞式设计,确保各任务实时响应。
2.1 软件流程图

2.2 实现过程
2.2.1 数据采集与处理
- 电压读取:通过底板上 SPI 接口的 ADC 芯片读取电位计电压。RP2350B 通过软件 SPI 或硬件 SPI 发送读取命令,获取数字量后换算为实际电压值(0-3.3V)。参考现有方案,通过对 raw 值进行计算:
voltage = (raw * 3.3) / 4095。 - 温度读取:采用单总线协议驱动 DS18B20。按照初始化 -> 跳过ROM -> 启动温度转换 -> 等待 -> 读取暂存器的时序进行数据读取。DS18B20 返回的数据为 16 位有符号数,需通过移位拼接并乘以分辨率 0.0625 得到实际温度值。
2.2.2 显示功能实现
- OLED 同屏显示:利用 adafruit_ssd1306 库或类似驱动库初始化 128x32 的 OLED。在屏幕上划分区域:上半部分显示文字(Temp: xx.x C 和 Vol: x.xx V),下半部分绘制条形图。条形图长度根据 ADC 值和温度值相对于量程的比例进行像素映射,调用绘图函数绘制实心矩形。
- 数码管动态扫描:通过两个 74HC595 级联控制双位数码管。利用动态扫描原理,设置极短的刷新周期(如 5ms)交替点亮两个数码管,利用视觉暂留效应实现稳定显示。
2.2.3 告警与交互逻辑
- 按键设置阈值:在循环中检测按键电平变化并做消抖处理。当按键按下时,系统进入阈值设置状态。此时 OLED 提示输入,数码管闪烁显示当前阈值。再次按下按键确认退出,阈值保存到变量中。
- 声光报警:定义 PWM 输出引脚驱动蜂鸣器,普通 GPIO 驱动 LED。当温度 > 阈值时,PWM 输出特定频率(如 2kHz)驱动蜂鸣器发声,同时 LED 置高电平点亮。
三、功能展示
在实物调试阶段,系统运行稳定,各项功能均达到设计要求:
上电初始化
OLED 默认显示温度模式界面,数码管显示当前温度值信息。

监测界面
旋转电位器时,OLED 上的电压数值实时变化,下方的电压条形图长度同步伸缩。用手触碰 DS18B20 传感器,温度数值升高,条形图随之增长,显示效果直观生动。

阈值设置
按下按键,数码管切换显示为“2”,OLED 提示当前阈值,进入设置模式。再次按下按键,蜂鸣器发出“嘀”一声确认,保存设置并返回主界面。

告警触发
将温度阈值调低至当前室温以下(或用手加热传感器使其超过阈值),红色 LED 立即点亮,蜂鸣器开始发出间断的蜂鸣声,实现了精确的告警功能。

四、总结
遇到的问题
- 电位器调整的电压采集不正确,一开始使用开源库来驱动ADS7868读取电压,要么读取的电压始终为0,要么就是读取的结果不正确。在参考了数据手册在 DeepSeek的帮助下才正确读取到了电压值,但实际值为12位的数据不知道是什么原因。
心得体会
本项目基于 RP2350B 成功实现了一款集测量、显示、报警于一体的嵌入式仪表。项目充分利用了 RP2350B 的增强型 IO 能力,通过 SPI 驱动 OLED、通过 74HC595 驱动数码管,并融合了 DS18B20 与 ADC 的数据采集。
最后感谢电子森林推出的 《寒假练》 系列活动,对于我来说是个很好的学习机会,理论结合实践。我们下期活动再见!