基于树莓派rp2040实现制作一个图形化显示、超温报警的温度计
本次项目是使用硬禾学堂的树莓派rp2040完成了寒假一起练,制作了一个可以动态可视化调节温度的一个温度计
标签
MicroPython
2022寒假在家练
树莓派RP2040
可设置阈值温度计
会把你变丑的黑魔仙
更新2022-03-02
西安邮电大学
1230

任务要求

  1. 在LCD屏上显示一个图形化的温度计,并实时显示当前的温度(通过RP2040内部的温度传感器测量)
  2. 可以通过摇杆或按键设定报警温度阈值(如上图下面的部分,需要补充上数字)
  3. 可以对芯片稍微加温,使温度超过设定的阈值,温度图示颜色变红,且蜂鸣器发出报警声音
  4. 给芯片降温到阈值一下,温度传感器颜色变绿,蜂鸣器停止报警

一:环境配置

   1、thonny:

         作为官方推荐的开发软件,thonny页面简洁,基础功能齐全,简单易上手)。安装的教程网上比较多,这里推荐我以前入门时候的一个视频https://www.bilibili.com/video/BV1Vy4y1x7S8?share_source=copy_web

   2、硬禾学堂树莓派rp2040平台:

         硬禾学堂为“寒假在家一起练”制作了一个平台,这平台正是我视频中演示用到的板子他的原理图如下,具体可以参考https://www.eetree.cn/project/detail/649

Fvope42ifdLeBYibaNCkKf30HIUIFp1bTbIAik7PBoPWsrM8aZCYRxun

二:程序实现:

程序均使用micropython编写,我是第一次使用micropython来做项目之前都是学习了但是没有实战过,所以代码可能写的不是那么的到位

1.主要代码的实现以及重要的库代码的讲解

1、显示屏的使用:

首先需要下载st7789的库,我这里使用的老的库函数,因为里面的代码的注释比较的多,方便下手完成项目,代码文件可以在附件里面下载到。

先在pico里面新建一个文件夹,命名为fonts,将vga1_16*32.py和vga2_8*8分别包含进去。16*32和8*8是指字体大小,比如8*8的字体,一个字符长8个像素,宽8个像素。包含完字库后,再包含st7789.py进pico中,他和fonts并列存放

Fo2gMUA5WU7Sh5SDks_4rXEZkBWJ

使用方式如下:

      初始化配置(这里使用的是硬禾学堂的开发板,所以对于其它的开发板对应的引脚麻烦自行查阅原理图)

import uos
import machine
import st7789 as st7789
from fonts import vga2_8x8 as font1
from fonts import vga1_16x32 as font2
import random
import framebuf

image_file0 = "/lib/logo.bin" #图片文件地址

st7789_res = 0#定义res引脚
st7789_dc  = 1#定义dc引脚
disp_width = 240#设置显示屏的宽度
disp_height = 240#设置显示屏的高度
CENTER_Y = int(disp_width/2)#定义Y轴的中位点
CENTER_X = int(disp_height/2)#定义X轴的中位点

print(uos.uname())#返回包含有关底层机器和/或其操作系统的信息的元组

spi_sck=machine.Pin(2)#定义SPI的SCK引脚
spi_tx=machine.Pin(3)#定义SPI的MOSI引脚
spi0=machine.SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)#初始化spi0
print(spi0)#输出实际的SPI速率可能会低于波特率输出实际的SPI速率可能会低于设置的波特率

display = st7789.ST7789(spi0, disp_width, disp_width,
                          reset=machine.Pin(st7789_res, machine.Pin.OUT),
                          dc=machine.Pin(st7789_dc, machine.Pin.OUT),
                          xstart=0, ystart=0, rotation=0)#初始化我们的显示屏幕,包含了起始坐标的位置、屏幕显示的方向

display.fill(st7789.BLACK)

      屏幕填充

display.fill(st7789.BLACK)
"""
定义:fill(self, color):
参数:
	color:颜色,具体可以查看st7789.py文件,就在文件的开头,这里举几个		例子:BLACK,BLUE,RED。。。
注意:
	很多时候我都用它来刷屏,比如更改设置的时候,要改太多。但是可能会出现屏幕闪烁的问题,有利有弊
"""

      画点

pixel(100, 100, st7789.RED)
"""
定义:pixel(self, x, y, color):
参数:
	x:横坐标
	y:纵坐标
	color:点的颜色
注意:
	
"""

      画线

display.line(0, 0, 100, 100, st7789.RED)
"""
定义:line(self, x0, y0, x1, y1, color):
参数:
	x0:起点横坐标
	y0:起点纵坐标
	x1:终点横坐标
	y1:终点纵坐标
	color:线的颜色
注意:
	这个函数默认画点是连续的,不会跨着像素点画,这样画的线效果好,但是不可避免的有画的慢的问题,特是在
    micropython这样运行速度慢的程序里表现的非常明显。
"""

      写字

