项目总结报告
一.项目简介
该项目是一个图形化显示、超温报警的温度计。该项目使用的硬件为基于树莓派RP2040的嵌入式系统学习平台,该项目的功能使用micropython编程实现。实现的功能有:
1.在LCD屏上显示一个图形化的温度计,并实时显示当前的温度。如下图一,左上角第二行实时显示测量出的温度,右侧的图形能够根据温度调整温度计中绿色柱状的高度实现图形化显示。(右侧红线代表阈值温度)
图1 图形化温度计
2.可以通过摇杆和按键设定报警温度阈值,按动按键A,可进入设置模式。如图二,左上角第五行由“measuring”变为“settling”,可通过滑动滑杆调节阈值温度(向上滑动,提高阈值温度,向下滑动,降低阈值温度),左上角第四行实时显示目前的阈值温度。设置完成后,再次按下按键A,将退出设置模式,继续测量温度。
图2 设置报警温度阈值
3.温度超过设定的阈值时,温度图示颜色变红,且蜂鸣器发出报警声音(如下图3)。芯片降温到阈值以下时,温度图示颜色变绿,蜂鸣器停止报警。
图3 温度超过报警阈值
二.设计思路
1.在LCD屏幕上显示图形化的温度计:先找到合适的温度计图片,转换成bin格式,在RP2040中打开该图片,并静态显示,将测量出的温度通过合适的转化公式转化成坐标的y值,并通过实时画绿色矩形和白色矩形的方式做出在温度上实时显示出温度的效果。
2.通过遥感和按键设置报警温度阈值:在主函数中,控制板监测按键A的状态,按下按键A后,即可进入设置模式,通过遥感的返回值判断遥感的位置,并且相应增大或减小阈值温度。
3.温度超过阈值时,温度图示颜色变红,且蜂鸣器发出报警声音:主函数中,程序每次运行都会比较温度和阈值温度,如果某一次测试出的温度高温阈值温度,程序将调用函数在温度计下方绘制红色的实心圆,并且将原先绘制绿色矩形的颜色参数改为红色,同时将蜂鸣器音量改为600。
4.温度下降到阈值以下时,温度图示颜色变绿,蜂鸣器停止报警:如果温度从高温下降到阈值以下,将在温度计下方绘制绿色的实心圆,并且将主程序中的颜色参数改为绿色,同时将蜂鸣器的音量改为0。
图4 设计程序流程图
以下为设计思路框图:
三.主要代码片段及说明
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
display.text(font1,str(temperature), 10, 30)
y=int(159-temperature*1.7)
print(temperature)
utime.sleep(0.5)
display.fill_rect(172,y,16,194-y,color)
if color==green:
display.fill_rect(172,int(159-threshold*1.7)+1,16,y-int(159-threshold*1.7),white)
else:
display.fill_rect(172,y-10,16,10,white)
if buttonA.value()==0:#进入设置模式
display.text(font1, "settling ", 10, 90)
while buttonA.value()==0:
1
for i in range(1,32):
display.pixel(163+i,int(159-threshold*1.7),white)
while buttonA.value()==1:
adc = control.read_u16()
duty = int(adc * (3000-0)/0xffff)+100
if(duty<200):
threshold+=1
if(duty>3000):
threshold-=1
display.text(font1, str(threshold), 10, 70)
utime.sleep(0.25)
print(threshold)
display.text(font1, "measuring", 10, 90)
while buttonA.value()==0:
1
for i in range(1,32):
display.pixel(163+i,int(159-threshold*1.7),red)
# 退出设置模式
if temperature>threshold:
pwm.duty_u16(600)
if indicate==0:
draw_circle(180,194,30,red)
indicate=1
color=red
if temperature<threshold:
if indicate==1:
display.fill_rect(172,y-10,16,10,white)
pwm.duty_u16(0)
draw_circle(180,194,30,green)
color=green
indicate=0
说明:先读取温度传感器的值并转换为摄氏度,再通过合适的公式(该转换公式由测试获得)计算为矩形最高处的纵坐标,绘制绿色(或红色)矩形,再以此处和阈值线绘制白色矩形,这样看上去可以实时利用图形显示温度。第二步判断是否按下按键A,如果没有按下,则直接进行下一步,若按下,进入设置模式,通过滑杆升高或降低阈值,设置完成后通过按键A退出设置模式。最后判断温度是否大于阈值温度,若温度超过阈值温度,则启动蜂鸣器,并改变图像颜色,若温度又下降到阈值温度以下,则可恢复正常模式。
四.遇到的主要困难及解决方法
1.遇到的困难:实现高温警报功能时,一开始在程序中添加比较温度和阈值温度的if语句,如果温度超过阈值温度,那么将执行蜂鸣器警报和绘制红色温度计的程序,然而,执行画图程序需要很长的时间,并且当温度小于阈值时也要画绿色的温度计,这样会浪费大量精力在绘图上。
解决方法:定义一个指示的变量indicate,可以通过改变这个量来显示上一次循环时测试的温度大于或小于阈值,由此决定是否需要执行if后面的内容,从而节省程序运行时间。
2.遇到的困难:程序需要按动按键A进入设置模式,退出设置模式时也需按动按键A,虽然通过“utime.sleep()”延时一段时间,但有时还是会出现没来得及松开按键A直接退出设置模式的情况。有时也会出现推出设置模式时,没来得及松开按键A,在下一次循环又进入设置模式的情况。
解决方法:添加语句“while buttonA.value()==0:”在进入设置模式后,会执行空循环,等待操作者松开按键A,再运行下面的读取滑杆返回值,进行改变阈值温度的程序。同样,退出设置模式时,程序也会等待操作者松开按键A,再运行下面的程序。
五.未来的计划和建议
1.在温度计所测温度从高于阈值温度的状况向低于阈值温度状况切换时,需要使用函数绘制一个实心圆,目前使用的方法为:给定原点坐标(x,y)以及半径radius计算所有横坐标在x-radius和x+radius之间,纵坐标在y-radius和y+radius之间所有点与原点的距离,小于半径的点染成需要的颜色,测试发现,绘制图形需要大量时间,严重影响程序运行的流畅度,后期计划优化算法,改进这一问题。
2.温度传感器测试的温度有一定的波动,在温度与阈值相近时,温度计会反复在两种状态切换,影响程序运行的流畅。后期计划多次测量求平均值作为最终的测量温度再与阈值温度比较。或者,温度到达阈值时,启动警报,直到温度能在将来的一段时间内都小于阈值才能停止警报。