上一篇帖子 【在Arduino中使用TFT_eSPI点亮K10屏幕】分享了在Arduino中使用TFT_eSPI点亮K10屏幕,这一篇,再分享一下在标准micropython中使用micropython-nano-gui点亮K10屏幕。
一、安装micropython可以参考 unihiker.com.cn/wiki/k10/micropython_unihiker_k10 来烧录DFRobot官方提供的micropython固件,也可以到micropython官方下载固件烧录。
如果是自己下载安装的,需要下载对应的bin固件:Firmware (Support for Octal-SPIRAM)
下载地址:MicroPython - Python for microcontrollers
如果电脑上没有安装Python,可以参考 DFRobot官方提供的micropython固件烧录方式。
如果电脑上已经安装Python,那么可以使用如下的方式。
先把K10连接到电脑,然后按住BOOT按键不放,再按一下复位按键,3秒钟以后,再松开BOOT按键。
再打开电脑的命令行黑窗口(command),依次输入如下的命令:
- # 查看python版本
- python -V
-
- # 安装esptool工具
- python -m pip install esptool
-
- # 情况K10的Flash
- esptool erase_flash
-
- # 烧录固件
- esptool write_flash -z 0x00 ESP32_GENERIC_S3-SPIRAM_OCT-20241129-v1.24.1.bin
复制代码
最后一步需要注意,请把bin固件文件放到黑窗口显示的目录,或者使用CD命令切换到bin固件所在的目录
烧录完成后,按一下K10的复位按键,然后使用micropython开发工具如Thonny连接,得到如下的MicroPython环境就表示成功:
二、检查当前micropython运行环境
直接运行下面的代码来检查:
- import os
- import gc
- import time
-
- try:
- import micropython
- import esp
- IS_MPY = True
- except (Exception) as e:
- IS_MPY = False
-
- try:
- import board
- import espidf
- IS_CPY = True
- except (Exception) as e:
- IS_CPY = False
-
-
- BOARD_NAME = os.uname().machine
-
- IS_ESP32 = True if 'esp32' in BOARD_NAME.lower() else False
-
- gc.collect()
-
- statvfs_fields = ['bsize','frsize','blocks','bfree','bavail','files','ffree',]
- ss = dict(zip(statvfs_fields, os.statvfs('/')))
-
- print(os.uname())
- print("开发板:%s" % BOARD_NAME)
- print("剩余内存: %0.2fM" % (gc.mem_free()/1024/1024))
- print("剩余存储: %0.2fM" % (ss['bsize'] * ss['bfree'] / 1024 / 1024))
- if IS_MPY:
- ts = esp.flash_size()
- print("总计存储: %0.2fM" % (ts / 1024 / 1024))
-
- if IS_MPY:
- print("内存使用:", end="")
- micropython.mem_info()
-
复制代码
运行正常的情况下,输出如下:
需要注意的是:
如果剩余内存小于1M,说明安装的固件不正确,不是:Firmware (Support for Octal-SPIRAM) 。
同时,开发板名称中,需要包含Octal,才表示正确。
另外,这里显示的总计存储: 8.00M,是因为microython官方固件,是按照8Mb Flash编译的,如果不需要存大的文件,基本够用了。
三、安装扩展IO芯片支持库
可以直接从 https://github.com/mcauser/micropython-xl9535-kxv5-relay 下载扩展IO芯片支持库,也可以用我下载的压缩包:micropython-xl9535-kxv5-relay-master.zip
然后将 src/xl9535_relay.py 上传到K10。
然后用下面的脚本测试:
- from machine import I2C, Pin
- import time
- import xl9535_relay
复制代码
正常运行时,屏幕背光将会开启、关闭循环。
四、安装屏幕显示支持库
micropython环境下,驱动屏幕的库很多。
这篇分享使用的是micropython-nano-gui,小巧好用,支持的类型很多。
可以从其官方下载:https://github.com/peterhinch/micropython-nano-gui,也可以使用我下载的压缩包:micropython-nano-gui-master.zip
然后,使用开发工具,把下图中的文件,全部上传到K10上:
最终K10上的文件如下:
然后,打开color_setup.py,设置如下:
- from machine import Pin, SPI
- import gc
-
- from drivers.ili93xx.ili9341 import ILI9341 as SSD
-
- TFT_MOSI = 21
- TFT_SCLK = 12
- TFT_CS = 14
- TFT_DC = 13
- TFT_RST = 46 # 占位
-
- pdc = Pin(TFT_DC, Pin.OUT, value=0) # Arbitrary pins
- pcs = Pin(TFT_CS, Pin.OUT, value=1)
- prst = Pin(TFT_RST, Pin.OUT, value=1)
-
- gc.collect()
-
- spi = SPI(1, 30_000_000, sck=Pin(TFT_SCLK), mosi=Pin(TFT_MOSI))
- ssd = SSD(spi, height=320, width=240, dc=pdc, cs=pcs, rst=prst, usd=False)
复制代码
然后,就可以打开gui/demos/aclock.py进行测试。
不过,默认的测试程序,显示方向和K10的方向,不一定对应,可以在 refresh(ssd, True) 前后加入对应的代码。
最终添加的代码如下:
- <blockquote>from machine import I2C, Pin
复制代码
然后就可以正常显示了:
这是一个时钟的演示。
五、显示温度曲线
首先,安装aht20驱动,可以从 https://github.com/targetblank/micropython_ahtx0 下载,或者使用我下载的压缩包:micropython_ahtx0-master.zip
下载后,将其中的 ahtx0.py 上传到 K10:
然后参考gui/demos/fpt.py,编写代码:
- from color_setup import ssd # Create a display instance
-
- import cmath
- import math
- import utime
- import uos
- from gui.core.writer import Writer, CWriter
- from gui.core.fplot import PolarGraph, PolarCurve, CartesianGraph, Curve, TSequence
- from gui.core.nanogui import refresh
- from gui.widgets.label import Label
-
- from machine import I2C, Pin
- import xl9535_relay
- from ahtx0 import AHT20
-
- i2c = I2C(scl=Pin(48), sda=Pin(47),freq=400000)
- aht = AHT20(i2c)
- board = xl9535_relay.XL9535_KXV5(i2c, 0x20)
- board.init()
- board.relay(0, True)
-
- refresh(ssd, True) # Initialise and clear display.
- # K10设置
- ssd._wcd(b'\x36', int.to_bytes(0x88, 1, 'little'))
-
- refresh(ssd, True)
-
- # Fonts
- import gui.fonts.arial10 as arial10
- import gui.fonts.freesans20 as freesans20
-
- from gui.core.colors import *
-
- CWriter.set_textpos(ssd, 0, 0) # In case previous tests have altered it
- wri = CWriter(ssd, arial10, GREEN, BLACK, verbose=False)
- wri.set_clip(True, True, False)
-
- # y axis at t==now, no border
- g = CartesianGraph(wri, 0, 0, xorigin = 10, width=240-1, height=320-1, fgcolor=WHITE,
- gridcolor=DARKGREEN, bdcolor=False)
- tsy = TSequence(g, YELLOW, 50)
- tsr = TSequence(g, RED, 50)
- for t in range(1000):
- g.clear()
- temp = aht.temperature
- humi = aht.relative_humidity
- tsy.add(temp/100)
- tsr.add(humi/100)
- refresh(ssd)
- utime.sleep_ms(100)
-
复制代码
保存后运行,显示效果如下:
|