本项目基于RP2350开发板,搭配分辨率为128×64的SSD1306 OLED屏幕,采用MicroPython语言实现了内部温度传感器数据采集,并将温度数值与实时滚动温度波形动态显示于OLED屏幕之上。通过I2C通信接口完成微控制器与显示模块的连接,实现了硬件采集与可视化展示的紧密结合。
硬件平台介绍:
- 核心控制器:RP2350微控制器,支持灵活的MicroPython开发环境,方便快速部署嵌入式应用。
- 显示屏模块:SSD1306 OLED显示屏,分辨率128×64,采用I2C接口通信,具有低功耗、高对比度的特点,适合嵌入式信息显示。
- 连接方式:利用I2C总线进行数据传输,SCL信号线接至GPIO5,SDA信号线接至GPIO4,频率设置为400kHz,确保数据传输的高速和稳定。
软件环境与工具:
- 编程语言:MicroPython,专为嵌入式开发设计,提供丰富的硬件接口支持。
- 使用库:
- machine模块:用于初始化和管理I2C总线及ADC接口,负责温度传感器数据采集及OLED驱动的硬件操作。
- ssd1306库:为SSD1306 OLED屏幕提供驱动支持,包含文本显示与图形绘制功能。
- 开发与调试工具:采用Thonny IDE,提供简洁直观的代码编辑和上传功能,支持串口调试,极大提升开发便捷性及调试效率。
完整代码:
代码
import machine
import time
from ssd1306 import SSD1306_I2C
# OLED配置
WIDTH = 128
HEIGHT = 64
i2c = machine.I2C(0, scl=machine.Pin(5), sda=machine.Pin(4), freq=400000)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
# ADC初始化,RP2040内部温度传感器在ADC4(GPIO29)
adc = machine.ADC(4)
# 波形配置
WAVE_WIDTH = WIDTH
WAVE_HEIGHT = 30 # 波形高度像素
WAVE_Y = HEIGHT - WAVE_HEIGHT # 波形起始y坐标
# 初始化波形数据缓冲区
wave_data = [0]*WAVE_WIDTH # 存储温度值映射到波形高度
def read_temperature():
raw = adc.read_u16() # 0~65535
voltage = raw * 3.3 / 65535
# RP2040内部温度传感器计算公式
temp_c = 27 - (voltage - 0.706)/0.001721
return temp_c
def draw_temperature(temp):
oled.fill_rect(0, 0, WIDTH, 16, 0) # 清除顶部区域
oled.text("Temp: {:.2f} C".format(temp), 0, 0)
def draw_waveform():
# 清除波形区域
oled.fill_rect(0, WAVE_Y, WIDTH, WAVE_HEIGHT, 0)
mid = WAVE_HEIGHT // 2
# 画中心线
oled.hline(0, WAVE_Y + mid, WIDTH, 1)
for x in range(WAVE_WIDTH-1):
y1 = WAVE_Y + mid - wave_data[x]
y2 = WAVE_Y + mid - wave_data[x+1]
oled.line(x, y1, x+1, y2, 1)
def update_wave_data(temp):
# 温度映射到波形高度,假设温度范围25~40度对应波形高度-15~+15像素
# 根据实际温度范围调整比例
min_temp = 25.0
max_temp = 40.0
span = max_temp - min_temp
val = int((temp - min_temp) / span * (WAVE_HEIGHT//2))
if val > WAVE_HEIGHT//2:
val = WAVE_HEIGHT//2
if val < -WAVE_HEIGHT//2:
val = -WAVE_HEIGHT//2
# 添加新值,波形向左滚动
wave_data.pop(0)
wave_data.append(val)
def main():
while True:
temp = read_temperature()
update_wave_data(temp)
draw_temperature(temp)
draw_waveform()
oled.show()
time.sleep(0.1)
if __name__ == "__main__":
main()
实际效果:
视频中可以看到,当开发板移动至电脑出风口的时候,温度升高,OLED上波形上升
评论