得捷电子 Follow me 第2期任务提交——汇总!
[复制链接]
本帖最后由 pildio 于 2023-10-25 19:09 编辑
活动汇总
写在前面——————
大家好,很高兴这次能参加这次的DigiKey联合EEWORLD发起的Followme活动,作为一名大三的在校学生.....由于板卡一直缺货导致到手开发时间非常少再加上学校结课压力导致本次开发并不是顺风顺水,但是通过本次的学习我也了解到嵌入式开发不仅仅局限于学校讲的stm32 51单片机常用的C语言开发模式 python也是一种很不错的开发方式 相比C语言开发使用CircuitPython的开发更加高层次 我不需要考虑这个功能是通过那些结构实现的,只需要导入对应的包,通用实现方法即可实现该功能,给我一种写作文的流畅感!再次感谢EEWORLD给我这次学习机会!
快捷传送门——————
得捷电子 Follow me 第2期任务提交——开发环境的安装
得捷电子 Follow me 第2期任务提交——控制屏幕显示中文
得捷电子 Follow me 第2期任务提交——网络功能使用(必做任务)
得捷电子 Follow me 第2期任务提交——控制WS2812B(必做任务)
得捷电子 Follow me 第2期任务提交——日历&时钟(必做任务)
视频入口【得捷电子Follow me第2期】任务视频-EEWORLD大学堂
CircuitPython
先说说CircuitPython开发与C语言开发我认为最大的区别吧
1 首先一点就是他的快速启动并运行。创建一个文件,编辑你的代码,保存文件,它会立即运行。无需编译,无需下载,无需上传
这一点在写代码时尤为明显,在进行开发时如果使用C语言必须将文件完全编译生成二进制hex文件之后才能写入chip 但是CircuitPython可以做到通过REPL直接交互式编程
2 其次就是Adafruit 与CircuitPython之间的联动了
在平时开发用到各种模块一般都需要自己写入底层驱动就拿3原色led来说,我刚看到这个任务的时候以为要写各种通讯协议的那种,但是通过查找资料后发现,直接通过一个Adafruit的包即可实现各种底层控制!非常方便。
3 但是,万物不是绝对的CircuitPython作为python的分支语言国内能找到的学习资料非常少,大部分都需要对着英文啃生肉这点很难受希望官方尽快推出汉化版教程。
AdafruitESP32-S3TFTFeather
一块非常棒的开发板麻雀虽小五脏俱全上面的ESP32-S3更是让我垂涎叙旧,它集成了一个彩色TFT显示屏,具有良好的分辨率和显示效果。该开发板还具有WiFi和蓝牙功能,以及丰富的GPIO引脚,可用于连接和控制其他外部设备。AdafruitESP32-S3TFTFeather非常适合用于嵌入式系统开发、物联网应用和可视化交互项目。
任务__开发环境的安装
具体内容请看 https://bbs.eeworld.com.cn/thread-1260610-1-1.html
收到的开发板分为一下几种模式
出厂模式
UF2模式
Circuitpython运行模式
烧机模式
一:如图 我们收到的开发板处于出厂模式 首先上电 按下RES,在开发板启动过程中再次按下RES进入UF2固件模式
此时电脑中应显示一个名为FTHRS3BOOT的磁盘 从Feather ESP32-S3 TFT Download (circuitpython.org)下载固件(应下载UF2格式的文件)直接复制粘贴到FTHRS3BOOT磁盘中此时开发板进入烧机模式如图所示(文尾提供固件下载地址)
等待开发板再次重启后 显示的便是Circuitpython界面
我选用的开发工具为vscode+Circuitpython插件实现对开发板进行编程
在vscode界面点击 扩展 安装如下插件
然后将开发板连接到电脑上用vscode打开开发板u盘文件夹即可
在code.py文件下 输入如下代码(官方测试代码)
import board
import digitalio
import time
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = True
time.sleep(0.5)
led.value = False
time.sleep(0.5)
可以观察到如下情况 开发板重启后板上的红色LED开始闪烁。
任务__控制屏幕显示中文
具体内容请看: https://bbs.eeworld.com.cn/thread-1260617-1-1.html
因为要显示中文,所以字库文件是必不可少的 目前固件只能识别到bdf和pcf格式的字库,需要将ttf格式的字库转换为pcf格式的,这里需要用到一个字库转换工具otf2bdf,根据直播中老师的介绍讲解以及其他坛友分享的经验,找到了这个字典文件大小刚好很适合本次开发将会在文尾进行上传
通过下面的代码可以在屏幕上显示字库上的所有中文文字
首先是导入包 此处用到board displayio adafruit_display_text adafruit_bitmap_font 包
可以通过vscode的快捷键直接添加 具体步骤如下
按下键盘ctrl+shift+p在弹出的对话框输入 如下
便可以得到Circuitpython插件提供的自动安装包服务
代码如下 具体请看分p
import board
import displayio
from adafruit_display_text import label, wrap_text_to_lines
from adafruit_bitmap_font import bitmap_font
dis_str = "我是一条中文信息"
font = bitmap_font.load_font("wenquanyi_10pt.pcf")
color = 0x00FFFF
def screen_dispstr(str):
if board.DISPLAY.rotation % 180 == 0:
char_num = 23 # 横屏
else:
char_num = 13 # 竖屏
strbuf = ""
for i in range(len(str) / char_num):
strbuf = strbuf + str[i * char_num:(i + 1) * char_num] + "\n"
return strbuf
display = board.DISPLAY
board.DISPLAY.brightness = 0.35
board.DISPLAY.rotation = 0
text_group = displayio.Group()
text_area = label.Label(font, text=screen_dispstr(dis_str), color=color)
text_area.x = 2
text_area.y = 6
text_area.line_spacing = 0.8
text_area.scale = 1
text_group.append(text_area)
display.show(text_group)
while True:
pass
最后我们来看一下,完成效果。
然后通过下载学习老师提供的代码后学会了如何显示一张图片
image, palette = adafruit_imageload.load(
"images/ysqd.bmp", bitmap=displayio.Bitmap, palette=displayio.Palette
)
tile_grid = displayio.TileGrid(image, pixel_shader=palette)
group = displayio.Group()
group.append(tile_grid)
board.DISPLAY.show(group)
通过调用image中palette这个方法可以实现在屏幕上显示一张图片 本次学习还发现了老师藏的彩蛋怎么是 原神启动!
任务__网络功能使用
大家都说这个任务非常简单 但是对于我从来没有接触过python开发还是鼓捣了好一阵 本次提交将会比较基础 用来帮助0基础同学 希望各位评委海涵!
通过逛论坛得知联网功能我们可以通过两种方式实现
1 直接导入wifi包通过radio中的start_ap方法来调用wifi连接的方法 代码如下 wifi.radio.start_ap
2 在开发板文件夹下创建一个新文件命名为setting.toml 并用记事本打开 输入以下宏定义
# 配置wifi的ID名称
CIRCUITPY_WIFI_SSID = "你家的wifiid"
# 配置wifi密码,把你的wifi密码填到里面
CIRCUITPY_WIFI_PASSWORD = "你家的wifi密码"
#以下的定义经过测试不输入开发板也能完成连入wifi可不输入
# 配置网页工作流密码,这个千万不要改,除非你懂了
CIRCUITPY_WEB_API_PASSWORD = "ilfree"
# 配置网页工作流端口
CIRCUITPY_WEB_API_PORT = 80
使用第一种方法的总体代码如下
import os
import wifi
print("ESP32-S3 Station Test")
print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")
print("Available WiFi networks:")
for network in wifi.radio.start_scanning_networks():
print("\t%s\t\tRSSI: %d\tChannel: %d" % (str(network.ssid, "utf-8"),
network.rssi, network.channel))
wifi.radio.stop_scanning_networks()
print(f"Connecting to {os.getenv('WIFI_SSID')}")
wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))
print(f"Connected to {os.getenv('WIFI_SSID')}")
print(f"My IP address: {wifi.radio.ipv4_address}")
这种方法联网的优点如下
使用的包非常少 适合本开发板因为内存不大够
代码简单不需要新增文件 可移植性高
使用第二种方法的代码如下
import os
import time
import ssl
import wifi
import socketpool
import microcontroller
import adafruit_requests
# adafruit quotes URL
quotes_url = "https://www.bing.com"
os.getenv('CIRCUITPY_WIFI_PASSWORD'))
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
while True:
try:
# pings adafruit quotes
print("Fetching text from %s" % quotes_url)
# gets the quote from adafruit quotes
response = requests.get(quotes_url)
print("-" * 40)
# prints the response to the REPL
print("Text Response: ", response.text)
print("-" * 40)
response.close()
# delays for 1 minute
time.sleep(60)
# pylint: disable=broad-except
except Exception as e:
print("Error:\n", str(e))
print("Resetting microcontroller in 10 seconds")
time.sleep(10)
microcontroller.reset()
代码提供者:忙碌的死龙
本人才学短浅 部分代码我并没有看明白 还请大佬赐教整个while循环内的代码用途
本人采用第一种方法配置完显示屏的左上角显示出开发板连接的ip地址 如下图所示
任务__控制WS2812B
WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050 LED灯珠相同,每 个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内 部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致
每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示
使用CircuitPython进行点灯非常简单我们调用如下库即可import neopixel
编程步骤为
1 引入ws2812库import neopixel
2初始化显示屏
display = board.DISPLAY
group = displayio.Group()
rect = Rect(0, 0, display.width, display.height, fill=BLACK)
group.append(rect)
display.show(group)
3初始化 WS2812B LED
pixels = neopixel.NeoPixel(
board.NEOPIXEL, 1, brightness=0.2, auto_write=False, pixel_order=neopixel.GRB
)
主循环
while True:
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)
以上演示了如何使用 neopixel 库控制 WS2812B LED,通过循环方式切换 LED 的颜色。LED 的颜色可以循环切换为 红 绿 蓝 。实现流水灯颜色 如果控制操作点pixel.fill((x,y,z))的值可以得到各种各样的颜色!
任务__日历&时钟
要想实现日历时钟的获取可以通过第三方天气平台获取 通过申请api。获取到相关json数据后,就从json数据里解析温度和天气信息与时间信息 此处学习下来我还不太明白如何把获取到的json解析成数据这个测试代码部分参考坛友的。
import board
import digitalio
import time
import wifi
import os
import ssl
import socketpool
import adafruit_requests
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# 屏幕基础配置
display = board.DISPLAY
# 使用字体
font_file = "fonts/SJxinweibeijian-Regular-21.bdf"
font = bitmap_font.load_font(font_file)
# WiFi连接
wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))
# JSON获取
JSON_URL = "http://t.weather.itboy.net/api/weather/city/"+os.getenv("city")
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
response = requests.get(JSON_URL)
# JSON分析
weather = response.json()
cityInfo = weather['cityInfo']
city_weather = weather['data']
forecast = city_weather['forecast']
dis_str = ""+cityInfo['parent']+' '+cityInfo['city'] +' '+weather['time'][:11] + forecast[0]['week']
dis_str += '\n 空气质量:'+city_weather['quality'] +" " +forecast[0]['type']
dis_str += "\n 最"+forecast[0]['high']+' 最'+forecast[0]['low']
dis_str += "\n 湿度: "+city_weather['shidu']
# 屏幕显示
text_group = displayio.Group(scale=1,x=0,y=0,)
text_area = label.Label(font, text=dis_str, color=0xFFFFFF, x=10, y=25)
text_group.append(text_area) # Subgroup for text scaling
display.show(text_group)
while True:
pass
运行结果如下
该代码存在bug 并不能准确的定位我所在的城市 等时间充裕一定解决该问题!
|