oled.text(font1, "VPP:", 120, 120)
"""
定义:text(self, font, text, x0, y0, color=WHITE, background=BLACK):
参数:
    font:使用的字体
    text:需要打印的字符串
    x0:起点的横坐标
    y0:起点的纵坐标
    color:字体颜色,默认白色
    BLACK:背景颜色,默认黑色
注意:
	无。
"""

2、machine库

下面介绍的是项目中使用到的外设,由于比较基础,这里就只把他们的使用代码示例贴出来

      ADC

#摇杆的初始化
Joy_x = machine.ADC(29)
Joy_y = machine.ADC(28)
Joy_x.read_u16()#读取ADC的值,返回16位数,对应的是摇杆现在的位置的坐标

 

按键

#A,B两个按键的初始化
button_B = machine.Pin(5,machine.Pin.IN,machine.Pin.PULL_UP)
button_A = machine.Pin(6,machine.Pin.IN,machine.Pin.PULL_UP)
#判断按键是否按下来调整我们的温度的阈值
if button_A.value() == 0 :
    utime.sleep(0.05)#按键延时确保长按触发阈值温度调节的功能
    while button_A.value() == 0:

pwm

buz = machine.PWM(machine.Pin(23))#初始化蜂鸣器
#在温度超过阈值的时候蜂鸣器的行为
buz.freq(1000)#设置蜂鸣器的音调
buz.duty_u16(520)#设置蜂鸣器的音量值越高声音越大

 

 

3、这里是温度的读取显示的部分

read = sensor_temp.read_u16() * conversion_factor
temp = 27 - (read - 0.706) / 0.001721
display.text(font1, "{:.2f}".format(temp), 64, 80)#屏幕输出温度
display.text(font1, "{:.2f}".format(thre), 64, 110)#屏幕输出阈值

4.这里是温度在图像上面显示的部分

display.fill_circle(120, 207, 25, color)#圆心的坐标(120,207)
if temp < temp0 :
    display.fill_rect(106, 179-round(temp0), 29, round(temp0-temp), st7789.WHITE)
display.fill_rect(106, 181-round(temp), 29, 5+round(temp), color)

5.这里是温度超过阈值之后触发的情形

if temp>thre :
    color = st7789.RED
    buz.freq(1000)#设置蜂鸣器的音调
    buz.duty_u16(520)#设置蜂鸣器的音量值越高声音越大
else :
    color = st7789.GREEN
    buz.duty_u16(0)

6.这里是滑块的调节设置阈值,滑块大小设置为9*9

if button_A.value() == 0 :
    utime.sleep(0.05)#按键延时确保长按触发阈值温度调节的功能
    while button_A.value() == 0:
        thre_temp = round( 60+(Joy_x.read_u16()-32768)/546)
        print (thre_temp)
        display.fill_rect(slider_x,slider_y,9,9,st7789.WHITE)
        display.hline(slider_x,slider_y+4,9,st7789.BLACK)
        slider_x=56+thre_temp
        display.fill_rect(slider_x,slider_y,9,9,st7789.RED)
        display.text(font1, "{:.2f}".format(thre_temp), 64, 110)
    thre=thre_temp

7.这里是我们屏幕得以显示动画的原因

if temp < temp0 :
    display.fill_rect(106, 179-round(temp0), 29, round(temp0-temp), st7789.WHITE)

 

2、整体实现

      这一部分我将用注释的方式来介绍代码的实现。

FgHaLqCwYX7UngCGLA4-4gYabnzL

import uos
import machine
import st7789 as st7789
from fonts import vga2_8x8 as font1
from fonts import vga1_16x32 as font2
import random
import framebuf
import utime
import math

image_file0 = "/温度计.bin" #图片文件地址
image_file1 = "/logo.bin" 

st7789_res = 0#定义res引脚
st7789_dc  = 1#定义dc引脚
disp_width = 240#设置显示屏的宽度
disp_height = 240#设置显示屏的高度
CENTER_Y = int(disp_width/2)#定义Y轴的中位点
CENTER_X = int(disp_height/2)#定义X轴的中位点
color = st7789.GREEN
thre = 60 #阈值报警温度默认为60°也就是滑块中间的位置
slider_x = 116
slider_y = 7
buz = machine.PWM(machine.Pin(23))
temp0 = -1

#print(uos.uname())#返回包含有关底层机器和/或其操作系统的信息的元组

