手把手使用Micropython+合宙Esp32c3+合宙air101LCD屏幕绘制,显示图片以及ST7735的详细使用教程


一、驱动安装

CH343驱动下载
下载最新版本就好
驱动下载好后,以管理员身份运行,并点击“安装”
安装完成之后连接设备就可以在设备管理器中看到自己设备及端口
在这里插入图片描述

二、为合宙Esp32c3安装Micropython固件库

1.Micropython简介

MicroPython 是一种精简版的 Python 语言实现,专门用于嵌入式系统和物联网设备。它提供了一个适用于微控制器的交互式解释器和运行环境,使开发者能够在资源有限的硬件上编写和运行 Python 代码。

以下是 MicroPython 的一些主要特点:小巧且高效、交互式解释器、硬件支持、底层硬件控制、模块化扩展性、低功耗支持

总的来说,MicroPython 提供了一种简洁、高效且易于使用的编程环境,适用于嵌入式系统和物联网设备的开发。它将 Python 的易用性和灵活性带到了硬件领域,使得开发者可以更加便捷地创建各种智能设备和嵌入式项目。


2.Micropython解释器下载

使用Thonny或者VScode均可,这里两个都介绍下。

-Thonny解释器:

Thonny官网直接点击进入下载对于版本。
Thonny体量很小,是一个简单易用的适合于Micropython的IDE,美中不足的是
没有代码补全!不熟悉的人来说写起来比较费时间

-VScode:

插件名:RT-Thread MicroPython 直接搜索安装即可
安装成功后就可以看到下方有这样的标识
标识
而大家都知道VScode的优点,比如代码补全!这是Thonny没有的
此外的两者使用会随后说明
提示:此外的两者使用会随后说明


3.ESP32C3固件库下载以及安装

固件库下载

注意分清自己的ESP32C3是哪个对应的版本:
ESP32C3固件库下载
ESP32C3-with-usb固件库下载
下载最新版即可
提示:不知道自己对应的版本可以一个一个试,但多半是ESP32C3
下载完成后会得到一个.bin格式的文件
如图所示

固件库安装

有两种方法

方法一:Thonny中直接进行安装

打开Thonny,上侧的run->配置解释器后出现如图:
在这里插入图片描述
在这里插入图片描述
我这里是最新版本,点击那三条杠后会出现几个选项
选择第一个Select local MicroPython image ...选择之前的bin文件安装即可。
安装完成后重进,可以看到Thonny左侧栏多出了Micropython device即为安装成功。
在这里插入图片描述

方法二:使用flash_download_tool安装(推荐)

也许有些人在方法一安装失败了,那么请使用方法二,也是我极力推荐的一个方法首先需要软件flash_download_tool,下面是百度网盘下载链接

链接:https://pan.baidu.com/s/1ANF3Z20itoeXNO-FnUoNgw
提取码:anse
永久有效<

在这里插入图片描述
在这里插入图片描述
点击ok,如果你之前有一些别的在里面,特别是从方法一试过的人。简易把上面的全部清空
在这里插入图片描述
清空后选择正确的端口再点击
在这里插入图片描述

等待完成后再回到上面的几栏,点击三个点
在这里插入图片描述
选择你的.bin固件库,并在右侧填入0x0000,之后点击
在这里插入图片描述
等待片刻后就完成了,然后再回到Thonny,这时候不用操作,它会自动识别,然后也同样会在左侧出现Micropython device,安装成功!


三、代码上传到ESP32C3中

使用Thonny上传

在Micropython device 中右键新建一个.py文件即可,下面是一个测试代码,我创建一个pwmled.py

from machine import Pin,PWM
import time
led13 = PWM(Pin(13))

led13.freq(1000)
def main():
    while True:
        for i in range(0 , 1023):
            led13.duty(i)
            time.sleep_ms(2)
        for i in range(1023 , -1, -1):
            led13.duty(i)
            time.sleep_ms(2)

if __name__=="__main__":
    main()

在这里插入图片描述
按F5或点击如图的地方即可上传

使用vscode

点击在这里插入图片描述
在这里插入图片描述
连接即可,然后后右键你的ledpwm.py
在这里插入图片描述
在vscode中下载到设备上后,如果再用Thonny打开会显示你在vscode中上传的代码。


四、驱动合宙air101LCD

接线:其实没有接线

像这样焊接其实差不多
一插即用

请添加图片描述

ST7735.py库

合宙air101LCD的驱动芯片是ST7735。
ST7735库的下载地址
我所使用的是根据ST7735改的库,详情点击网页即可。
下载之后就导入库。
需要导入的是如下
在这里插入图片描述

导入方法就是在上侧Files中选择一个文件,右键后有upload to/点击即可
在这里插入图片描述

如果它显示都是‘正在启动’直接cancel就可以上传了。

五、ST7735代码使用

1.引入库以及一些初始化

代码如下(示例):

from machine import SPI, Pin  # 导入 SPI 和 Pin 类模块
from ST7735 import TFT, bitSwap, FontLib  # 导入 TFT、bitSwap 和 FontLib 类模块
import time  # 导入 time 模块
import framebuf  # 导入 framebuf 模块
import random  # 导入 random 模块

USE_FRAME_BUFFER = True  # 设置使用帧缓冲器(frame buffer)

# 初始化 SPI 接口,设置波特率、极性、相位和引脚号
spi = SPI(1, baudrate=40000000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3), miso=Pin(10))#无需修改

