必做任务1:控制屏幕显示中文
本次任务控制板子自带的屏幕显示的中文,所以需要加载字体文件, 不过我还用到了读取 MCP9808 温度传感器和光敏传感器的数据,显示在屏幕上,并将温度数据写入 SD 卡中的temp.txt文件
使用的硬件要求:
官方文档接线方式
下边读取光敏感应器的值和海内存知己,天涯若比邻的文字效果图, 不过主要代码用显示的库加载经过压缩处理的字体文件, 具体操作可以看下方分享贴:
但是有个问题温度传感器和读取sd卡线插法检查多次, 但是读取sd卡库反馈no sdcard异常有点奇怪
最关键代码,写入温度数据和光敏传感器值到 SD 卡:使用 open 函数以写入模式打开 /sd/temp.txt 文件,将整个温度数据数组以每行一个值的方式写入文件。同时,将光敏传感器的值更新到显示文本标签, 其他代码是初始化传感器的引脚变量,挂载SD 卡, 将读取值显示屏幕上功能, 具体完整代码见结尾下方任务一的分享贴
temperature_data = [] # 用于存储温度数据的数组
while True:
# 等待一段时间,避免刷新过快导致占用过多资源
tempC = mcp.temperature
tempF = tempC * 9 / 5 + 32 # 转换成 F
temp_label.text = str(tempC)
print("Temperature: {} C {} F".format(tempC, tempF))
display.show(group)
temperature_data.append(tempF) # 将温度数据添加到数组中
with open("/sd/temp.txt", "w") as f:
# 将整个数组写入文件,每个温度值占一行
f.write("\n".join(map(str, temperature_data)))
time.sleep(2)
任务2:网络功能使用
使用的硬件要求: ESP32-S3开发板
本次任务通过开发板创建热点, 供手机连接, 修改项目里settings.toml文件, 设置连接家里wifi名和wifi密码, 导入wifi库, 设置热点名为ESP32-S3, 让手机连接测试
测试成功
主要代码:
# settings.toml文件
CIRCUITPY_WIFI_SSID = "l_home"
CIRCUITPY_WIFI_PASSWORD = "159753@"
CIRCUITPY_WEB_API_PASSWORD = "123456"
CIRCUITPY_WEB_API_PORT = 80
import wifi
def run():
print('===============================')
wifi.radio.start_ap('ESP32-S3', '12345678@')
print('=============================== ')
run()
任务3:控制WS2812B
使用的硬件要求: ESP32-S3开发板
本次任务是通过板子的按键控制板子上唯一的一个灯珠的颜色变化, 但是板子有两个按键,一个是Rst, 另一个是Boot, 所以采用Boot键
通过按下Boot键切换不同颜色的灯, 拇指每按一下,切换数组的索引index, 相当于变换颜色值,也可以随机索引(随机换颜色)
主要代码:
import time
import board
import digitalio
import neopixel
import random
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
# 初始化btn按钮对象
btn = digitalio.DigitalInOut(board.BOOT0)
# 设置btn引脚为输入
btn.direction = digitalio.Direction.INPUT
# 设置btn引脚为上拉
btn.pull = digitalio.Pull.UP
# 红 绿 蓝 黄 白
colorArr = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 255, 255)]
index = 0
while True:
if not btn.value:
# 从colorArr中索引顺序切换颜色
if index == len(colorArr) - 1:
index = 0
else:
index = index+1
# pixel.fill(random.choice(colorArr)) # 从colorArr中随机选择一个颜色
pixel.fill(colorArr[index])
time.sleep(0.5)
else:
# 按键未按下时
pass
任务4:日历和时钟
使用的硬件要求: ESP32-S3开发板
本次任务基于ESP32-S3联网请求天气API和NTP服务器, 用于屏幕上显示现在的日期、时间和天气信息状况
最关键的是初始化NTP和RTC,使用`socketpool`和`adafruit_ntp`,从阿里云NTP服务器获取时间, 然后用`adafruit_requests`初始化HTTP请求, 请求高德地图天气信息的API,处理JSON响应数据获取温度、天气和城市信息,不过请求参数问题可以用postman去测试一下接口
# 导入内置库
import board
import displayio
import os
import rtc
import wifi
import time
# 导入显示库
import adafruit_imageload
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# 导入网络相关库
import ssl
import socketpool
import adafruit_ntp
import adafruit_requests
def run():
# 图像组实例对象
display = board.DISPLAY
group = displayio.Group()
# 加载背景图
image, palette = adafruit_imageload.load("/image/bg.png")
palette.make_transparent(0)
grid = displayio.TileGrid(image, pixel_shader=palette)
group.append(grid)
display.show(group)
# 设置字体大小和颜色
font = bitmap_font.load_font("/font/simhei_16.pcf")
nun_font = bitmap_font.load_font("/font/hei_60.pcf")
color = 0xFFFFFF
# 日期标签
date = label.Label(font, text="", color=color)
date.x = 0
date.y = 30
group.append(date)
# 星期标签
week = label.Label(font, text="", color=color)
week.x = 100
week.y = 30
group.append(week)
# 温度标签
temp = label.Label(font, text="", color=color)
temp.x = 150
temp.y = 30
group.append(temp)
# 天气标签
weatherLabel = label.Label(font, text="", color=color)
weatherLabel.x = 190
weatherLabel.y = 30
group.append(weatherLabel)
# 时分标签
timeLabel = label.Label(nun_font, text="", color=color)
timeLabel.x = 20
timeLabel.y = 80
group.append(timeLabel)
# 显示修改后的图像组
display.show(group)
# 连接到wifi
ssid = os.getenv("CIRCUITPY_WIFI_SSID")
password = os.getenv("CIRCUITPY_WIFI_PASSWORD")
wifi.radio.connect(ssid, password)
print("wifi success", ssid)
# adafruit_ntp库初始化网络, 时区, ntp地址
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
# 设置连接阿里云的ntp服务器时间
rtc.RTC().datetime = ntp.datetime
# 初始化requests对象,用来请求http的接口
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
# 格式化星期
def get_weekday(index):
arr = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
return arr[index]
# 获取参数配置
CITY_CODE = os.getenv("CIRCUITPY_CITY_CODE")
GAODE_KEY = os.getenv("CIRCUITPY_GAODE_KEY")
def get_weather_info():
# 拼接接口参数
weather_url_api = f"https://restapi.amap.com/v3/weather/weatherInfo?city={CITY_CODE}&key={GAODE_KEY}"
# 请求数据
response = requests.get(weather_url_api)
json_resp = response.json()
response.close() # 关闭连接
# 解析json数据
for key in json_resp["lives"]:
return key["temperature"], key["weather"], key["city"]
# 创建开始状态
status = "start"
while True:
# 每秒获取一次本地RTC时间
t = time.localtime()
# 首次启动或者本地RTC时间的分钟属性为0时,更新日期标签和天气标签
if (status == "start" or t.tm_min == 0):
# 更新日期
date.text = "%d月%d日" % (t.tm_mon, t.tm_mday)
week.text = get_weekday(t.tm_wday)
# 更新天气信息接口
temp_text, weather_text, city = get_weather_info()
temp.text = "%s°" % (temp_text)
weatherLabel.text = weather_text
print("date: ", date.text, week.text)
print("city temp weather: ", city, "%s°" % (temp_text), weather_text)
status = "end"
# 每隔1秒 更新一次时钟标签
if (t.tm_sec % 2 == 0):
timeLabel.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
else:
timeLabel.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
display.show(group)
time.sleep(1)
汇总帖
【得捷电子Follow me第2期】任务1:控制屏幕显示中文 https://bbs.eeworld.com.cn/thread-1262971-1-1.html
【得捷电子Follow me第2期】任务1:控制屏幕显示温度写入sd卡 https://bbs.eeworld.com.cn/thread-1263339-1-1.html
【得捷电子Follow me第2期】任务2:网络功能使用 https://bbs.eeworld.com.cn/thread-1262972-1-1.html
【得捷电子Follow me第2期】任务3:控制WS2812B https://bbs.eeworld.com.cn/thread-1262952-1-1.html
【得捷电子Follow me第2期】任务4:日历和时钟 https://bbs.eeworld.com.cn/thread-1263250-1-1.html
总结
总之,ESP32-S3开发板是一款功能强大、灵活多变的开发板,它可以快速实现各种应用场景,并且具有良好的扩展性和可定制性。
感谢EEWORLD社区举办的这次Follow Me活动, 虽然本职业是web开发者,发货时间有点紧, 但通过本次活动的学习和实践,在这里结识了一批志同道合的伙伴,相互交流,共同成长。我了解circuitpython环境的下python的使用和一些常用库的调用, 帮助我更好地操作开发板上的功能 期待下一次活动的到来。
内容三:可编译下载的代码
下载的压缩包里已经包含背景图,字体,库
https://download.eeworld.com.cn/detail/ltand/629885