【得捷电子Follow me第2期】+任务汇总 Adafruit ESP32-S3 TFT Feather 智慧物联网
Adafruit ESP32-S3 TFT Feather是一款基于ESP32-S3的甜品开发板,拥有Wifi功能及自带240x135屏幕,显示+网络+众多IO接口=无限可能!!
目录 (Table of Contents)
[TOCM]
第一部分
3-5分钟短视频
(https://training.eeworld.com.cn/video/38010 "【得捷电子Follow me第2期】+项目视频")
第二部分 任务/项目总结报告
任务一 控制屏幕显示中文
在Adafruit ESP32-S3 TFT Feather240x135屏幕上显示中文
需要font字体,及adafruit_display_text&adafruit_bitmap_font包
import board
import displayio
import adafruit_imageload
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
display = board.DISPLAY
board.DISPLAY.brightness = 0.35
board.DISPLAY.rotation = 0
image, palette = adafruit_imageload.load("/img/img0.bmp",bitmap=displayio.Bitmap, palette=displayio.Palette)
tile_grid = displayio.TileGrid(image, pixel_shader=palette)
group = displayio.Group()
group.append(tile_grid)
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
dis_str = "年月日小雪大雪晴"
font = bitmap_font.load_font("/fonts/sytq_16.pcf")
color = 0x4682B4
text_area = label.Label(font, text=screen_dispstr(dis_str), color=color)
text_area.x = 20
text_area.y = 60
text_area.line_spacing = 0.8
text_area.scale = 1
group.append(text_area)
display.show(group)
while True:
pass
我这里把windows系统桌面壁纸放上去了
效果如下
任务二 网络功能使用
###连接到WiFi
import os
import wifi
import board
import displayio
import adafruit_imageload
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
from adafruit_display_text.scrolling_label import ScrollingLabel
wifi.radio.start_scanning_networks()
wifi.radio.stop_scanning_networks()
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}")
text = os.getenv("WIFI_SSID") + "IP" + str(wifi.radio.ipv4_address)
type = bitmap_font.load_font("/fonts/DingTalk_ncn_60.pcf")
my_scrolling_label = ScrollingLabel(
type, text=text, max_characters=9, animate_time=0.3
)
my_scrolling_label.x = 10
my_scrolling_label.y = 60
group.append(my_scrolling_label)
display.show(group)
while True:
my_scrolling_label.update()
效果如下
###创建热点
import os
import wifi
import board
import displayio
import adafruit_imageload
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
from adafruit_display_text.scrolling_label import ScrollingLabel
wifi.radio.start_ap(os.getenv("AP_SSID"), os.getenv("AP_PASSWORD"))
text = os.getenv("AP_SSID")+""+ os.getenv("AP_PASSWORD")
type = bitmap_font.load_font("/fonts/DingTalk_ncn_60.pcf")
my_scrolling_label = ScrollingLabel(
type, text=text, max_characters=9, animate_time=0.3
)
my_scrolling_label.x = 5
my_scrolling_label.y = 60
group.append(my_scrolling_label)
display.show(group)
while True:
my_scrolling_label.update()
效果如下
手机可以连接WiFi热点
WIFI网络功能连接真是方便,两行代码就能解决全部问题,但是对隐藏网络不太友好,估计是库的问题,隐藏网络容易搜索不到
任务三 控制WS2812B
'''
Description:
Author: Manda
Version:
Date: 2027-02-10 11:31:24
LastEditors: Manda
LastEditTime: 2023-10-16 01:40:10
'''
import time
import board
import digitalio
import neopixel
button_pin = board.D5
Color_n = 0
RAINBOW_COLORS = [
(255, 0, 0),
(255, 165, 0),
(255, 255, 0),
(0, 255, 0),
(0, 0, 255),
(75, 0, 130),
(238, 130, 238)
]
Color = RAINBOW_COLORS[0]
button = digitalio.DigitalInOut(button_pin)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
debounce_delay = 0.1
button_pressed = False
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
pixel.brightness = 0.3
while True:
if not button.value and not button_pressed:
button_pressed = True
time.sleep(debounce_delay)
if not button.value:
Color = RAINBOW_COLORS[Color_n]
pixel.fill(Color)
Color_n += 1
if Color_n == 7:
Color_n -= 7
elif button.value:
button_pressed = False
效果如下
没有按钮只能用铜丝替代了,简直太惨了,还好,顺利触发
任务四 日历&时钟
import os
import wifi
wifi.radio.start_scanning_networks()
wifi.radio.stop_scanning_networks()
wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))
import os
import rtc
import wifi
import time
import ssl
import socketpool
import adafruit_requests
import board
import displayio
import adafruit_ntp
import adafruit_imageload
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
display = board.DISPLAY
display.brightness = 0.35
display.rotation = 0
image, palette = adafruit_imageload.load("/img/img0.bmp",bitmap=displayio.Bitmap, palette=displayio.Palette)
tile_grid = displayio.TileGrid(image, pixel_shader=palette)
group = displayio.Group()
group.append(tile_grid)
font = bitmap_font.load_font("/fonts/sytq_16.pcf")
nun_font = bitmap_font.load_font("/fonts/DingTalk_ncn_60.pcf")
color = 0xFFFFFF
date = label.Label(font, text="0", color=color)
date.x = 50
date.y = 30
group.append(date)
week = label.Label(font, text="0", color=color)
week.x = 150
week.y = 30
group.append(week)
timeL = label.Label(nun_font, text="00:00", color=color)
timeL.x = 10
timeL.y = 80
group.append(timeL)
temp = label.Label(font, text="28°", color=color)
temp.x = 70
temp.y = 140
group.append(temp)
tempzh = label.Label(font, text="晴", color=color)
tempzh.x = 110
tempzh.y = 140
group.append(tempzh)
display.show(group)
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
rtc.RTC().datetime = ntp.datetime
def get_wday(wday):
if (wday == 0):
return "周一"
elif (wday == 1):
return "周二"
elif (wday == 2):
return "周三"
elif (wday == 3):
return "周四"
elif (wday == 4):
return "周五"
elif (wday == 5):
return "周六"
elif (wday == 6):
return "周日"
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
JSON_TIME_URL = "http://t.weather.sojson.com/api/weather/city/101280601"
response = requests.get(JSON_TIME_URL)
weather = response.json()
city_weather = weather["data"]
forecast = city_weather['forecast']
response.close()
status = "boot"
while True:
t = time.localtime()
if (status == "boot" or t.tm_min == 0):
date.text = "%d月%d日" % (t.tm_mon, t.tm_mday)
week.text = get_wday(t.tm_wday)
str_t = city_weather['wendu']
str_tz = forecast[0]['type']
temp.text = "%s°" % (str_t)
tempzh.text = str_tz
status = "updated"
if (t.tm_sec % 2 == 0):
timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
timeL.color = 0xFFFFFF
else:
timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
timeL.color = 0xBBFFFF
display.show(group)
time.sleep(1)
效果如下所示
干到2点真不容易,终于完成了全部任务,总的来说Adafruit ESP32-S3 TFT Feather这块板子可玩性很好,唯一的缺点是发热量比较大,这次活动也受益匪浅,希望eeworld可以多举办一些这样的活动。
最后放一张原装与我自己DIY的Adafruit ESP32-S3 TFT Feather对比图
第三部分
##可编译下载的代码
代码,库,及资源全部放在了这个压缩包中
心得体会
我非常感谢得捷和电子工程世界举办这次令人难忘的活动。在这次Follow Me第二期中,我不仅学到了大量有关嵌入式系统的知识,还对ESP32-S3模块的功能有了更深入的了解。作为一名机械设计师,我原本专注于机械方面的工作,但我深知嵌入式系统与物联网是未来的发展方向。通过这次学习,我对将来的项目能够应用所学的知识充满信心。这次学习让我看到了机械设计与嵌入式系统相互融合的巨大潜力,我期待能在未来的工作中将这些知识应用到实际项目中。这次活动也有一个小遗憾,主办方错误评估了我们的热情,备货不足。发货太慢了,我自己DIY的同款板子都做了两三版,底层重新构造了一遍,得捷官方的板子还没发货。。尽管如此还是要感谢主办方给予我这个宝贵的学习机会!
End