【得捷电子Follow me第2期】任务1~4
[复制链接]
本帖最后由 隔壁小黑 于 2023-11-21 17:18 编辑
非常高兴能够参加得捷电子Follow me第2期的活动,我是通过B站UP忙碌的死龙了解到这次活动的,在活动结束前一天提交了活动申请,收货时间比较晚。由于一些个人原因,忘记提交作业了,官方还专门发短信提醒,现在把自己的成果展示一下,由于python是工作以后自学的,代码规范性很差,还请见谅。
内容一:演示视频
性格比较内向,还请大家见谅
Followme 第二期 自我介绍及成果展示- Followme 第二期 自我介绍及成果展示-EEWORLD大学堂
内容二:项目总结报告
一、 开发板介绍
使用的是ESP32 S-3 feather_TFT,拥有4MB falsh以及2M的内存,TYPE-C接口(之前买的ESP32开发板都是老的安卓口,还需要专门准备一条线),开发板带TFT屏幕和电源管理,使用起来方便了很多。
二、准备工作
在Feather ESP32-S3 TFT Download (circuitpython.org)下载了8.2.8的固件,使用乐鑫官方工具|乐鑫科技 (espressif.com.cn)下载了Flash工具烧录了固件。刷入bin固件后电脑出现的优盘图标,将uf2文件放入后重启却不能正常运行。最后发现是没有格式化,格式化后再次刷入bin并放置uf2文件后,板子能够正常运行CircuitPython了。因为英文不好,固件下载时语言选择了CHINESE(PINYIN),提示均是拼音,第一次有一种自己拼音也不好的感觉。
在Libraries (circuitpython.org)下载了对应版本的扩展库,方便自己往程序里面添加。
编译器是按照官方的推荐使用的MU编辑器下载 Mu (codewith.mu),刚开始因为没有看编辑器的官方文档,还比较怀念MicroPython能够一句一句调试的模式(自学的代码,掌握的不好,一句一句调试心里更有底),后面查询了官方文档,了解了在MU边界其界面点击串口,然后按两次ctrl+c进入REPL模式,就能查看库的帮助文档和一句一句调试代码了。
三、本项目将包括以下内容:
任务一、完成屏幕的控制,并且能显示中文
任务二、完成网络功能的使用,能够创建热点和连接到WiFi
任务三、使用按键控制板载Neopixel LED的显示和颜色切换
任务四、WS2812B效果控制——完成一个Neopixel(12灯珠或以上)控制器,通过按键和屏幕切换展示效果
任务一、完成屏幕的控制,并且能显示中文
字库直接使用群友发的字体包了,显示的是入门标准的hello world,通过这个任务主要完成了CircuitPython加库和查看帮助的方法,总体感觉和MicroPython比较相似。界面显示也是以图层为单位切换的。
import board
import displayio
from adafruit_display_text import label, wrap_text_to_lines
from adafruit_bitmap_font import bitmap_font
my_str="你好,世界"
display = board.DISPLAY
board.DISPLAY.brightness = 0.2#屏幕亮度
board.DISPLAY.rotation = 0#屏幕旋转
font = bitmap_font.load_font("lib/wenquanyi.pcf")#加载字体包
text_group = displayio.Group()
text_1 = label.Label(font, text=my_str, color=0xFF0000)
text_1.x = 0#起点偏移X
text_1.y = 5#起点偏移X
text_1.line_spacing = 1#行间距
text_1.scale = 1#字体大小
text_group.append(text_1)#添加字体
text_2 = label.Label(font, text=my_str, color=0x00FF00)
text_2.x = 0#起点偏移X
text_2.y = 25#起点偏移X
text_2.line_spacing = 1#行间距
text_2.scale = 2#字体大小
text_group.append(text_2)
text_3 = label.Label(font, text=my_str, color=0x0000FF)
text_3.x = 0#起点偏移X
text_3.y = 55#起点偏移X
text_3.line_spacing = 1#行间距
text_3.scale = 3#字体大小
text_group.append(text_3)
text_4 = label.Label(font, text=my_str, color=0xFFFFFF)
text_4.x = 0#起点偏移X
text_4.y = 100#起点偏移X
text_4.line_spacing = 1#行间距
text_4.scale = 4#字体大小
text_group.append(text_4)
display.show(text_group)
while True:
pass
任务二、完成网络功能的使用,能够创建热点和连接到WiFi
CircuitPython链接WiFi和创建热点特别方便,但是如果链接超时时会直接抛出异常,使用try、except的组合可以在没有对应热点的时候保证程序能够跑完。
import board
import wifi
#设置wifi和密码
SSID = "zhang"
PASSWORD = "z123456789"
#连接wifi
buf_number=0
#等待连接成功
print("Start linking wifi")
while buf_number<5:
print("the "+str(buf_number+1)+" time connection" )
try:
wifi.radio.connect(SSID, PASSWORD)
except:
pass
if wifi.radio.connected:#判断是否链接成功
print("Linking success")
print("IP:", wifi.radio.ipv4_address)
break
buf_number=buf_number+1
if buf_number==5:
print("Linking fail")
# 启动热点
AP_SSID = "AP_zhang"
print("Start AP")
wifi.radio.start_ap(AP_SSID, PASSWORD)
print("AP IP:",wifi.radio.ipv4_address_ap)
while True:
pass
任务三、使用按键控制板载Neopixel LED的显示和颜色切换
原理图中Boot按键是低电平有效,拉高电平,使用软件消抖0.1s,但是看大佬们的代码都不消抖。
import board
import neopixel
import keypad
import time
from digitalio import DigitalInOut, Direction, Pull
def Dispelling_trembling(IO_name, state): # 消抖
while 1:
if IO_name.value == state:
time.sleep(0.1)
if IO_name.value == state:
break
pixe = neopixel.NeoPixel(board.NEOPIXEL, 1) # 控制出口,灯的数量
pixe.brightness = 0.2 # 亮度
btn = DigitalInOut(board.BOOT0) # 使用Boot按键
btn.direction = Direction.INPUT
btn.pull = Pull.UP # 拉高电平
colors_buf = [(255, 0, 0), (255, 255, 0), (255, 0, 255), (0, 255, 255), (255, 255, 255)]
pixe[0] = (0, 0, 0)
a = 0
while 1:
print("Press the Boot key to switch colors")
Dispelling_trembling(btn, 0)
pixe[0] = colors_buf[a]
a = a + 1
if a == 5:
a = 0
Dispelling_trembling(btn, 1)
任务四、WS2812B效果控制——完成一个Neopixel(12灯珠或以上)控制器,通过按键和屏幕切换展示效果
使用的是24位WS2812B控制板,外接供电。因为需要连接的线比较少,控制板和ESP32 S-3 feather_TFT之间直接使用杜邦线连接。
按键效果是不按Boot键流水灯正转,屏幕显示正转;按下Boot键流水灯反转,屏幕显示反转。本来想做一个漂亮的流水灯,最后只能说是一个流水灯,和想象的差距还是挺大的。
import board
import neopixel
import keypad
import time
from digitalio import DigitalInOut, Direction, Pull
#显示汉字
import displayio
from adafruit_display_text import label, wrap_text_to_lines
from adafruit_bitmap_font import bitmap_font
stop_str="正转"
start_str="反转"
display = board.DISPLAY# 使用固件自带的屏幕设备
board.DISPLAY.brightness = 0.2#屏幕亮度
font = bitmap_font.load_font("lib/wenquanyi.pcf")#加载字体包
stop_group = displayio.Group()# 创建图层
start_group = displayio.Group()# 创建图层
stop_text= label.Label(font, text=stop_str, color=0xFF0000)
stop_text.x = 50#起点偏移X
stop_text.y = 60#起点偏移X
stop_text.line_spacing = 1#行间距
stop_text.scale = 4#字体大小
stop_group.append(stop_text)#添加字体
start_text= label.Label(font, text=start_str, color=0x00FF00)
start_text.x = 50#起点偏移X
start_text.y = 60#起点偏移X
start_text.line_spacing = 1#行间距
start_text.scale = 4#字体大小
start_group.append(start_text)#添加字体
def Dispelling_trembling(IO_name, state): # 消抖
if IO_name.value == state:
time.sleep(0.1)
if IO_name.value == state:
return True
return False
pixe = neopixel.NeoPixel(board.A0,24)#控制出口,灯的数量
pixe.brightness=0.2# 亮度
#设置按键
btn = DigitalInOut(board.BOOT0) # 使用Boot按键
btn.direction = Direction.INPUT
btn.pull = Pull.UP# 拉高电平
stop_buf=True
btn_buf=True
while 1:
buf=btn.value
buf_led=[(0,0,0)]*24#颜色缓存数组
pixe.fill((0,0,0))#清空
if buf:
display.show(stop_group)#正转
else:
display.show(start_group)#反转
while btn.value==buf:
a=0
while a<24:
#颜色数组变化
buf_led.pop()
if a<8:
buf_1=(a*32,0,0)
elif a<16:
buf_1=(255,(a-8)*32,0)
else:
buf_1=(255,255,(a-16)*32)
buf_led.insert(0,buf_1)
#给24个灯设置颜色
for i in range(0,24):
if buf:
pixe[i]=buf_led[i]
else:
pixe[i]=buf_led[23-i]
a=a+1
if btn.value!=buf:
break
time.sleep(0.1)
四、活动体验
非常感谢EEWORLD给予的课程资源和活动资源,让我有了一个学习CircuitPython的机会。ESP32 S-3 feather_TFT板子功能也很全面,平时做个小玩具资源完全够用。
CircuitPython和MicroPython相比,中文资料还是太少了,对于英文不好的我来说查阅相关资料的难度还是大一点。自己的查找资料的能力和写代码的能力还是比较弱。
内容三:可编译下载的代码:
源码、库以及字体文件:EEWORLD下载中心
|