spi_sck=machine.Pin(2)#定义SPI的SCK引脚
spi_tx=machine.Pin(3)#定义SPI的MOSI引脚
spi0=machine.SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)#初始化spi0
print(spi0)#输出实际的SPI速率可能会低于波特率输出实际的SPI速率可能会低于设置的波特率

display = st7789.ST7789(spi0, disp_width, disp_width,
                          reset=machine.Pin(st7789_res, machine.Pin.OUT),
                          dc=machine.Pin(st7789_dc, machine.Pin.OUT),
                          xstart=0, ystart=0, rotation=0)#初始化我们的显示屏幕,包含了起始坐标的位置、屏幕显示的方向

#按键和摇杆的初始化
Joy_x = machine.ADC(29)
Joy_y = machine.ADC(28)
button_B = machine.Pin(5,machine.Pin.IN,machine.Pin.PULL_UP)
button_A = machine.Pin(6,machine.Pin.IN,machine.Pin.PULL_UP)

#温度计的换算系数
sensor_temp = machine.ADC(4)
conversion_factor = 3.3/(65535)

#第一步显示我们本次活动的活动主办方
f_image = open(image_file1, 'rb')#以只读的形式打开官方logo的二进制文件
for column in range(1,240):
    buf=f_image.read(480)#一次读取一行的数据
    display.blit_buffer(buf, 1, column, 240, 1)
utime.sleep(0.5)
#*******打开我们的图片作为背景********
f_image = open(image_file0, 'rb')
for i in range(1,240):
    buf=f_image.read(480)
    display.blit_buffer(buf, 1, i, 240, 1)
display.text(font1, "Temp :", 15, 80)
display.text(font1, "Thre :", 15, 110)
m = 0
for i in range(13):
    display.text(font1, str(m), 145, 178-i*10)
    m=m+10

display.fill_rect(116, 7, 9, 9, st7789.RED)#初始化滑块位于条的中间
utime.sleep(0.5)
#**********温度计主体显示部分*********
while True:
    #这里是温度的读取显示的部分
    read = sensor_temp.read_u16() * conversion_factor
    temp = 27 - (read - 0.706) / 0.001721
    display.text(font1, "{:.2f}".format(temp), 64, 80)#屏幕输出温度
    display.text(font1, "{:.2f}".format(thre), 64, 110)#屏幕输出阈值
    #这里是温度在图像上面显示的部分
    display.fill_circle(120, 207, 25, color)#圆心的坐标(120,207)
    if temp < temp0 :
        display.fill_rect(106, 179-round(temp0), 29, round(temp0-temp), st7789.WHITE)
    display.fill_rect(106, 181-round(temp), 29, 5+round(temp), color)
    #这里是温度超过阈值之后触发的情形
    if temp>thre :
        color = st7789.RED
        buz.freq(1000)#设置蜂鸣器的音调
        buz.duty_u16(520)#设置蜂鸣器的音量值越高声音越大
    else :
        color = st7789.GREEN
        buz.duty_u16(0)
    
    #这里是滑块的设置,滑块大小设置为9*9
    if button_A.value() == 0 :
        utime.sleep(0.05)#按键延时确保长按触发阈值温度调节的功能
        while button_A.value() == 0:
            thre_temp = round( 60+(Joy_x.read_u16()-32768)/546)
            print (thre_temp)
            display.fill_rect(slider_x,slider_y,9,9,st7789.WHITE)
            display.hline(slider_x,slider_y+4,9,st7789.BLACK)
            slider_x=56+thre_temp
            display.fill_rect(slider_x,slider_y,9,9,st7789.RED)
            display.text(font1, "{:.2f}".format(thre_temp), 64, 110)
        thre=thre_temp
        
    utime.sleep(0.5)
    temp0 = temp
    






 

三:未来计划以及建议

因为我的专业不是电子这方面的,所以我喜欢micropython的原因有两点,一:python开发简单上手快 二:可以实现的功能丰富以及目前的开发势头比较足。我未来的计划在我的可与时间可以继续做一些小项目借助硬核学堂这一个平台,和这也个平台一起来成长。的v与欣赏收的同学我又一点点小小的建议就是大家可以在学习的过程中可以看一下micropython官网的文档,我的建议是看一遍自己心里有一个印象,然后再以后做项目的时候可以把这个当作一个工具书来进行使用,需要用到哪里就去使用哪里,用的多了自然也就学会了。

再最后希望大家可以在这一行业继续发光发热,硬禾学堂是一个平台,大家一起在这里进行学习,沟通进行交流,这个总比在宿舍里面一起打游戏过的更加的有价值。所以希望同学们可以珍惜时间,因为我们的未来都是前程似锦。

附件下载
新建文件夹.zip
团队介绍
团队成员
会把你变丑的黑魔仙
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号