1591|3

254

帖子

2

TA的资源

纯净的硅(初级)

楼主
 

【得捷电子Follow me第2期】任务1:使用CircuitPython显示图片和中文 [复制链接]

 

欢迎收看这一期的内容,这一期讲的是使用CircuitPython显示图片和中文

 

displayio简介

displayio 是 CircuitPython 中用于管理和控制显示设备(通常是液晶屏或 OLED 屏幕)的库。它提供了一种方式来创建和管理图形元素,以便在显示设备上绘制各种图形和文本。 简单来说,就是可以用display系列库来制作一些简单的界面。而最简单的莫过于使用背景图片加文字的形式。

第一步、创建显示对象

首先,我们需要创建一个 displayio.Display 对象,该对象表示物理显示设备。这块板子的固件默认已经绑定好显示设备,我们只需要引入对应的库,并调用即可。 完全不需要去管显示屏驱动,分辨率,偏移量那些东西。

  • import board
  • # 导入displayio库(内置的)
  • import displayio
  • # 导入外部库adafruit_imageload,如果没有就在教程附件下载
  • import adafruit_imageload
  • # 导入外部库adafruit_display_text里的lable,用于显示标签
  • from adafruit_display_text import label
  • # 导入外部库adafruit_bitmap_font里的lable
  • from adafruit_bitmap_font import bitmap_font,用于显示字体
  • # 使用固件自带的屏幕设备,不需要另行初始化屏幕参数
  • display = board.DISPLAY

除了board和displayio内置库,还需要导入adafruit_imageload库,用来加载图片; 导入adafruit_display_text库,用于自定义文字标签; 导入adafruit_bitmap_font库,用于加载自定义字体。

对应的库,以及图片、字体文件会放在附件压缩包里。

第二步、创建图像组

接下来,我们可以创建一个或多个 displayio.Group 对象,它们用于组织图形元素。每个对象可以包含多个图形元素,它们将按照添加的顺序绘制到显示设备上。 同一时间只显示一个对象,可以创建多个 displayio.Group 来实现屏幕切换。

第三步、创建背景图片

这里再次强调一下,CircuitPython是运行在单片机上的,它的一切都是围绕单片机上的资源,而不是电脑里的资源。 举个例子,接下来的代码里会使用到/pic/tqbg.png这个图片资源,它的存储路径必须是CIRCUITPY磁盘目录里的pic/tqbg.png。 也就是说/代表了CIRCUITPY磁盘根目录,CircuitPython所有的本地资源都是CIRCUITPY磁盘根目录里能找到的才行。 并不是你把图片放在电脑上就能在板子的屏幕上显示了。 既然要显示图片,就得先加载图片,背景图片可以使用Pixso来制作一个240x135分辨率的图片。

  • # 加载图片
  • image, palette = adafruit_imageload.load("/pic/tqbg.png")
  • # 是否开启透明
  • palette.make_transparent(0)
  • # 创建图片布局
  • grid = displayio.TileGrid(image, pixel_shader=palette)
  • # 将图片布局添加到图像组,由于是第一个添加的,默认是最下层
  • group.append(grid)
  • # 显示当前图像组
  • display.show(group)

第四步、创建文本标签以显示文字

我们可以使用label.Label函数来创建一个文字标签,这个函数需要三个参数。 第一个是字体,显示中文必须使用自定义字体,固件自带是没有中文的。 第二个参数是需要显示的文字内容,第三个参数是字体颜色。

像刚刚说的,我们需要使用自定义字体,这就得使用bitmap_font.load_font方法来加载字体了。 如代码里显示的,只需要传递正确的字体路径参数即可。 然后字体颜色可以指定一下,代码里使用的是黑色。 由于我们做时钟,需要使用两种不同大小的字体,这里我使用了思源黑体的16号优化天气字体。 只包含了很少的字,体积比较小,加载时间比较快。 而时钟使用了60磅的字体,字体大一些,只包含数字。

首先我们创建一个名称为date的标签(label),并设置这个标签的x轴和y轴起点偏移量,最后将这个标签加入图像组。 用同样的方式添加week,time,temp,tempzh几个标签,这几个标签的x,y轴起点都需要自己慢慢调整。

标签都添加后,就可以使用display.show(group)把标签显示了。 最后定义一个死循环,屏幕的内容就会固定住了。 从视频可以看到背景、各个标签的加载过程,按加入的顺序一个个显示出来了。

  • # 加载字体并定义字体颜色为黑色
  • font = bitmap_font.load_font("/font/sytq_16.pcf")
  • nun_font = bitmap_font.load_font("/font/DingTalk_ncn_60.pcf")
  • color = 0x000000
  • # 初始化日期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  • date = label.Label(font, text="10月3日", color=color)
  • date.x = 50
  • date.y = 30
  • group.append(date)
  • # 初始化星期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  • week = label.Label(font, text="周二", color=color)
  • week.x = 150
  • week.y = 30
  • group.append(week)
  • # 初始化时间标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  • time = label.Label(nun_font, text="18:20", color=color)
  • time.x = 20
  • time.y = 80
  • group.append(time)
  • # 初始化温度标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  • temp = label.Label(font, text="30°", color=color)
  • temp.x = 70
  • temp.y = 140
  • group.append(temp)
  • # 初始化天气标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  • tempzh = label.Label(font, text="晴", color=color)
  • tempzh.x = 110
  • tempzh.y = 140
  • group.append(tempzh)
  • # 显示修改后的图像组
  • display.show(group)
  • while True:
  • pass

本期的小作业是,尝试自己做一个背景图片,并修改天气时钟的排版。下期预告:如何制作CircuitPython的最小化中文字体,以及使用Pixso制作简单的背景图片。

资源文件_直接解压缩到CIRCUITPY磁盘即可.zip

121.71 KB, 下载次数: 90

最新回复

先加载图片,背景图片可以使用Pixso来制作一个240x135分辨率的图片,好吧   详情 回复 发表于 2023-10-5 10:09
点赞 关注
 
 

回复
举报

6713

帖子

10

TA的资源

版主

沙发
 

屏幕显示非常好,点赞!  

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

1717

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 

先加载图片,背景图片可以使用Pixso来制作一个240x135分辨率的图片,好吧

点评

怎么方便怎么来呀,背景图片没有中文,标签显示中文,还可以动态修改  详情 回复 发表于 2023-10-5 11:09
 
 
 

回复

254

帖子

2

TA的资源

纯净的硅(初级)

4
 
火辣西米秀 发表于 2023-10-5 10:09 先加载图片,背景图片可以使用Pixso来制作一个240x135分辨率的图片,好吧

怎么方便怎么来呀,背景图片没有中文,标签显示中文,还可以动态修改

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
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
快速回复 返回顶部 返回列表