ESP32使用microPython控制1.54寸240x240彩色屏幕

王铭东老师B站视频详细讲解了讲了关于240x240屏幕的一些基础东西,我这里在原功能的基础上拓展了中文显示的功能,顺带修改了实际操作过程中程序中遇到的一些问题

一、运行效果

二、240x240屏幕

ST7789有 ST7789, ST7789V, ST7789H2等型号, 分辨率有240x204, 240x240, 240x320等多种类型, 驱动方式都是一样的.

引脚定义:

  • RES -> RESET复位引脚
  • DC -> 数据,指令选择引脚,1为数据 、0为指令
  • CS -> Chip Select低电平有效
  • SCK,SCL, CLK -> SPI串行时钟信号
  • BL -> 背光引脚,高电平点亮屏幕,低电平关闭屏幕
  • SDA -> SPI串行数据输入输出信号
  • GND -> 电源地
  • VCC -> 支持3.3v和5v输入

三、硬件连接

ESP32 240x240屏幕
3V3 (or 5V) VCC
GND GND
GPIO18 SCL
GPIO23 SDA
GPIO2 DC
GPIO5 CS
GPIO22 BL
GPIO17 RES

四、驱动下载

4.1、驱动下载地址

st7789py.py:https://github.com/russhughes/st7789py_mpy
修改后的代码及附件下载地址:https://github.com/LC044/MCU/tree/main/ST7789

4.2、bug修改

使用原作者驱动的时候发现屏幕不亮,对原驱动代码稍加修改能够成功显示画面

  • 将204、205行代码注释掉

    #self.hard_reset()
    #self.soft_reset()
    

    后面加上三行代码

    self.cs.init(self.cs.OUT, value=1)
    self.dc.init(self.dc.OUT, value=0)
    self.reset.init(self.reset.OUT, value=1)
    
  • 215、216行代码替换成

    if backlight is not None:#backlight.value(1)self.backlight.init(self.backlight.OUT, value=1)
    

4.3、支持中文显示(还不完善)

