一、总结视频
二、任务总结报告
1.任务一控制屏幕显示中文
完成屏幕的控制,并且能显示中文
搭配器件:Adafruit ESP32-S3 TFT Feather
由于电脑上的字库文件非常大,而ESP32的内存容量就那么点,所以参考网上的大神们给出的方案,经过一波三折不是格式不对,就是转换出错再加上字体识别不成功,出现了一堆一堆的问题耗费了我很多很多的时间去寻找合适的字库文件。
我最终选择了使用FontForge将需要显示的字体进行打包,压缩之后转换成PCF文件导入进开发板。
这里放上FontForge的下载链接
https://fontforge.org/en-US/downloads/windows-dl/
我首先去谷歌的字体库(https://fonts.google.com/)下载了一个我喜欢的字体,经过测试,这个网站上ttf字体是可以顺利地转化为bdf的,但是有些网站上下载的ttf文件的字体是没办法转成bdf的,或者转成的bdf文件无法再进一步转换成pcf文件,且不可以被开发版识别。
这个字体文件是ttf格式的,CircuitPython无法识别,使用FontForge将ttf转化为bdf。然后打开https://adafruit.github.io/web-bdftopcf/将BDF转化为PCF文件,进一步缩小体积,在导入开发板的font文件夹中。
首先打开front forge。 在打开的时候导入TTF文件,点击Element菜单,选择Bitmap Strikes Available,选择X格式。 然后在输入最下方pixel那里输入你想要的字体大小。
然后再次点击element菜单。 打开Regenerate Bitmap Glyphs,点击OK。 然后回到主页点击file菜单,点击 Generate font生成字体文件,选择 No Outline Font和BDF,然后再选中你想生成的文件夹,这样就可以生成BDF字库文件了。
再然后打开:https://adafruit.github.io/web-bdftopcf/浏览刚才生成的PDF文件直接进行转换,浏览器会自动下载PCF格式的文件。
然后将它放进开发板的fonts文件夹中,这样就可以使用这个字库了,可以看到转换后的字体文件大小大概在800K左右,虽然有点大,但是可以覆盖很多很多的文字。对于我这种懒人来说非常舒服了。
然后就是显示代码了,搞定PCF字库文件以后,直接调用函数就可以在屏幕上显示文字了,字库文件反而是最麻烦的
import board
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# 使用固件自带的屏幕设备,不需要另行初始化屏幕参数
display = board.DISPLAY
# 创建本例程里的唯一图像组
group = displayio.Group()
# 加载字体并定义字体颜色
font = bitmap_font.load_font("/font/font-30.pcf")
color = 0x11ff11
date1 = label.Label(font, text="你好!", color=color)
date1.x = 80
date1.y = 30
group.append(date1)
date2 = label.Label(font, text="电子工程世界", color=color)
date2.x = 0
date2.y = 80
group.append(date2)
# 显示修改后的图像组
display.show(group)
while True:
pass
2.任务二 网络功能使用
完成网络功能的使用,能够创建热点和连接到WiFi
搭配器件:Adafruit ESP32-S3 TFT Feather
连接WIFI、创建热点可就是ESP32的强项,所以说操作起来还是非常简单的。
首先是创建热点,代码如下
import board
import os
import time
import ssl
import wifi
import socketpool
import microcontroller
import displayio
import adafruit_imageload
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
wifi.radio.start_ap("ESP32_wifi", "88888888")#创建热点,就一句话的事
display = board.DISPLAY
group = displayio.Group()
font = bitmap_font.load_font("/font/font-30.pcf")
#nun_font = bitmap_font.load_font("/font/font-30.pcf")
color = 0x11ff11
date1 = label.Label(font, text="ESP32_wifi", color=color)
date1.x = 0
date1.y = 30
group.append(date1)
date2 = label.Label(font, text="88888888", color=color)
date2.x = 0
date2.y = 80
group.append(date2)
display.show(group)
while True:
Pass
连接WIFI 配置settings.toml这个文件就可以了
从图中可以看到开发板已经连接至网络了,获得了一个IP地址:192.168.124.4。
3.任务三 控制WS2812B
使用按键控制板载Neopixel LED的显示和颜色切换
搭配器件:Adafruit ESP32-S3 TFT Feather
使用CircuitPython驱动WS2812B是非常简单的,只需要导入相应的几个库就行了。
通过内置的neopixel库,直接定义板载的WS2812灯珠,然后使用pixel.fill函数填充颜色数组就可以改变灯珠显示的颜色了。然后加入几个延时就可以,控制灯珠改变颜色的频率了。
代码如下
import time
import board
import neopixel
pixel = neopixel.NeoPixel(board.NEOPIXEL,1)
pixel.brightness = 0.1
while True:
time.sleep(0.02)
pixel.fill((255,0,0))
time.sleep(0.5)
pixel.fill((0,255,0))
time.sleep(0.5)
pixel.fill((0,0,255))
time.sleep(0.5)
4.任务四WS2812B效果控制
完成一个Neopixel(12灯珠或以上)控制器,通过按键和屏幕切换展示效果
搭配器件:Adafruit ESP32-S3 TFT Feather、可寻址RGB LED
正巧手里有一个16灯珠的WS2812B的灯板,索性就做了这一个小任务。 将开发版的D6接口接到了WS2812的数据口,然后给它通过USB供了一个五伏的电压。然后我们打开编辑器,接着上一节的代码导入button库。 然后新建一个图层用来在屏幕上显示灯珠的颜色。 这里使用的任务一的代码可以简单的显示一些中文字。
然后使用button库中的函数读取板载的按键的状态,当开发板进入程序之后,Boot键就可以当成正常的按键使用,这一点还是挺方便的。
然后在while循环中循环读取按键的信息,当检测到按键按下后改变灯珠的颜色,并显示在屏幕上,这样一来,整个任务就完成了。
下面是演示的实例和源代码。
import time
import board
import neopixel
import displayio
import digitalio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# 使用固件自带的屏幕设备,不需要另行初始化屏幕参数
display = board.DISPLAY
# 创建本例程里的唯一图像组
group = displayio.Group()
# 按键基础配置
button = digitalio.DigitalInOut(board.BUTTON)
button.switch_to_input(pull=digitalio.Pull.UP)
state = 0
# 加载字体并定义字体颜色
font = bitmap_font.load_font("/font/font-30.pcf")
pixel = neopixel.NeoPixel(board.D6, 16)
pixel.brightness = 0.1
while True:
if button.value == 0:
time.sleep(0.5)
state = state + 1
if (state == 3):
state = 0
if state == 0:
pixel.fill((255,0,0))
date = label.Label(font, text="灯是红色的", color=0x11ff11)
date.x = 50
date.y = 60
group = date
display.show(group)
if state == 1:
pixel.fill((0,255,0))
date = label.Label(font, text="灯是绿色的", color=0x11ff11)
date.x = 50
date.y = 60
group = date
display.show(group)
if state == 2:
pixel.fill((0,0,255))
date = label.Label(font, text="灯是蓝色的", color=0x11ff11)
date.x = 50
date.y = 60
group = date
display.show(group)
三、源代码文件
源码文件
心得体会
在得捷 Follow Me 2 活动中,通过使用 ESP32 单片机完成一系列任务,我收获颇丰。我深刻体验到了 ESP32 强大的多语言支持和易用性,为嵌入式系统的开发提供了便捷的解决方案。
通过这次活动,我对 ESP32 单片机有了更深刻的理解,不仅在技术应用上得到锻炼,也收获了对物联网、嵌入式系统开发的更多见解。这次经历让我对硬件开发和物联网领域的学习产生了浓厚的兴趣,我期待能在未来的学习和实践中不断挑战更多有趣的技术难题。感谢得捷为我们提供了这次宝贵的学习机会,让我更好地掌握了 ESP32 的应用和潜力。
|