首先感谢活动主办方得捷电子和eeworld,让我们有机会体验最新的电子产品,领略电子技术的魅力。
本项目包括以下内容:
任务1:控制屏幕显示中文(必做任务)
完成屏幕的控制,并且能显示中文
搭配器件:Adafruit ESP32-S3 TFT Feather
任务2:网络功能使用(必做任务)
完成网络功能的使用,能够创建热点和连接到WiFi
搭配器件:Adafruit ESP32-S3 TFT Feather
任务3:控制WS2812B(必做任务)
使用按键控制板载Neopixel LED的显示和颜色切换
搭配器件:Adafruit ESP32-S3 TFT Feather
任务4:从下方5个分任务中选择1个感兴趣的完成即可(必做任务)
■ 分任务1:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息
建议搭配器件:Adafruit ESP32-S3 TFT Feather
任务/项目总结报告:
软件部分:
这款开发板支持python语言编程,可以只借助浏览器提供的ide进行编程和调试,通过浏览器修改code.py文件并保存,即可完成程序编写。
相比传统的单片机和嵌入式微处理器,这款开发板的编程方式更加方便快捷。
任务1:控制屏幕显示中文(必做任务)
完成屏幕的控制,并且能显示中文
搭配器件:Adafruit ESP32-S3 TFT Feather
项目使用板载屏幕进行中文显示,中文字符的显示需要借助中文字库实现,本项目中使用自制的字库完成。
使用板载资源需要载入board库,显示功能使用display库实现。设置好显示参数后即可使用display.show函数实现显示字符。
字库可以根据实际需要显示的字符进行裁剪,降低字库文件大小,从而确保程序空间足够使用。
代码如下:
import board
import displayio
from adafruit_display_text import label, wrap_text_to_pixels
from adafruit_bitmap_font import bitmap_font
str2display="任务1:控制屏幕显示中文\n出新意与法度之中\n寄妙理于豪放之外\n所谓游刃有余\n运斤成风"
display = board.DISPLAY
board.DISPLAY.brightness = 0.6
font = bitmap_font.load_font("opposans_m_12.pcf")
color = 0xFF7500
background_color = 0x000000
text_group = displayio.Group()
text_area = label.Label(font, text="\n".join(wrap_text_to_pixels(str2display,16)), color=color, background_color=background_color)
text_area.x = 2
text_area.y = 10
text_area.line_spacing = 1.1
text_area.scale = 1
text_group.append(text_area)
display.show(text_group)
while True:
pass
演示效果如图:
通过本任务的实验,使我更加清晰地理解字符显示的原理,为后续项目开发提供思路。
任务2:网络功能使用(必做任务)
完成网络功能的使用,能够创建热点和连接到WiFi
搭配器件:Adafruit ESP32-S3 TFT Feather
项目通过连接热点实现网络访问,设备连接热点后获取IP地址和相关网络配置信息,从而实现设备的网络联机。
网络功能的使用可以使板子连接上互联网,进而与互联网进行交互拓展。
程序主要需要wifi、ssl、socketpool等库实现,数据请求需要使用adafruit_requests库实现。
代码如下:
secrets = {
'ssid' : 'hiabia',
'password' : '85523425d6134',
'timezone' : "Asia/Shanghai"
}
import wifi
import ssl
import socketpool
import adafruit_requests
import time
wifi.radio.connect(secrets["ssid"], secrets["password"])
print("Connected to {}!".format(secrets["ssid"]))
print("IP:", wifi.radio.ipv4_address)
# 请求URLs
TEXT_URL = "http://wifitest.adafruit.com/testwifi/index.html"
JSON_TIME_URL = "http://quan.suning.com/getSysTime.do"
print("ESP32-S2 WebClient Test")
print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
print(f"Fetching text from {TEXT_URL}")
response = requests.get(TEXT_URL)
print("-" * 40)
print(response.text)
print("-" * 40)
print()
time.sleep(3)
print(f"Fetching and parsing json from {JSON_TIME_URL}")
response = requests.get(JSON_TIME_URL)
print("-" * 40)
print(f"Time: {response.json()['sysTime2']}")
print("-" * 40)
print("Done")
演示效果如图:
通过连接wifi、开启热点等功能的使用,让我们更清晰地理解该开发板的网络连接使用方法,为后续物联网相关功能的开发提供基础。
任务3:控制WS2812B(必做任务)
使用按键控制板载Neopixel LED的显示和颜色切换
项目程序须载入board、time、neopixel等库,board库实现板载资源的相关功能,time库实现时间数据的处理,neopixel库实现ws2812b的控制。
通过配置ws2812b的亮度信息、三原色信息从而可以调用fill函数实现指定颜色的亮灭,效果非常棒。
搭配器件:Adafruit ESP32-S3 TFT Feather
代码如下:
import time
import board
import neopixel
import touchio
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
pixel.brightness = 0.3
touch_A1 = touchio.TouchIn(board.D5)
# touch_A2 = touchio.TouchIn(board.D10)
touch_A3 = touchio.TouchIn(board.D12)
grape = (190, 75, 219)
teal = (56, 217, 169)
red = (20, 100, 219)
while True:
if touch_A1.value:
pixel.fill(grape)
time.sleep(0.05)
# if touch_A2.value:
# pixel.fill(teal)
# time.sleep(0.05)
if touch_A3.value:
pixel.fill(red)
time.sleep(0.05)
演示效果如图:
WS28212B控制LED颜色的功能使用,可以更深刻地理解通信协议、IO接口的相关功能,通过使用WS2812B可以更加精确可靠地控制灯光,降低代码调试的难度,提高开发效率。
任务4:从下方5个分任务中选择1个感兴趣的完成即可(必做任务)
我选择的是分任务1:
■ 分任务1:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息
项目基于板载屏幕进行时间、日期和天气的显示,调用第三方天气服务接口从而获取实时的天气数据。
使用time库管理时间信息,最后,使用一个while循环进行数据信息的定时刷新。
建议搭配器件:Adafruit ESP32-S3 TFT Feather
代码如下:
import board
import rtc
import wifi
import adafruit_ntp
import os
import ssl
import time
import displayio
import terminalio
import socketpool
import adafruit_requests
from adafruit_display_text import bitmap_label, label
DATA_SOURCE = "http://api.seniverse.com/v3/weather/now.json?key=SG-nLPzA3pyLEy9Tw&location=tianjin&language=en&unit=c"
# --| User Config |--------------------------------
TZ_OFFSET = 8 # time zone offset in hours from UTC
NEO_PIN = board.NEOPIXEL # neopixel pin
NEO_CNT = 1 # neopixel count
# -------------------------------------------------
# Set up TFT display
display = board.DISPLAY
board.DISPLAY.brightness = 0.55
board.DISPLAY.rotation = 0
group = displayio.Group()
time_color = 0xFF0000
weather_color = 0x00FF00
time_area = label.Label(terminalio.FONT, text="Hello", color=time_color)
time_area.x = 2
time_area.y = 10
time_area.line_spacing = 0.8
time_area.scale = 1
weather_area = label.Label(terminalio.FONT, text="Weather", color=weather_color)
weather_area.x = 2
weather_area.y = 30
weather_area.line_spacing = 0.8
weather_area.scale = 1
main_group = displayio.Group()
main_group.append(group)
main_group.append(time_area)
main_group.append(weather_area)
# Show the main group on the display
display.show(main_group)
# Connect to local network
wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD"))
print("Wifi connected.")
# Get current time using NTP
print("Fetching time from NTP.")
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, server="ntp.aliyun.com", tz_offset=TZ_OFFSET)
rtc.RTC().datetime = ntp.datetime
#
requests = adafruit_requests.Session(pool, ssl.create_default_context())
# Define time interval between requests
time_interval = 3000 # set the time interval to 30 minutes
# Wait for wake up time
now = time.localtime()
print("Current time: {:2}:{:02}:{:02}".format(now.tm_hour, now.tm_min, now.tm_sec))
response = requests.get(DATA_SOURCE)
while True:
# Fetch weather data from 心知 API
print("Fetching json from", DATA_SOURCE)
if now.tm_sec == 10:
response = requests.get(DATA_SOURCE)
print(response.json())
# Extract temperature and weather condition data from API response
current_temp = response.json()["results"][0]["now"]["temperature"]
current_weather_condition = response.json()["results"][0]["now"]["text"]
current_city = response.json()["results"][0]["location"]["name"]
print("Weather condition: ", current_weather_condition)
time_area.text = "Hello EEWorld\nTime is {:2}:{:02}:{:02}".format(
now.tm_hour, now.tm_min, now.tm_sec
)
weather_area.text="City: " + current_city+"\n"\
+"Temperature: {}".format(current_temp)+"\n"\
+"Weather: "+ current_weather_condition
# just sleep until next time check
time.sleep(0.5)
now = time.localtime()
演示效果如图:
该任务是一个相对综合应用的任务,分别使用了网络连接、数据请求、界面显示等功能,可以很好地锻炼代码编写。
在项目的各项任务完成过程中,还学习了图片显示、触摸按键等功能,体验到了这款板子的强大功能,希望得捷电子和电子工程世界官方可以继续多举办类似活动,带领更多电子爱好者体验电子的乐趣。
可编译下载的代码:
最后,项目代码如下:
本帖最后由 louislouis 于 2023-10-15 09:53 编辑