项目说明文档
一、项目简介
该项目是基于树莓派RP2040的嵌入式学习板、使用microPython进行编程的实现图形化显示以及超温报警的温度计。
二、硬件介绍
此项目完全基于树莓派RP2040,未接外设。具体使用到的为:板载的RP2040MCU、轻触按键A、摇杆、IPS-LED屏幕、蜂鸣器。使用ADC读取摇杆值和内部温度传感器温度,使用PWM驱动蜂鸣器发声,使用SPI驱动显示屏,使用GPI0读取按键A的信息。
三、设计思路
总的来说,此项目需要实现静态外观和动态刷新两个方面内容。
静态外观:温度计外壳及刻度,文字(当前温度、高温阈值)。
文字可用st7789中库函数显示,温度计的外壳也可用st7789库函数来完成,但需在库函数中加入一个画圆函数
动态刷新:滑块、温度、高温报警阈值、实时温度计图像
温度的读取用ADC,剩余三者利用循环实现
四、实现的功能及图片展示
1.开场
文字说明和硬禾logo
2.温度计界面
显示实时温度并可调节高温预警阈值,当温度超过高温阈值时蜂鸣器报警。
五、遇到的困难
1.刚开始入手时,会觉得手足无措,不知从何下手,我尝试了很多办法,但最终还是从头开始学Python语法奏效了。不基本了解Python语法,根本看不懂库函数,也写不出正确的代码。买了一本书,认真学完以后才开始着手做项目。
2.用库函数画温度计外壳是一项麻烦的工作,需要调整合适的位置,对接好直线和曲线。这是进过不断地尝试和调试得来的。
3.做实时温度读取和滑杆位置读取时一开始不知道怎么弄,后来查阅了电子森林板卡结构图,还翻阅的交流群的聊天记录,就知道怎么做了。
六、未来计划
经过这个寒假的玩耍与学习,我对这方面有了较高的兴趣,未来我想再玩玩板卡之类的东西。还有Python,我想更深入的学习,作为自己的一项熟练技能。
display.fill(st7789.WHITE)
body_Lx=110
body_Rx=135
body_y=24
body_Len=170
display.vline(body_Lx,body_y,line_len+10,st7789.BLACK)
display.vline(body_Rx,body_y,line_len+10,st7789.BLACK)
display.fill_circle(123,209,25,st7789.BLACK)
display.fill_circle(123,209,24,st7789.WHITE)
display.fill_rect(112,180,22,20,st7789.WHITE)
display.fill_circle(int((body_Lx+body_Rx)/2)+1, body_y-1, int((body_Rx-body_Lx)/2)+1, st7789.BLACK)
display.fill_circle(int((body_Lx+body_Rx)/2)+1, body_y-1, int((body_Rx-body_Lx)/2), st7789.WHITE)
display.fill_rect(112, 17, 22, 20, st7789.WHITE)
k=0
for i in[185,164,144,124,104,84,64,44]:
num=k*10
display.text(font1,str(num),body_Rx+22,i-4,st7789.BLACK,st7789.WHITE)
display.hline(body_Rx,i,20,st7789.BLACK)
display.hline(body_Rx,i-5,10,st7789.BLACK)
display.hline(body_Rx,i-9,10,st7789.BLACK)
display.hline(body_Rx,i-13,10,st7789.BLACK)
display.hline(body_Rx,i-17,10,st7789.BLACK)
k+=1
display.hline(body_Rx,23,20,st7789.BLACK)
display.text(font1,str(num+10),body_Rx+22,19,st7789.BLACK,st7789.WHITE)
显示温度、阈值信息
display.text(font1,'Temp:',3,80,st7789.BLACK,st7789.WHITE)
display.text(font1,'THER_H:',3,130,st7789.BLACK,st7789.WHITE)
display.text(font1,str(threshold_high),60,130,st7789.BLACK,st7789.WHITE)
显示滑动块:
display.vline(line_x,line_y,line_len,st7789.BLACK)
display.fill_rect(slider_x,slider_y,10,10,st7789.RED)
while True:
display.fill_circle( 123, 208, 20, ther_color)
temperature=round(27-(SensorTemp.read_u16()*offset-0.706)/0.001721,2)
print('temperature:{}'.format(temperature))
display.text(font1,str(temperature)+'℃',45,80,st7789.BLACK,st7789.WHITE)
if temperature>=threshold1:
ther_color=st7789.RED
Buzz.freq(1000)
Buzz.duty_u16(500)
elif temperature<=threshold1-1:
ther_color=st7789.GREEN
Buzz.deinit()
ther_y=int(185-temperature*2)
display.fill_rect(ther_x,30,17,ther_y-30,st7789.WHITE)
display.fill_rect(ther_x,ther_y,17,200-ther_y,ther_color)
if buttonA.value()==0:
utime.sleep(0.05)
while buttonA.value()==0:
threshold_high=int(40-(Joy_y.read_u16()-32768)/800)
print('threshold_high:{}'.format(threshold_high))
display.fill_rect(slider_x,slider_y,10,10,st7789.WHITE)
display.vline(line_x,line_y,160,st7789.BLACK)
slider_y=180-int(threshold_high*2)
display.fill_rect(slider_x,slider_y,10,10,st7789.RED)
display.text(font1,str(threshold_high)+' ',60,130,st7789.BLACK,st7789.WHITE)
else:
threshold1=threshold_high