用搭配带屏12指神探的传感器扩展板 实现项目恒温控制系统
该项目使用了树莓派Pico核心芯片RP2040、MicroPython语言、传感器扩展版,实现了PID算法控制的恒温控制系统的设计,它的主要功能为:用拨轮选择目标温度,用按键确认目标温度,使用PID算法控制加热电阻从而调节温度,并在LCD屏上显示目标温度,实时温度,并绘制温度变化曲线。
标签
RP2040
2024年寒假练
恒温控制系统
参加活动/培训
去暑去属
更新2024-04-18
北京理工大学
24

一.项目介绍

项目依托2024寒假在家一起练,实现搭配12指神探的传感器扩展版制作的恒温控制系统。通过电阻快速加热,尝试稳定温湿度,感受控制之美。

项目任务

  • 至少使用一种自控算法控制,如PID等
  • 可用按键或拨轮控制目标温度
  • 可在LCD屏上显示目标温度及实时温度S

系统功能

  • 控制目标温度:用户可通过拨轮调节目标温度,用按键确定目标温度值设定,系统通过控制加热电阻,使环境温度保持在设定值附近,实现恒温控制。
  • 温度显示:系统可在LCD屏上显示目标温度及实时温度
  • 温度变化曲线:系统可绘制温度变化曲线,帮助用户直观地观察温度变化趋势。


二.设计思路

image.png

整体思路:使用 SPI 通讯协议初始化 LCD 显示屏,显示目标温度和实际温度,并通过按键修改目标温度(增加或减少)。按键操作允许用户设置温度,并通过按下确认键来更新目标温度。系统周期性地更新温度读数、处理按键输入、根据当前的温度情况调整加热电阻的输出,以维持环境在目标温度附近,并更新温度曲线图;

加热电阻控制:通过 PWM 控制加热电阻的占空比,实现 PID 温度控制。根据实际测量温度与设定温度的差值调整加热电阻的输出,以达到目标温度。

曲线绘制:设定数组存储传感器测量实时温度值,程序根据数组中绘制曲线。生成刷新变量控制LCD的曲线刷新频率,需要刷新曲线时,在数组末尾增加数据,并删除数组头部的数据。


三.硬件介绍

主板采用树莓派Pico核心芯片RP2040,双Arm Cortex M0+内核,可以运行到133MHz,264KBSRAM,板卡上外扩2MBFlash,性能强大、高度灵活的可编程IO(PIO)可用于高速数字接口,拥有2个UART、2个SPI、2个I2C、16个PWM通道以及4路12位精度ADC,支持MicroPython、C、C++编程,拖拽UF2固件至U盘的方式烧录固件,方便快捷

带屏版的12指神探,它是在原板基础上,配备了一块240*240分辨率的LCD彩屏以及两个可程控按键和一个拨轮,丰富了人机交互功能,方便信息观察、界面切换等使用方式。此外还配备了白色外壳,精心设计的包装不仅使板卡日常使用时更加美观也便于板卡的站立以及使用安全。

扩展板搭载了几款常见传感器和功能模块,包括为初学者准备的麦克风、蜂鸣器、、红外收发、霍尔效应开关、加热电阻,为进阶操作准备的温湿度传感器、六轴传感器、接近/环境光/IR传感器、颜色传感器。其中温湿度传感器、六轴传感器、接近传感器、颜色传感器可拆卸为单个模块,通过杜邦线等连接线延伸其使用的空间范围。出厂默认传感器正面朝上使用。若需背面朝上使用,则自行焊接排母后按指示方向插入。

四.功能展示

1.刷新屏幕

image.png


2.设置目标温度

image.png

3.加热电阻工作,温度曲线不断更新绘制,最后温度稳定在目标温度左右

795e83691e74516ea5a3b61f1d859a0.jpg

五.基本代码

1.使用 MicroPython 的 ST7789 驱动程序,来源https://github.com/devbis/st7789py_mpy.

配置LCD

display = st7789.ST7789(spi0, 240, 240,
reset=machine.Pin(0, machine.Pin.OUT),
dc=machine.Pin(1, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)

display.fill(st7789.BLACK)
display.text(font1, "Target:", 0*8,10*0)
display.text(font1, "Actual:", 5*16,10*0)
display.text(font2, " 25 ", 0*16,10*1)
display.text(font2, "25 ", 5*16,10*1)


2.加热电阻控制函数,获取传感器温度值,并进行温度控制

def heat_res(hpwm, nsh, adj):
val = nsht30_get(nsh)
if(val[0]>60):
val[0] = 55
elif (val[0]<5):
val[0] = 11
    # 进行PID控制
if(val[0]<adj):
# 若当前温度小于设定温度,则根据温差配置PWM的占空比
num = int((adj-val[0])*45000)
if(num>65535):
num = 65535
hpwm.duty_u16(num)
else:
hpwm.duty_u16(0)
return round(val[0], 1), 0


3.生成刷新变量,控制LCD的曲线刷新频率,在存储温度值的数组增加数据,并删除数组头部数据已达到刷新效果,最后根据数组的中数据绘制曲线并通过绘制背景色的曲线抹除上一次的绘制。

    if(loop_i>=10):
flash_flag = 1
loop_i = 0
else:
loop_i = loop_i+1

if(flash_flag ==1):
flash_flag = 0

temp_Atem.append(round(Atem[0]))
temp_Atem.pop(0)
temp_Ttem.append(round(Ttem))
temp_Ttem.pop(0)

for i in range(1,arr_len-1):
display.fill_rect(3+(i)*spaced, 230-(temp_Atem[i-1]-offset)*5, cir_rds, cir_rds, st7789.BLACK)
display.fill_rect(3+(i)*spaced, 230-(temp_Atem[i]-offset)*5, cir_rds, cir_rds, st7789.WHITE)
display.line(3+(i)*spaced, 230-(temp_Atem[i-1]-offset)*5, 3+(i+1)*spaced, 230-(temp_Atem[i]-offset)*5, st7789.BLACK)
display.line(3+(i)*spaced, 230-(temp_Atem[i]-offset)*5, 3+(i+1)*spaced, 230-(temp_Atem[i+1]-offset)*5, st7789.WHITE)
i = arr_len-1
display.fill_rect(3+(i)*spaced, 230-(temp_Atem[i-1]-offset)*5, cir_rds, cir_rds, st7789.BLACK)
display.fill_rect(3+(i)*spaced, 230-(temp_Atem[i]-offset)*5, cir_rds, cir_rds, st7789.WHITE)

六.项目总结

本次项目加深了我对嵌入式开发的了解,让我体会到了嵌入式开发乐趣,受益匪浅。


附件下载
main.py
主函数
st7789.py
LCD驱动
fonts.zip
字体
团队介绍
BIT
团队成员
去暑去属
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号