tft = TFT(spi, '/combined.bin', 6, 10, 7)  # 创建 TFT 对象,指定 SPI、字库文件路径和引脚配置
#由于直接应用了/combined.bin字体库可以直接写中文
tft.init_7735(tft.REDTAB80x160)  # 初始化 TFT,设置显示类型为 80x160 像素
tft.fill(TFT.WHITE)  # 填充屏幕为白色,实际显示为黑色

#上述都无需改动

2.测试代码

代码如下(示例):

from machine import SPI, Pin  # 导入 SPI 和 Pin 类模块
from ST7735 import TFT, bitSwap, FontLib  # 导入 TFT、bitSwap 和 FontLib 类模块
import time  # 导入 time 模块
import framebuf  # 导入 framebuf 模块
import random  # 导入 random 模块

USE_FRAME_BUFFER = True  # 设置使用帧缓冲器(frame buffer)

# 初始化 SPI 接口,设置波特率、极性、相位和引脚号
spi = SPI(1, baudrate=40000000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3), miso=Pin(10))#无需修改

tft = TFT(spi, '/combined.bin', 6, 10, 7)  # 创建 TFT 对象,指定 SPI、字库文件路径和引脚配置
#由于直接应用了/combined.bin字体库可以直接写中文
tft.init_7735(tft.REDTAB80x160)  # 初始化 TFT,设置显示类型为 80x160 像素
tft.fill(TFT.WHITE)  # 填充屏幕为白色,实际显示为黑色

#上述都无需改动

#不停显示字符
text=['你好!','世界!','在干嘛?','上号!','氪不改非']
font_width = 11
font_height = 14
def show_text():
    x,y=random.randint(0,120),random.randint(0,60)+1
    r = random.randint(0,4)
    tft.fillrect((x,y),(font_width*len(text[r]),font_height),TFT.color(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
    tft.text(
        (x,y),
        text[r],
        TFT.color(random.randint(0,255),random.randint(0,255),random.randint(0,255)),
        1
    )
    time.sleep_ms(200)
if __name__=="__main__":

    while True:
        time.sleep(1)
        for i in range(100):
            show_text()
        tft.fill(TFT.WHITE)

效果:请添加图片描述

3.图片显示以及一些基础绘制函数使用

推荐使用一串代码来生成.dat格式文件

from PIL import Image #需要PIL库
import struct
import os

def image_to_dat(image_path, output_path):
    image = Image.open(image_path)
    image = image.convert('RGB')
    width, height = image.size

    dat_file_path = os.path.splitext(output_path)[0] + '.dat'

    with open(dat_file_path, 'wb') as f:
        for y in range(height):
            for x in range(width):
                r, g, b = image.getpixel((x, y))
                inverted_r = 255 - r
                inverted_g = 255 - g
                inverted_b = 255 - b
                color565 = ((inverted_r & 0xF8) << 8) | ((inverted_g & 0xFC) << 3) | (inverted_b >> 3)
                color_bytes = struct.pack('>H', color565)
                f.write(color_bytes)

    print(f"成功生成 {dat_file_path} 文件。")

# 调用示例
image_path = 'C:/Users/ansel/Desktop/746b3cb26942a31d976fe77df0dc9622.jpg'  # 图像文件路径
output_path = 'C:/Users/ansel/Downloads/4.dat'  # 输出的 .dat 文件路径

image_to_dat(image_path, output_path)

成功将图片转化为565颜色的.dat格式后,将文件update to /设备里。
以下是图片显示的代码:

with open('/4.dat', 'rb') as f:
               for row in range(80):
                   buffer = f.read(160)
                   tft.image(0,row,159,row,buffer)

效果:
请添加图片描述

剩余的简单看一下ST7735.py里的函数即可:

x,y=10,10
#翻转屏幕:rotation
tft.rotation(1) #0到4的整数

#画像素点:pixel
tft.pixel((x,y),TFT.BLACK) #参数分别为位置坐标,颜色

#字符串输出:text
tft.text((x,y),'你好!WORLF!',TFT.BLACK,1,True)#参数分别为位置坐标,字符串,颜色,字体大小,是否自动换行

#字符输出:char
tft.char((x,y),'1',TFT.BLACK,1)#参数分别为位置坐标,字符,颜色,字体大小

#画线:line
tft.line((x,y),(x+10,y+10),TFT.BLACK)#参数分别为起始位置坐标,末位置坐标,颜色

#画竖线以及画横线:vline以及hline
tft.vline((x,y),10,TFT.BLUE)#参数分别为起始位置坐标,长度,颜色
tft.hline((x,y),10,TFT.BLUE)#参数分别为起始位置坐标,长度,颜色

#画矩形边框以及填充矩形:rect以及fillrect
tft.rect((x,y),(10,20),TFT.GREEN)#参数分别为起始位置坐标,长宽,颜色
tft.fillrect((x,y),(10,20),TFT.GREEN)#参数分别为起始位置坐标,长宽,颜色

#画圆边框及填充圆:circle以及fillcircle
tft.circle((x,y),10,TFT.BLACK)#参数分别为起始位置坐标,半径,颜色
tft.fillcircle((x,y),10,TFT.BLACK)#参数分别为起始位置坐标,半径,颜色

#

posted @ 2023-06-24 21:41  22207123-吴裕杰  阅读(2184)  评论(0)    收藏  举报