应主办方要求,需要每个任务分别完成,所以再投一帖
对汇总帖感兴趣的可以移步 http://bbs.eeworld.com.cn/thread-1258882-1-1.html
在此再次感谢DigiKey和EEworld组织的Follow me 第2期活动,让我有机会零成本入门Adafruit ESP32-S3 TFT Feather
第一部分
汇报视频- 【得捷电子Follow me第2期】视频汇报-EEWORLD大学堂
第二部分
任务一 显示中文
说实话,我觉得这个任务的主要难点在于字体的制作
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/sh_20.pcf") #导入字体
def labletext(x, y, text, font=font, color=0xFFFFFF): #生成标签函数,默认字体为font,颜色为白
return label.Label(font, text=text, color=color, x=x, y=y)
text = labletext(45, 65, "你好,世界!")
group.append(text) #将文字的标签加入显示组
display.show(group) #让屏幕更新,显示显示组
while True: #有死循环界面才会一直保持
pass
效果如图:
照相技术不怎么好,请忽略
任务二 链接wifi&创建热点
这个任务很简单,甚至完全没有成就感
首先,连接wifi需要在settings.toml中写入以下内容,这样每次就会自己连接,不用在每个代码中操作
CIRCUITPY_WIFI_SSID = "你的wifi名称"
CIRCUITPY_WIFI_PASSWORD = "你的wifi密码"
第一次重启后往往连不上,不用急,重开三四次就会有了
左上角出现ip说明联网成功
创建热点则仅需要以下代码
import wifi
wifi.radio.start_ap('Follow_me_Task2', '88888888')#设置热点名称与密码
print("Hotspot Launched")#控制台提示,可以删除
#对,就这么简单
效果如下,能用手机搜出来即可
任务三 按键控制LED
终于出现了,看不懂的东西!
import board
import time
import neopixel
from digitalio import DigitalInOut, Direction, Pull
pixel_pin = board.NEOPIXEL
pixels = neopixel.NeoPixel(pixel_pin, 1, brightness=0.1, auto_write=False) #使用neopixel实例化控制灯
def pixelsetcolor(c):#因为反正就这一个像素,所以直接偷个懒写个换色方法
pixels[0] = c
pixels.show() #更新
btn = DigitalInOut(board.BOOT0)
btn.direction = Direction.INPUT # 这行和下一行我都不太明白具体是做什么,请大佬补充(
btn.pull = Pull.UP #好像是叫设置上拉,不过我没太理解
color = 0
while True: #主循环
if not btn.value: #btn.value在平常是1,按下时是0
if color % 8 == 0:
pixelsetcolor(0xFF0000)
print("Pixel is R")
elif color % 8 == 1:
pixelsetcolor(0x00FF00)
print("Pixel is G")
elif color % 8 == 2:
pixelsetcolor(0x0000FF)
print("Pixel is B")
elif color % 8 == 3:
pixelsetcolor(0xFFFF00)
print("Pixel is Yellow")
elif color % 8 == 4:
pixelsetcolor(0xFF00FF)
print("Pixel is Megenta")
elif color % 8 == 5:
pixelsetcolor(0x00FFFF)
print("Pixel is Cyan")
elif color % 8 == 6:
pixelsetcolor(0xFFFFFF)
print("Pixel is Light")
elif color % 8 == 7:
pixelsetcolor(0x000000)
print("Pixel is Dark")
color += 1
else:
pass
time.sleep(0.2)#有效点击间隔
效果如下,不过这个需要按按键所以详细效果请参考视频
任务四 分任务1 天气时钟
大任务简单说下结构:
图片背景和文字的显示方法差不多,不过需要一个加载图片的库
文字标签是可以更改文字的,可以利用这点来更新
使用网络相关功能校准时间以及获取天气
主循环内每秒更新一次时间,每小时更新一次天气等其他信息
import board, displayio
import rtc, wifi, ssl
import time as Time
import socketpool
import adafruit_imageload
import adafruit_ntp
import adafruit_requests
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
display = board.DISPLAY
group = displayio.Group()
def lableimage(path): #生成图片标签方法
image, palette = adafruit_imageload.load(path)
return displayio.TileGrid(image, pixel_shader=palette)
grid = lableimage("/img/ddw.png") #实例化图片标签
group.append(grid) #加入显示组
font = bitmap_font.load_font("/font/sytq_16.pcf") #导入字体
timef = bitmap_font.load_font("/font/time.bdf")
def labletext(x, y, text, font=font, color=0x000000): #生成文字标签方法
return label.Label(font, text=text, color=color, x=x, y=y)
#依次实例化并加入显示组
date = labletext(48, 20, "0月0日")
day = labletext(150, 20, "周八")
time = labletext(22, 58, "00:00", font=timef)
weather = labletext(12, 112, "?")
temp = labletext(198, 112, "00°")
group.append(date)
group.append(day)
group.append(time)
group.append(weather)
group.append(temp)
#从网上校准时间
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
rtc.RTC().datetime = ntp.datetime
#设置响应
requests = adafruit_requests.Session(pool, ssl.create_default_context())
def get_weather(): #获取时间方法
city = "120101" #地区代码,根据实际情况更改
key = "自行填写" #使用了高德的ipa,可以自行申请
url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key
response = requests.get(url)
json_resp = response.json()
response.close()
#返回温度和天气两个值
return json_resp["lives"][0]["temperature"], json_resp["lives"][0]["weather"]
days = ["周一","周二","周三","周四","周五","周六","周日"]
state = "init"
while True:
n = Time.localtime()
if (state == "init" or n.tm_min == 0):
#更新标签内容
date.text = "%d月%d日" % (n.tm_mon, n.tm_mday)
day.text = days[n.tm_wday]
t, w = get_weather()
weather.text = w
temp.text = "%s°" % (t)
state = "running"
#更新时间并显示
time.text = "%02d:%02d" % (n.tm_hour, n.tm_min)
display.show(group)
Time.sleep(1)
效果如图
第三部分
源码下载:download.eeworld.com.cn/detail/bjm212501/629534
提示:源码中的settings.toml需要自行更改;代码中填写的apikey已经失效,请自行申请,运行会报错KeyError: lives
心得体会、意见及建议
本次活动的adafruit板子使用了用途广泛的esp32,并且有非常完整的开发文档,为我们操作查错提供了很大的便利,唯一一点美中不足就是flash,装几个字库就没地方了哈哈哈。首次体验了针对化的python语言编程,操作简单,开放度高,学习性及可玩性强,非常感谢eeworld和digikey举办此次活动,并希望活动举办更多类似活动。