【ESP32_Py_Board】LCD显示图片,文字,B站粉丝数

上篇文章我们介绍了【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,让鹏老师恰口饭!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值