601|1

10

帖子

6

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子Follow me第2期】任务1:控制屏幕显示中文 [复制链接]

  本帖最后由 青蛙2009 于 2023-9-2 13:13 编辑

【得捷电子Follow me第2期】任务1:控制屏幕显示中文

完成屏幕的控制,并且能显示中文

接线:

编程语言和环境用CircuitPython:

开发板:

Adafruit Feather ESP32-S3 TFT

运行环境:

Adafruit CircuitPython 8.2.3 on 2023-08-11

编辑器:

mu-editor

用到的额外模块:

adafruit_bitmap_font

adafruit_display_text

还需要字体文件LiSu-32.pcf,放在code.py同目录的font目录下。

先说一下制作字库:

需要用到一款:FontForge的工具。

1、用这个工具打开一个字体文件ttf,我是从windows的字体复制了个隶书的字体来用,复出来名字自己变成了SIMLI.TTF,能用就行。

 

2、框选要保留的字体,中文的字体就要一个一个慢慢点咯。

我是像下面那样,输入要的中文字,过滤重复,再排序,最后打印每个字的unicode码,

然后再一个一个慢慢点。不知有没大佬有其他好方法。

s='年月日时分秒晴多云晴间多云晴间多云大部多云大部多云阴阵雨雷阵雨雷阵雨伴有冰雹小雨中雨大雨暴雨大暴雨特大暴雨冻雨雨夹雪阵雪小雪中雪大雪暴雪浮尘扬沙沙尘暴强沙尘暴雾霾风大风飓风热带风暴龙卷风冷热未知℃。'
s=list(set([i for i in s]))
s.sort()
for i in s:
    print('%s: %d'%(i,ord(i)))

3、选好要保留的字,然后在工具栏选-->edit-->select->invert selection,反转选择,最后右键选 clear 清空选择的字,仅保留要的字体。

4、然后在工具栏选-->Element-->Bitmap Strikes Available-->输入要的字体像素-->选OK                                                                     (这一步什么意思我也不清楚,照着教程弄的)

5、在工具栏选-->Element-->Regenerate Bitmap Glyphs->顶部有个Selected Glyphs 改成 All Glyphs,输入要的字体像素-->选OK   (这一步什么意思我也不清楚,照着教程弄的)

6、在工具栏选-->File-->Generate Fonts-->点Generate->弹个Encoding too large选yes-->弹个Errors detected选Generate                (这一步就生成了3个文件,有用的就是bdf文件)

bdf文件是文本文件,可以用文本打开,里面是描述每个字的信息,可以用adafruit_bitmap_font库直接加载:

font=bitmap_font.load_font('font/LiSu-32.bdf')

上面那段代码直接加载跟pcf格式的字库加载速度其实差不多,但到了创字的时候bdf就要慢很多。

下面说下怎么从bdf转pcf

进入https://adafruit.github.io/web-bdftopcf/这个页面,点browse

选刚刚导出的bdf文件后,网页会自动转换格式然后下载转好的pcf文件。

看教程说pcf文件大小比bdf小,速度快,不知为何我弄的bdf文件比pcf文件要小很多,加载速度倒是pcf快没错。

代码解析:

以下是core.py文件完整代码:

#adafruit_display_text/
#adafruit_bitmap_font/
import board
import displayio
import terminalio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time


WIDTH=240
HEIGHT=135

lcd=board.DISPLAY
cv=displayio.Group()




print('font loading...')
st=time.monotonic()
font=bitmap_font.load_font('font/LiSu-32.pcf')
print('font loaded! %fms'%((time.monotonic()-st)*1000))
fb=font.get_bounding_box()
print('font bounding box (w, h, xoffset, yoffset): ', fb)

s0='年月日时分秒晴多云晴间多云晴间多云大部多云大部多云阴阵雨雷阵雨雷阵雨伴有冰雹小雨中雨大雨暴雨大暴雨特大暴雨冻雨雨夹雪阵雪小雪中雪大雪暴雪浮尘扬沙沙尘暴强沙尘暴雾霾风大风飓风热带风暴龙卷风冷热未知℃。'
s0=list(set([i for i in s0]))
s0.sort()
s0=''.join(s0)

