2024年寒假练 - 基于搭配带屏12指神探的传感器扩展板的恒温控制系统
该项目使用了RP2040板卡、MicroPython语言、PID算法,实现了恒温控制系统的设计,它的主要功能为:目标温度的设定,恒温环境的控制,当前环境温湿度的检测。
标签
嵌入式系统
开发板
2024寒假在家一起练
恒温控制系统
Motues
更新2024-03-29
华中科技大学
143

1. 项目背景及目标

随着现代科技的不断发展,恒温控制在各个领域都显得尤为重要,如实验室、医疗设施、食品储存等。恒温控制系统项目旨在设计并实现一个能够准确控制环境温度的系统,以满足不同场景下的恒温需求。项目的主要目标包括:

  • 设定目标温度,使环境温度能够快速稳定地达到预设值。
  • 检测当前环境的温湿度,为控制系统提供实时数据。
  • 实现恒温环境的控制,确保环境温度在预设范围内波动。

2. 系统功能

本项目基于搭配带屏12指神探的传感器扩展板完成,实现了恒温控制系统的制作具有广泛的运用。主要功能如下所示:

  • 目标温度设定:用户可通过系统界面设定目标温度值,系统根据设定值自动调节环境温度。
  • 恒温环境控制:系统通过控制加热电阻,使环境温度保持在设定值附近,实现恒温控制。
  • 当前环境温湿度检测:系统通过温湿度传感器实时检测当前环境的温湿度数据,并将数据展示在界面上。

3. 简单的硬件介绍

  • 本项目使用的系统板为带屏版的12指神探。主控芯片为树莓派Pico核心芯片RP2040,双Arm Cortex M0+内核,可以运行到133MHz,具有丰富的接口,灵活性强,可编程度高。本系统版除了配备了一块240*240分辨率的LCD彩屏,还包括两个可程控按键和一个拨轮,可用于界面开发和切换。
  • 传感器为12指神探的传感器扩展板,与带屏版的12指神探接口完全适配。本项目使用的为传感器拓展版上的温湿度传感器,型号为NSHT30,可用I2C进行通信。

4. 设计思路

  • 用户交互界面和交互控制系统:交互界面包括主界面和分界面。主界面有三个菜单选择,对应三个不同的功能,分别是Set(设定目标温度)、Modify(实现恒温环境的控制)和Check(检测当前环境的温湿度)。分界面为各个菜单之间的界面,Set界面显示当前设置的温度值,Modify界面显示恒温控制状态下的温湿度值,Check界面显示当前环境的温湿度值。交互控制控制系统使用了两个可程控按键和一个拨轮。两个按键分别为菜单进入与退出,拨轮用于菜单的选择和温度的设置。
  • 温湿度检测由NSHT30完成,与系统板之间的通信采用I2C通信协议,可以快速准确的获取当前传感器所测的温度值。
  • 恒温控制系统采用PID算法,可以实现较为稳定的温度控制。
  • 编程语言采用MicroPython,简单易于上手。

5. 实现的功能及图片展示

  • 用户主界面:长按左按钮可以进入当前指示界面,长按右按钮可以退出当前菜单界面,拨轮左右转动可以调节所选择的菜单。

  • Set(设定目标温度)界面:转动拨轮调节设定温度。

  • Modify(恒温环境的控制)界面:包括当前的温度与湿度,实时变化。

  • Check(当前环境的温湿度)界面:包括当前的温度与湿度,实时变化。

6. 主要片段代码及说明

  • 界面显示与切换

定义flag表示当前选择的为那个菜单,并显示对应的界面。flag=1表示Set,flag=2表示Modify,flag=3表示Check。

主界面代码

def index():
if flag==1:
display.text(font2, " > Set < ", 0, 50)
display.text(font2, " Modify ", 0, 110)
display.text(font2, " Check ", 0, 170)
elif flag==2:
display.text(font2, " Set ", 0, 50)
display.text(font2, " > Modify < ", 0, 110)
display.text(font2, " Check ", 0, 170)
else:
display.text(font2, " Set ", 0, 50)
display.text(font2, " Modify ", 0, 110)
display.text(font2, " > Check < ", 0, 170)

界面切换代码