st7789类中增加三个方法

  1. 显示16x16大小的中文

        def _text_gb16(self, font,size, text, x0, y0, color=WHITE, background=BLACK):for char in text:if (x0+font.FONT['WIDTH'] <= self.width and y0+font.FONT['HEIGHT'] <= self.height):for line in range(2):idx = line * 16buffer = b''for x in range(16):for i in range(8):buffer += struct.pack('H',color if font.FONT[char][idx+x] & _BIT[7-i] else background)self.blit_buffer(buffer, x0, y0+8*line, 16, 8)x0 += font.WIDTH
    
  2. 显示24x24大小的中文

        def text_gb24(self, font,size, text, x0, y0, color=WHITE, background=BLACK):for char in text:if (x0+font.FONT_24['WIDTH'] <= self.width and y0+font.FONT_24['HEIGHT'] <= self.height):for line in range(3):#分成3次显示idx = line * (font.FONT_24['SIZE']//3)buffer = b''for x in range(font.FONT_24['SIZE']//3):for i in range(8):buffer += struct.pack('H',color if font.FONT_24[char][idx+x] & _BIT[7-i] else background)self.blit_buffer(buffer, x0, y0+8*line, font.FONT_24['WIDTH'], 8)x0 += font.FONT_24['WIDTH']
    
  3. 显示32x32大小的中文

        def text_gb32(self, font,size, text, x0, y0, color=WHITE, background=BLACK):for char in text:if (x0+font.FONT_32['WIDTH'] <= self.width and y0+font.FONT_32['HEIGHT'] <= self.height):for line in range(4):idx = line * (font.FONT_32['SIZE']//4)buffer = b''for x in range(font.FONT_32['SIZE']//4):for i in range(8):buffer += struct.pack('H',color if font.FONT_32[char][idx+x] & _BIT[7-i] else background)self.blit_buffer(buffer, x0, y0+8*line, font.FONT_32['WIDTH'], 8)x0 += font.FONT_32['WIDTH']
    
  4. 显示48x48大小的中文

        def text_gb48(self, font,size, text, x0, y0, color=WHITE, background=BLACK):for char in text:if (x0+font.FONT_48['WIDTH'] <= self.width and y0+font.FONT_48['HEIGHT'] <= self.height):for line in range(4):#分成4次显示idx = line * (font.FONT_48['SIZE']//4)buffer = b''for x in range(font.FONT_48['SIZE']//4):for i in range(8):buffer += struct.pack('H',color if font.FONT_48[char][idx+x] & _BIT[7-i] else background)self.blit_buffer(buffer, x0, y0+12*line, font.FONT_48['WIDTH'], 12)x0 += font.FONT_48['WIDTH']
    
  5. text方法修改

        def text(self,font,size, text, x0, y0, color=WHITE, background=BLACK):"""Draw text on display in specified font and colors. 8 and 16 bit widefonts are supported.Args:font (module): font module to use.text (str): text to writex0 (int): column to start drawing aty0 (int): row to start drawing atcolor (int): 565 encoded color to use for charactersbackground (int): 565 encoded color to use for background"""if font.flag == 'gb16':self._text_gb16(font,size, text, x0, y0, color, background)#print('gb16')elif font.WIDTH == 8:self._text8(font, text, x0, y0, color, background)else:self._text16(font, text, x0, y0, color, background)#print('abc16')
    

4.4、获取中文字体

在线取模网址:在线点阵取模_暮光小猿wzt (scraft.top)

首先选择需要的字体大小,底下参数选择反转位序

在font_gb_16x16.py中添加字典

示例格式:(必须标明字体宽高和每个字的字节大小

FONT = {'HEIGHT':16,'WIDTH':16,'SIZE':32,'当':[0x01,0x00,0x21,0x08,0x11,0x08,0x09,0x10,0x09,0x20,0x01,0x00,0x7f,0xf8,0x00,0x08,0x00,0x08,0x00,0x08,0x3f,0xf8,0x00,0x08,0x00,0x08,0x00,0x08,0x7f,0xf8,0x00,0x08],'前':[0x10,0x10,0x08,0x10,0x08,0x20,0xff,0xfe,0x00,0x00,0x3e,0x08,0x22,0x48,0x22,0x48,0x3e,0x48,0x22,0x48,0x22,0x48,0x3e,0x48,0x22,0x08,0x22,0x08,0x2a,0x28,0x24,0x10],'天':[0x00,0x00,0x3f,0xf8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xff,0xfe,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x10,0x10,0x20,0x08,0xc0,0x06],'气':[0x10,0x00,0x10,0x00,0x3f,0xfc,0x20,0x00,0x4f,0xf0,0x80,0x00,0x3f,0xf0,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0a,0x00,0x0a,0x00,0x06,0x00,0x02],'阴':[0x00,0x00,0x7d,0xfc,0x45,0x04,0x49,0x04,0x49,0x04,0x51,0xfc,0x49,0x04,0x49,0x04,0x45,0x04,0x45,0xfc,0x45,0x04,0x69,0x04,0x52,0x04,0x42,0x04,0x44,0x14,0x48,0x08],}

注:不要加载太多字体,否则会显示内存不足。需要大量字库的话可以将字节码写入文件里,不要用python字典存储,python字典的散列表很耗费空间。

五、示例程序

首先将字体文件下载到esp32的flash里,这里我放在了esp32的package文件夹里

from machine import Pin, SPI
from package import st7789py as st
from package import vga1_16x32 as font
from package import font_gb_16x16 as font_gb
import timeclass Display():def __init__(self):self.tft = st.ST7789(SPI(2, 10000000), 240, 240, reset=Pin(17), dc=Pin(2), cs=Pin(5), backlight=Pin(22), rotation=0)self.WHITE = st.color565(255, 255, 255)#BRGself.BLACK = st.color565(0, 0, 0)self.RED = st.color565(0, 255, 0)self.GREEN = st.color565(0, 0, 255)self.BLUE = st.color565(255, 0, 0)self.YELLOW = st.color565(0, 255, 255)print(self.RED,self.GREEN,self.BLUE)self.last_hour = 0self.last_minute = 0self.last_second = 0self.last_year = 0self.last_month = 0self.last_day = 0self.init_show()def init_show(self):'''初始化显示画面'''self.tft.text_gb48(font_gb,32, ':', 20+24*2, 100, self.WHITE, self.BLACK)self.tft.text_gb48(font_gb,32, ':', 20+24*5, 100, self.WHITE, self.BLACK)self.tft.text_gb48(font_gb,32, '00', 20, 100, self.WHITE, self.BLACK)self.tft.text_gb48(font_gb,32, '00', 20+24*3, 100, self.WHITE, self.BLACK)self.tft.text_gb48(font_gb,32, '00', 20+24*6, 100, self.WHITE, self.BLACK)self.text_gb('小雨')self.text('hello world!')def text_gb(self,text):self.tft.text_gb32(font_gb,32, text, 0, 0, self.WHITE, self.BLACK)def text(self,text):self.tft.text(font,32, text, 0, 50, self.GREEN, self.BLACK)def show_time(self,t):'''显示时间'''year = t[0]month = t[1]day = t[2]hour = t[3]minute = t[4]second = t[5]ti = "{:0>2d}:{:0>2d}:{:0>2d}".format(hour,minute,second)#print(ti)if hour != self.last_hour:self.tft.text_gb48(font_gb,32, '{:0>2d}'.format(hour), 20, 100, self.BLUE, self.BLACK)self.last_hour = hourif minute != self.last_minute:self.tft.text_gb48(font_gb,32, '{:0>2d}'.format(minute), 20+24*3, 100, self.RED, self.BLACK)self.last_minute = minuteif second != self.last_second:self.tft.text_gb48(font_gb,32, '{:0>2d}'.format(second), 20+24*6, 100, self.GREEN, self.BLACK)self.last_second = second#self.tft.text_gb48(font_gb,32, ti, 20, 100, self.WHITE, self.BLACK)def run(self):while True:t = time.localtime(time.time())#if t[5]%2==0:self.show_time(t)time.sleep(0.5)#for i in range(65536,100):#    self.tft.text_gb32(font_gb,32, '雨', 100, 150, i, self.BLACK)def __del__(self):pass
D = Display()
D.run()

运行结果见开头

ESP32使用microPython控制240x240彩色屏幕显示中文相关推荐

  1. 物联网开发笔记(27)- 使用Micropython开发ESP32开发板之控制240x240的oled屏幕(ST7789芯片)

    这一节我们讲解了如何控制240x240的oled屏幕,该oled屏幕驱动芯片是ST7789,我们控制屏幕显示两行字. 一.目的 使用MicroPython开发ESP32开发板控制240x240的ole ...

  2. microPython驱动tft屏幕显示中文终极解决方案

    microPython驱动tft屏幕显示中文终极解决方案 一.运行效果 二.实现原理 原理同上篇文章一样,用在线汉字取模工具获取点阵的字节信息,通过st7789py.py驱动程序显示出来. 上次的程序 ...

  3. Micropython ESP32驱动CH455控制4位数码管

    Micropython ESP32驱动CH455控制4位数码管 1.硬件 CH455驱动4位共阴数码管的原理图如下所示. ESP32-S模块,用GPIO4作为SCL和GPIO16作为SDA. 2.软件 ...

  4. 【MicroPython ESP32】1.8“tft ST7735带中文驱动显示示例

    [MicroPython ESP32]1.8"tft ST7735带中文驱动显示示例 本实例基于Thonny平台开发 效果演示 驱动屏幕和开发板 驱动屏幕采用的是合宙1.8"tft ...

  5. esp8266原理图_ESP32/ESP8266使用MicroPython控制DHT11/DHT22

    背景知识视频教程 高级ESP32 - 国外课栈​viadean.com 使用NodeMCU(由ESP8266支持),MicroPython和PyCharm进行物联网 - 国外课栈​viadean.co ...

  6. esp32使用MicroPython驱动oled屏显示中文和英文

    文章目录 esp32使用MicroPython驱动oled屏显示中文和英文 介绍 安装 特点 开源 硬件连接 API 示例 显示英文字符 显示汉字 参考链接 esp32使用MicroPython驱动o ...

  7. micropython arduino选哪个好_玩转GPIO之ESP32基于MicroPython与Arduino的计算性能测试

    ESP32芯片简直是玩转Arduino的性价比之王,为了摸清其特性,本文分别基于MicroPython与Arduino对ESP32进行计算性能测试.本文采用的硬件是NodeMCU-32S. 本文测试M ...

  8. stm32 micropython vscode_在vscode里基于Pymakr插件进行esp32的micropython开发

    1. 安装vscode里面的插件 安装pymakr插件前,需要安装Node.js,这里我安的是推荐的12.18.3LTS. 可以按默认路径安装,下面的提示注意勾上 按提示操作,然后会自动启动windo ...

  9. Arduino ESP32 Web网页控制RGB灯

    Arduino ESP32 Web网页控制RGB灯

最新文章

  1. python 图像分析自然纹理方向与粗细代码_python skimage图像处理(二)
  2. SQL to Elasticsearch java code
  3. Android 每天定时提醒功能实现
  4. TransmittableThreadLocal 解决 线程池线程复用 无法复制 InheritableThreadLocal 的问题
  5. linux top 命令可视化_Linux top命令使用详解:显示或管理执行中的程序
  6. LeetCode 1984. 学生分数的最小差值
  7. Linux动态库的导出控制
  8. javascript 理解对象--- 定义多个属性和读取属性的特性
  9. BYOD提升企业生产力的5种方式
  10. AI智能语音识别算法原理 四
  11. python如何切换windows窗口_python3 selenium 切换窗口的几种方法小结
  12. html表格的常用样式
  13. 一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值
  14. robots.txt
  15. 安防工程商选择千兆POE交换机的注意事项
  16. 设计改变世界,2022年戴森设计大奖作品征集正式开启
  17. 为什么我要反对北大青鸟[转自老赵]
  18. 4.11 数值分析: 求重根/带参数m的牛顿迭代法
  19. JAVA计算机毕业设计新生入学报到管理系统Mybatis+系统+数据库+调试部署
  20. Mirai源码分析报告 (1)

热门文章

  1. BTC,BCH,BTG,EOS,TRX price analysis on 25th May
  2. canvas宽高设置
  3. 【操作系统】编程实现如下互斥同步问题:桌上有一空盘,爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。请用P、V原语(wait和signal操作)实现爸爸、儿子、女儿三
  4. 纯干货!Java后端开发十二条经验分享!
  5. android模拟点击滑动,android模拟点击,长按和滑动
  6. Ubuntu22.04上安装Xilinix Vivado 2018.3
  7. 无需注解快速生成API文档,跟SpringBoot绝配
  8. 177本名著浓缩成了177句话!经典收藏!太有道理了!
  9. ACE-NODE: Attentive Co-Evolving Neural Ordinary DifferentialEquations(KDD 2021)
  10. egg项目服务器部署,egg部署到服务器