上篇文章我们介绍了【ESP32_Py_Board】开发环境搭建及基本板载外设的使用,文末介绍了显示屏的测试方法,仅仅实现了颜色填充,这篇文章我们就来介绍下如何使用显示屏显示图片和文字,最后在显示屏上显示出B站某个UP主的粉丝数,练习一下显示屏的使用!
如果有小伙伴还不太熟悉ESP32的MicroPython开发环境搭建,可以翻看下上一篇文章:
ESP32开发板MicroPython开发环境搭建,驱动示例代码
显示屏驱动
显示屏采用的是中景园SPI接口屏幕,分辨率240*240,控制芯片是ST7789V,原厂提供了基于51、STM32的C语言驱动代码,下载地址如下:
https://pan.baidu.com/s/1nF34QoV9Dh_59AWkbowwGQ 提取码:8888
我参考了原厂代码,将驱动移植到了MicroPython上,舍弃了一些不必要的功能,驱动代码如下:
文件名:ST7789V.py
from machine import Pin, SPI
import time
import machine
import esp
class LCD_240_240(object):
def __init__(self):
self.hspi = SPI(1, 10000000, polarity=1, phase=0, sck=Pin(21), mosi=Pin(19))
self.lcd_bk = Pin(23, Pin.OUT)
self.lcd_dc = Pin(22, Pin.OUT)
self.lcd_res= Pin(17, Pin.OUT)
self.lcd_bk.value(1)
self.lcd_res.value(0)
time.sleep(0.1)
self.lcd_res.value(1)
time.sleep(0.05)
self.lcd_dc.off()
self.hspi.write(b'\x11')
time.sleep(0.05)
self.LCD_Cmd_Data(b'\x36',b'\x70')
self.LCD_Cmd_Data(b'\x3A',b'\x05')
self.LCD_Cmd_Data(b'\xB2',b'\x0C\x0C\x00\x33\x33')
self.LCD_Cmd_Data(b'\xB7',b'\x35')
self.LCD_Cmd_Data(b'\xBB',b'\x19')
self.LCD_Cmd_Data(b'\xC0',b'\x2C')
self.LCD_Cmd_Data(b'\xC2',b'\x01')
self.LCD_Cmd_Data(b'\xC3',b'\x12')
self.LCD_Cmd_Data(b'\xC4',b'\x20')
self.LCD_Cmd_Data(b'\xC6',b'\x0F')
self.LCD_Cmd_Data(b'\xD0',b'\xA4\xA1')
self.LCD_Cmd_Data(b'\xE0',b'\xD0\x04\x0D\x11\x13\x2B\x3F\x54\x4C\x18\x0D\x0B\x1F\x23')
self.LCD_Cmd_Data(b'\xE1',b'\xD0\x04\x0C\x11\x13\x2C\x3F\x44\x51\x2F\x1F\x1F\x20\x23')
self.lcd_dc.off()
self.hspi.write(b'\x21\x29')
def LCD_Cmd_Data(self,cmd, data):
self.lcd_dc.off()
self.hspi.write(cmd)
self.lcd_dc.on()
self.hspi.write(data)
def SetDisArea(self,xStart,yStart,xEnd,yEnd):
buf = bytearray(4)
buf[0] = 0
buf[1] = xStart
buf[2] = 0
buf[3] = xEnd
self.LCD_Cmd_Data(b'\x2A',buf)
buf[1] = yStart
buf[3] = yEnd
self.LCD_Cmd_Data(b'\x2B',buf)
self.lcd_dc.off()
self.hspi.write(b'\x2C')
def Disp_Color(self,Color):
self.SetDisArea(0,0,239,239)
self.lcd_dc.on()
buf = bytearray(480)
for j in range(240):
buf[j*2] = Color >> 8
buf[j*2+1] = Color & 0xFF
for i in range(240):
self.hspi.write(buf)
def DrawPoint(self,x,y,color):
buf = bytearray(2)
buf[0] = 0
buf[1] = x
self.LCD_Cmd_Data(b'\x2A',buf)
buf[1] = y
self.LCD_Cmd_Data(b'\x2B',buf)
buf[0] = color >> 8
buf[1] = color &0xFF
self.LCD_Cmd_Data(b'\x2C',buf)
def Disp_Str(self,x,y,str_datda):
font_buf = bytearray(64)
for c in str_datda:
start_addr = 0x300000 + 64*(c - 0x20)
esp.flash_read(start_addr, font_buf)
self.SetDisArea(x,y,x+15,y+31)
x+=16
self.lcd_dc.on()
for j in range(64):
for k in range(8):
if (font_buf[j] & (0x01<<k)) == (0x01 << k):
self.hspi.write(b'\xf8\x00')
else:
self.hspi.write(b'\xff\xff')
def Disp_Pic(self, star_addr):
self.SetDisArea(0,0,239,239)
self.lcd_dc.on()
buf = bytearray(480)
byte_offset = star_addr
for i in range(240):
esp.flash_read(byte_offset, buf)
self.hspi.write(buf)
byte_offset += 480
上述代码主要实现了四个函数,刷屏
,显示图片
,显示文字
,打点
,具体用法如下:
from ST7789V import LCD_240_240 #导入显示屏的功能
lcd = LCD_240_240() #创建一个显示屏
lcd.Disp_Color(0x8563) #整屏填充颜色
lcd.Disp_Pic(0x320000) #显示存储在0x320000的图片
lcd.Disp_Str(30,50, b'abc123') #在(30,50)起始位置显示文字abc123
lcd.DrawPoint(100, 100, 0xF800) #在(100,100)处显示一个红色的点 作者:我是鹏老师 https://www.bilibili.com/read/cv13645588 出处:bilibili
字库文件
要想显示文字或者图片,我们需要将字体或图像信息存储到芯片中,开发板使用的是4MB的Flash,我们可以把这些信息存储到Flash的空白区域,在驱动程序里面是从0x300000
位置处读取字体信息,所以我们需要将字体文件烧录到0x300000
位置处,字体文件使用的是32*16
分辨率,可从下列地址下载:
https://shyboy.oss-cn-shenzhen.aliyuncs.com/readonly/font3216.bin
下载完成后将该文件烧录到ESP32的0x300000
地址处即可。
当然,如果您觉得上述字体不太好看或者大小不符合要求,也可以尝试自己生成字库文件。
图像显示
显示屏使用的颜色数据格式是RGB565,我们只要将图像裁剪到合适的分辨率,使用转换软件将图形转换成RGB565格式的二进制数据,再将其烧录到Flash中,就能将图像显示出来了。
图片转RGB565
格式的Bin文件建议采用Image2Lcd
,软件下载地址为:
https://shyboy.oss-cn-shenzhen.aliyuncs.com/readonly/Image2Lcd%202.9%28%E7%A0%B4%E8%A7%A3%E7%89%88%29.rar
配置参数如下:
选取一张照片,采用PS或者画图工具将其裁剪成240*240
分辨率,然后使用Image2Lcd
打开该图片,配置参数如上图,设置完成后点击保存按钮,保存成Bin文件。
然后将字库文件及转换后的图像文件烧录到Flash的空白位置,如下图所示:
然后调用上述代码,就可以在屏幕上显示图片和文字了:
显示B站粉丝数
我们可以通过下列链接获取B站某个UP主的粉丝数:
http://api.bilibili.com/x/relation/stat?vmid=2884629
后面的参数vmid是用户的ID,比如稚晖君
的ID是 20259914
获得的数据如下图所示:
{
"code":0,
"message":"0",
"ttl":1,
"data":
{
"mid":20259914,
"following":191,
"whisper":0,
"black":0,
"follower":1515615
}
}
其中data.follower
中就是稚晖君的粉丝数,当前粉丝约150W。
我们可以使用Python代码,实现上述获取粉丝数的过程,具体代码如下:
文件名:biliflow.py
import network
import json # 导入json功能模块
import urequests #导入urequests功能模块
class BiliFlow(object):
def __init__(self):
wifi = network.WLAN(network.STA_IF) # 将模块设为STA模式
wifi.active(True) # 开启WIFI
if not wifi.isconnected(): # 如果wifi模块未连接到热点
print('WiFi 连接中...')
wifi.connect('your_wifi' , 'your_psd') #连接自己的手机热点
while not wifi.isconnected(): #等待wifi连接
pass
print('WiFi 连接成功' , wifi.ifconfig()) #连接成功
def get_follower(self):
r = urequests.get('http://api.bilibili.com/x/relation/stat?vmid=20259914')
p = json.loads(r.text)
return p['data']['follower']
上述代码中的WiFi名称密码
及B站ID
需要自己更改!!!
然后我们再设计一张背景图片:
把图像转换成RGB565格式的Bin文件后,烧录到Flash的0x320000
的位置。
主函数代码:boot.py
import time
from ST7789V import LCD_240_240
from biliflow import BiliFlow
lcd = LCD_240_240()
bf = BiliFlow()
lcd.Disp_Pic(0x320000) #显示背景图
while True:
flow = bf.get_follower() # 获取粉丝数
lcd.Disp_Str(60,143,str(flow).encode('utf-8')) #显示粉丝数
time.sleep(5)
确保设备中包含如下三个文件:
最终完成的效果如下图:
后面还会有更多有趣的应用,感兴趣的同学可以点点关注!
B站搜索 我是鹏老师
,发现更多惊喜!
另外,如果您觉得这篇文章对你有帮助,可通过如下方式支持一下鹏老师:下载华秋DFM,让鹏老师恰口饭!