while True:
index()
value_A = button_A.value()
value_Left=button_Left.value()
value_Right=button_Right.value()
if value_Left==0:
flag=flag-1
if flag==0:
flag=3
elif value_Right==0:
flag=flag+1
if flag==4:
flag=1
if value_A==0:
if flag==1:
set_temp()
PID_clean()
elif flag==2:
modify_temp()
else:
check_temp()
  • 温度获取

定义flag表示当前选择的为那个菜单,并显示对应的界面。flag=1表示Set,flag=2表示Modify,flag=3表示Check。

温度传感器NSHT30使用I2C进行通信。首先配置I2C通信协议,查看数据手册知道,sda接口为Pin(20),scl接口为Pin(21)。NSHT30的地址为0x44。首先在I2C总线上向NSHT30所在地址发送信号,开始测量温度,0x2400表示进行一次温度测量。NSHT30在接收到信号后进行温度测量,此时我们需要等待15ms让温度传感器完成温度测量。在NSHT30完成测量后,我们从NSHT30所在地址读取6为数据,里面包含了温度与湿度值。最后我们再进行数据转换即得到当前的温湿度值。

读取温度代码如下:

#温湿度传感器  
NSHT30_ADDR = 0x44 #NSHT30I2C地址
def read_temperature():
# 发送测量温度命令
CMD=bytearray([0x24,0x00])
I2C0.writeto(NSHT30_ADDR, CMD)
# 等待测量完成
sleep(0.015)
# 读取温度
data=I2C0.readfrom(NSHT30_ADDR,6)
# 转换为温度值
temp=-45+175*(((data[0]<<8)+data[1])/65535)
humidity=100*(((data[3]<<8)+data[4])/65535)
#保留两位小数
temp=round(temp,2)
humidity=round(humidity,2)
return temp,humidity
  • 恒温控制系统

恒温控制系统采用。PID算法中,比例环节(kp)根据误差的大小进行调整,误差越大,输出调整也越大,以快速减小误差。积分环节(ki)则考虑误差的累积,通过积分作用消除稳态误差,提高控制精度。微分环节(kd)则根据误差的变化率进行预测,提前调整控制输出,以减小未来误差。计算时,首先计算误差,再对积分项和微分项分别计算,最后计算PID输出,算出PWM占空比,注意需要进行一下进制转换。

这里的加热电阻采用PWM控制,通过调节占空比可以很好的控制加热电阻的功率,使加热与散热达到一个平衡。

通过实际调节PID参数最终可以可以达到0.5摄氏度的误差。

恒温控制代码如下:

#PID参数
kp=40.0
ki=0.65
kd=0.25
# PID变量
past_error=0.0
integral=0.0
sample_period=0.2
#检测温度
def modify_temp():
display.fill(st7789.BLACK)
global past_error,integral
while True:
temp,humidity=read_temperature()
value_B = button_B.value()
display.text(font2, "temp:"+str(temp)+" *C ", 10, 50)
display.text(font2, "Humi:"+str(humidity)+" % ", 10, 130)
#计算误差
error=settemp-temp
# 积分项
integral+=error*sample_period
# 微分项
derivative=(error-past_error)/sample_period
# 计算PID输出
output = kp*error+ki*integral+kd*derivative
# 限制输出范围(0100对应PWM0%100%
pwm_duty=max(0, min(100, output))
pwm_duty_u16=int(65535*pwm_duty*0.01)
heat.duty_u16(pwm_duty_u16)
#print(temp,error,pwm_duty_u16)
# 更新误差
past_error=error
# 延时
#sleep(sample_period)
if value_B==0:
display.fill(st7789.BLACK)
index()
heat.duty_u16(0)
break;

每次从新设置温度后要对PID参数重新设置,代码如下:

def PID_clean():
global past_error,integral
past_error=0.0
integral=0.0

6. 遇到的主要难题及解决方法

  • 在与温湿度传感器通信的时候传感器没有反应,后查阅资料了解到要把指令转化为bytearray数据类型才可,如下代码所示。
CMD=bytearray([0x24,0x00])
  • 温度控制算法在多次比较后选择了PID算法,结果更加稳定。
附件下载
main.py
核心代码
团队介绍
华中科技大学集成电路学院电子科学与技术
团队成员
杨国宇
华中科技大学集成电路学院电子科学与技术
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号