电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
Pi+Python,打造自己的电子公告板
分 享
扫描二维码分享
Pi+Python,打造自己的电子公告板
树莓派
python3
屏幕
摸鱼之家
关注
发布时间: 2020-03-13
丨
阅读: 3046
# 前言 本次使用树莓派通过python驱动ST7735的TFT屏幕,也可简单的修改代码使其修改支持luma.lcd支持的屏幕 ## 硬件准备 1.[树莓派3B+一台](https://buy.icxbk.com/index.php?ctl=Product&met=lists&keywords=%E6%A0%91%E8%8E%93%E6%B4%BE "树莓派3B+一台") 2.1.44寸ST7735 TFT屏幕 3.32GTF卡(预先烧写Raspbian系统) 4.杜邦线若干 ### 屏幕连接 连接一定要断电!!! 树莓派GPIO如下图: ![](https://cf03.ickimg.com/bbsimages/202003/b9fd2f9835a952901abaaa1be4393a0b.jpg) 将屏幕的 SCLK 接树莓派的 23 号引脚,将屏幕的 SDA接到树莓派的 19 号引脚,将屏幕的 RST 接到树莓派的 22 号引脚,将屏幕的 RST接到树莓派的 18 号引脚,将屏幕的 CS 接到树莓派的 24 号引脚。最后,将屏幕的 LED 接 3.3V 或者 5V 电源口 接上后如图所示: ![](https://cf03.ickimg.com/bbsimages/202003/4247152936cab13ababce36904d090a8.jpg) ![](https://cf03.ickimg.com/bbsimages/202003/5acf7274e616693a985a004e85b0529b.jpg) 根据色彩颜色可自行比对怎么接的 ## 软件准备 ### 安装python相关拓展 ```shell #执行命令 sudo apt install python3-pip -y sudo apt install python3-dev -y ``` 如果你的树莓派系统不带jpeg的lib 执行如下命令安装 ```shell sudo apt install libjpeg7 ``` 当两个拓展与lib安装完成后,执行如下命令安装python的luma.lcd包 ```shell sudo pip3 install pillow #python的绘图库 sudo pip3 install luma.lcd # 和硬件相关的问题 ``` 此步容易因为网络问题导致安装不上,可以百度一下更换一下pip源头,我的网络还可以就没有换源 ### 开启GPIO中的SPI功能 SPI是一种通讯标准,树莓派使用GPIO来实现SPI ```shell sudo raspi-conf ``` 在interface options中选择spi,之后选择ENABLE即可 ![](https://cf03.ickimg.com/bbsimages/202003/9d63b36ce95f5a4a72321a3b3b252cf9.png) 开启之后,执行如下命令 ``` ls /dev/spi* ``` 若有输出内容如`/dev/spidev0.0 /dev/spidev0.1` 则证明SPI开启成功 # 知识预备 ## 关于pillow(官方文档:https://pillow.readthedocs.io/en/stable/) pillow是一个被广泛使用的绘图库,我们本次要制作dashboard,那就要用到绘图相关的内容。个人理解的所谓绘图,就是贴贴纸,我们每次调用pillow的绘图接口,就是在指定位置上画出一个新的内容,这个新的内容是浮在老的内容之上的,也就是把新的内容“贴”在老内容之上。比如,我们花了一个半径为8的红圆,再画一个半径为16的蓝圆,那么我们就只能看到半径为16的蓝圆,但是如果我们颠倒次序,我们就能看见蓝圆里面套了红圆。接下来我们介绍几个需要用到的绘图接口。 ### Image对象 通过Image.new()方法新建一个Image对象,image对象其实就是我们的“画布“,我们接下调用的所有接口都要把Image对象作为参数. ```python # 在Image对象上画一个十字 from PIL import Image, ImageDraw im = Image.open("test.jpg") draw = ImageDraw.Draw(im) draw.line((0, 0) + im.size, fill=128) draw.line((0, im.size[1], im.size[0], 0), fill=128) im.save(sys.stdout, "PNG") ``` ### ImageDraw imageDraw这个模块包含了许多绘图的方法,如画圆,画矩形,写文字等等 关于具体的使用查阅文档即可 我们对于pillow,基本只需要这两个模组 ## 关于坐标系 关于画图时使用的坐标,做如下说明 ![](https://cf03.ickimg.com/bbsimages/202003/c96a346c799e3aba79d1d28eacd7c1a2.png) 其中0点是屏幕的左上角,这个坐标系可能比较奇怪 # 代码实战 ## Helloworld代码 创建screen.py文件,其中写入如下内容 ```python #导入模组 from luma.core.interface.serial import spi from luma.lcd.device import st7735 from PIL import Image, ImageDraw, ImageFont #初始化代码,直接复制即可 serial = spi(port=0, device=0) device = st7735(serial, width=128, height=128, rotate=2, h_offset=1, v_offset=2, bgr=True) buffer = Image.new(device.mode, device.size)#新建一张画布,直接复制即可 draw = ImageDraw.Draw(buffer)#生成画图需要的对象,指定在buffer这个画布上画画 while True: draw.rectangle(device.bounding_box, outline=None, fill=(152, 152, 3))#画一个矩形(指定两个对角上的角点的坐标) #其中device.bounding_box其实是[0,0,128,128]这样一个集合 draw.text((30, 50), "hello world!", "white") #从坐标30,50处开始书写文字,最后指定颜色(颜色也可使用(int,int,int) 的RGB色号构成的元组来指定) device.display(buffer)#通过deviceplay来展示buffer上的内容 ``` 本段代码最核心的地方在while true中,这段代码的意思就是: 先贴上白色的矩形,再贴上文字,不断重复这个过程.如果顺序错误,那么立即推啥都显示不出来,因为画的文字一直被白色图给贴在下面了 使用python3运行后,效果如下: ![](https://cf03.ickimg.com/bbsimages/202003/62a39f062993a0662ccd9bd337622872.jpg) 若文字显示方向不正确,可以通过修改 device = st7735(serial, width=128, height=128, rotate=2, h_offset=1, v_offset=2, bgr=True)中的 rotate为0123来旋转画面 ## 制作CPU与IO信息显示 代码如下 ```python #一些初始化语句,直接复制 from luma.core.interface.serial import spi from luma.lcd.device import st7735 from PIL import Image, ImageDraw, ImageFont import time,psutil,uptime def ioPic(rs,ws): # 10 30 50 70 rs=round(rs/1024/1024,1) # cpnvert to MB/s ws=round(ws/1024/1024,1) # convert to MB/s draw.text((15,100),"R","black",io_font) draw.text((40,100),"W","black",io_font) draw.rectangle([10,103,25,10],(100,100,100)) draw.rectangle([35,103,50,10],(100,100,100)) draw.rectangle([10,103,25,int(103-rs)],orange_color) draw.rectangle([35,103,50,int(103-ws)],orange_color) draw.text((10,int(103-rs-20)),str(rs),"black") draw.text((35,int(103-ws-20)),str(ws),"black") serial = spi(port=0, device=0) device = st7735(serial, width=128, height=128, rotate=3, h_offset=1, v_offset=2, bgr=True) buffer = Image.new(device.mode, device.size) draw = ImageDraw.Draw(buffer) #引入字体 font=ImageFont.truetype("font.ttf" ,32) standard_font=ImageFont.truetype("astro.ttf",10) io_font=ImageFont.truetype("font.ttf" ,20) #设定两种常用的的颜色 black_color=(68,68,68) orange_color=(249,12,23) while True: current_time=time.time()#获取当前时间 uptime_days=int(uptime.uptime()/(24*60*60)) uptime_hours=int((uptime.uptime()%(24*60*60))/3600) #视图1:CPU负载 while (time.time()-current_time)<=30.0: #加入循环执行超过30s则切换 cpu_info=psutil.cpu_percent()#读取cpu负载 draw.rectangle(device.bounding_box, outline=None, fill=(255, 255, 255)) draw.arc([21,21,107,107],0,360,black_color,2) draw.arc([11,11,117,117],0,360,black_color,2) draw.arc([12,12,116,116],-90,(cpu_info/100)*360-90,(249,122,23),8)#动态绘制圆弧图案 draw.text((40, 35), str(cpu_info)+"%", (0,0,0),font) draw.text((40,65),"Load",(0,0,0),standard_font) draw.text((40,80),"ut:","black",standard_font) #绘制文字 draw.text((70,80),""+str(uptime_days)+"d"+str(uptime_hours)+"h",black_color) device.display(buffer)#显示画布内容 time.sl<ickey>eep(0.5) current_time=time.time() rs=0 ws=0 #视图2:io负载,每10s更换图形 while (time.time()-current_time)<=10.0: current_time_inner=time.time() read_bytes = psutil.disk_io_counters(perdisk=True)['mmcblk0p2'][2] write_bytes = psutil.disk_io_counters(perdisk=True)['mmcblk0p2'][3] #绘制出图形 time.sl<ickey>eep(0.1) print("not dead") rs=(psutil.disk_io_counters(perdisk=True)['mmcblk0p2'][2]-read_bytes)/(time.time()-current_time_inner) # read speed bytes ws=(psutil.disk_io_counters(perdisk=True)['mmcblk0p2'][3]-write_bytes)/(time.time()-current_time_inner) # write speed bytes draw.rectangle(device.bounding_box, outline=None, fill=(255, 255, 255)) ioPic(rs, ws) device.display(buffer) ``` 效果如下: ![](https://cf03.ickimg.com/bbsimages/202003/ff3cc18d94a569bedc4dc400b7e31b8f.jpg) 实现出来的可动的,因为视频不方便,所以只放了图片 # Tips 1.如果要长时间运行python,使用`nohup python3 xxx.py &`即可,可以长时间挂在后台运行,终端退出了也没事。 2。如果确定程序代码没问题但是没有图案,可能是GPIO忙,多启动几次试试就正常了
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
摸鱼之家
擅长:消费电子
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交