回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

Beetle 树莓派RP2350内置温度传感器测量温度曲线OLED显示 简单

头像 卓尔 2025.05.17 18 0

本项目基于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,提供简洁直观的代码编辑和上传功能,支持串口调试,极大提升开发便捷性及调试效率。
  • f9d96d8fe682ccd04a288f681b405b8.jpg

完整代码

代码
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上波形上升

评论

user-avatar