s1=''.join([chr(i) for i in range(33,48)])
s2=''.join([chr(i) for i in range(48,65)])
s3=''.join([chr(i) for i in range(65,128)])

print('word count: ',len(s0)+len(s1)+len(s2)+len(s3))

print('label creating...')
st=time.monotonic()
#lb0=label.Label(terminalio.FONT, text=s, color=0xffffff)
lb0=label.Label(font, text=s0, color=0xffffff)
lb1=label.Label(font, text=s0, color=0x7f7f7f)
lb2=label.Label(font, text=s1, color=0xaaffaa)
lb3=label.Label(font, text=s2, color=0xaaaaff)
lb4=label.Label(font, text=s3, color=0xffaaaa)
print('label created! %fms'%((time.monotonic()-st)*1000))
print('label bounding box (x, y, w, h)', lb0.bounding_box)

box=lb0.bounding_box
print('lb0 bounding box (x, y, w, h)', box)

gp1=displayio.Group(scale=1, x=0, y=0)#, x=(lcd.width-lb0.width*scale)//2, y=(lcd.height)//2)
gp1.append(lb1)
gp1.append(lb0)
gp1.append(lb2)
gp1.append(lb3)
gp1.append(lb4)
cv.append(gp1)

lb1.x=lcd.width
lb0.x=lb0.x+1
lb0.y=-box[1]
lb1.y=lb0.y+1
lb2.y=fb[1]+5
lb2.x=lcd.width
lb3.y=(fb[1]+5)*2
lb3.x=lcd.width
lb4.y=(fb[1]+5)*3
lb4.x=lcd.width

c0=0
c1=0
c2=0

lcd.root_group=cv

while True:
    lb0.x-=2
    lb1.x=lb0.x+1
    if lb0.x<-lb0.width:
        lb0.x=lcd.width

    lb2.x-=20
    if lb2.x<-lb2.width:
        lb2.x=lcd.width

    lb3.x-=10
    if lb3.x<-lb3.width:
        lb3.x=lcd.width

    lb4.x-=4
    if lb4.x<-lb4.width:
        lb4.x=lcd.width

    c0+=3
    c1+=7
    c2+=11
    if c0>255:
        c0-=255
    if c1>255:
        c1-=255
    if c2>255:
        c2-=255

    lb0.color=((c0<<16) + (c1<<8) + c2)

    time.sleep(0.008)

大体流程如下:

#displayio.release_displays()
#spi=board.SPI()
#lcd_bus=displayio.FourWire(spi, command=board.TFT_DC, chip_select=board.TFT_CS)
#lcd=ST7789(lcd_bus, rotation=270, width=WIDTH, height=HEIGHT, rowstart=40, colstart=53)
#用默认的display,省去重新创建一个,还省去引用ST7789的库

lcd=board.DISPLAY

#加载字体

font=bitmap_font.load_font('font/LiSu-32.pcf')

#创建label对象,需要字体

lb0=label.Label(font, text=s0, color=0xffffff)

#建个组,主要用来放文本,并对文本进行缩放

gp1=displayio.Group(scale=1, x=0, y=0)

#label放到组里

gp1.append(lb0)

#再建个组,用来在屏幕直接显示的对象

cv=displayio.Group()

#把gp1组加到cv组里
cv.append(gp1)

#在屏幕显示cv组

lcd.root_group=cv

效果展示:

任务视频演示

任务源码

活动的心得体会:

字体加载有点慢,首次加载没加过的字才慢,后面就可以了。

之前都没做过自建字库,现在会了。

 

最新回复

看到大佬如期收到板子,并能完成任务,那是多么幸福的事呀!  详情 回复 发表于 2023-9-2 16:35
点赞 关注
 
 

回复
举报

6976

帖子

11

TA的资源

版主

沙发
 
看到大佬如期收到板子,并能完成任务,那是多么幸福的事呀!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表