[作品提交] 【得捷电子Follow me第2期】+ 任务一到任务四提交

eew_k1YzZm   2023-11-8 17:56 楼主

大家好,我是罗伊斯争第一,是一个正在读大四的硬件小白,本次很开心能参加得捷电子组织的followme第二期活动,希望能通过这次活动加深对于本次硬件板子esp32 s3的理解。


罗伊斯争第一_followme第二期_任务提交-罗伊斯争第一_followme第二期_任务提交-EEWORLD大学堂

【得捷电子Follow me第2期】任务1:使用CircuitPython控制屏幕,显示中文

完成屏幕的控制,并且能显示中文

搭配器件:Adafruit ESP32-S3 TFT

circuitpython使用起来非常方便。首先在adafruit网站上面下载对应本次板子版本的circuitpy安装包,下载后导入板子中。交替按下reset和boot按键,板子就开始烧录circuitpython啦。

烧录完成之后,界面如下: image.png   其中,code.py是主函数,我们只需要将代码写入code.py。将所需要的函数保存到lib文件夹内,板子就可以正常运行啦

由于板子无法直接显示.ttf的中文字体。为了显示中文,先从网上找到了wenquanyi_13px.pcf字体文件。在使用此点阵字体配置文件,显示中文如下图所示:

中文.jpg
import board
# 导入displayio库(内置的)
import displayio

# 导入外部库adafruit_imageload,如果没有就在教程附件下载
import adafruit_imageload
# 导入外部库adafruit_display_text里的lable,用于显示标签
from adafruit_display_text import label
# 导入外部库adafruit_bitmap_font里的lable
from adafruit_bitmap_font import bitmap_font#用于显示字体

# 使用固件自带的屏幕设备,不需要另行初始化屏幕参数
display = board.DISPLAY

# 创建本例程里的唯一图像组
group = displayio.Group()
font = bitmap_font.load_font("/font/wenquanyi_13px.pcf")
text_group = displayio.Group()
text = "你若安好,\n\n便是晴天"
#设置字体大小,位置
text_area = label.Label(bitmap_font.load_font("font\wenquanyi_13px.pcf"), text=text,color=0xfffccc,x=0,y=35,line_spacing=0.4,scale=4)

text_group.append(text_area)
display.show(text_group)

while True:
    pass

 

【得捷电子Follow me第2期】任务2:网络功能的使用

完成网络功能的使用,能够创建热点和连接到WiFi

搭配器件:Adafruit ESP32-S3 TFT Feather

首先是开热点:

使用 wifi.radio 函数

wifi.radio.start_ap("Mi11", "12345678")

print(f"Mi11")

print(f"PASSWORD: 12345678")

 

热点1.jpg
板子上面可以看到,热点的名字叫Mi11,密码为12345678
热点2.jpg

使用小米手机可以连上此热点,信号好,但是上不了网

接下来是使用板子连上互联网,在烧录了circuipython的情况下,我们只需要在settings.toml中输入我们想要链接的wifi账号和密码即可

image.png   点开settings文件,输入我们的账号密码:

image.png  

wifi 1.jpg  

可以看到,左上角显示出了ip地址,我们的板子成功连接上互联网啦

 

【得捷电子Follow me第2期】任务3:控制led灯闪烁

使用按键控制板载Neopixel LED的显示和颜色切换

搭配器件:Adafruit ESP32-S3 TFT Feather

本次使用的得捷电子的板子配备了led灯

想要控制led灯,就需要先定义颜色

from adafruit_led_animation.color import JADE, BLACK, ORANGE, GOLD, OLD_LACE,RED

然后我们初始化引脚和灯

pixel_pin = board.NEOPIXEL

num_pixels = 1

pixels = neopixel.NeoPixel(

    pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=neopixel.GRB

)

为了进行灯的颜色切换,故采用while循环的方式,按一下boot键,灯的颜色切换一次。

最终效果如下

 

while True:
    # 判断按键是否按下
    if not btn.value:
        # 若按键按下,则对led_color求余数,根据余数指定led颜色
        if led_color % 6 == 0:
            blink = Blink(pixels, speed=0.5, color=JADE)
            print("LED is JADE")
        elif  led_color % 6 == 1:
            blink = Blink(pixels, speed=0.5, color=ORANGE)
            print("LED is ORANGE")
        elif  led_color % 6 == 2:
            blink = Blink(pixels, speed=0.5, color=GOLD)
            print("LED is GOLD")
        elif  led_color % 6 == 3:
            blink = Blink(pixels, speed=0.5, color=OLD_LACE)
            print("LED is OLD_LACE")
        elif  led_color % 6 == 4:
            blink = Blink(pixels, speed=0.5, color=RED)
            print("LED is RED")
        elif  led_color % 6 == 5:
            blink = Blink(pixels, speed=0.5, color=BLACK)
            print("LED is BLACK")
        led_color = led_color + 1
    else:
        pass
    time.sleep(0.1) # sleep for debounce
    # 执行led闪烁动态效果
    blink.animate()

【得捷电子Follow me第2期】任务4-1:日历和时钟

分任务1:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息。

搭配器件:Adafruit ESP32-S3 TFT Feather

 

完成本任务需要在任务一显示文字的基础上增加任务二联网的功能,完成各项指标的实时更新。为此,先做出如下准备:

使用高德api进行天气的爬取,需要取得web天气服务的key

高德api.jpg

点击天气查询api,申请key,备用。

接下来即可开始完成任务。首先依据任务一的结论,创建组,并将地点,时间,天气的文字添加展示。

然后利用任务二的成果,连接wifi,利用ntp更新时间,输入自己所在的地区的城市id,获取天气和温度情况。

最后使用while循环将实时变化更新。

代码如下

import board
# 导入displayio库(内置的)
import displayio

# 导入外部库adafruit_imageload,如果没有就在教程附件下载
import adafruit_imageload
# 导入外部库adafruit_display_text里的lable,用于显示标签
from adafruit_display_text import label
# 导入外部库adafruit_bitmap_font里的lable
from adafruit_bitmap_font import bitmap_font#用于显示字体

# 使用固件自带的屏幕设备,不需要另行初始化屏幕参数
display = board.DISPLAY

# 创建本例程里的唯一图像组
group = displayio.Group()

# 加载图片
image, palette = adafruit_imageload.load("/pic/pic.png")
# 是否开启透明
palette.make_transparent(0)

# 创建图片布局
grid = displayio.TileGrid(image, pixel_shader=palette)

# 将图片布局添加到图像组,由于是第一个添加的,默认是最下层
group.append(grid)


# 加载字体并定义字体颜色为黑色
font = bitmap_font.load_font("/font/wenquanyi_13px.pcf")
nun_font = bitmap_font.load_font("/font/wenquanyi_13px.pcf")
color = 0x000000


# 初始化日期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
date = label.Label(font, text="11月7日", color=color,scale=2)
date.x = 20
date.y = 25
group.append(date)

# 初始化地点标签并设置x,y轴绘图坐标,然后将标签添加到图像组
location = label.Label(font, text="西安市长安区", color=color,scale=2)
location.x = 20
location.y = 50
group.append(location)

# 初始化星期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
week = label.Label(font, text="周二", color=color,scale=2)
week.x = 20
week.y = 75
group.append(week)

# 初始化温度标签并设置x,y轴绘图坐标,然后将标签添加到图像组
temp = label.Label(font, text="1°", color=color,scale=2)
temp.x = 20
temp.y = 100
group.append(temp)

# 初始化时间标签并设置x,y轴绘图坐标,然后将标签添加到图像组
timeL = label.Label(font, text="22:20", color=color,scale=2)
timeL.x = 60
timeL.y = 100
group.append(timeL)

# 初始化天气标签并设置x,y轴绘图坐标,然后将标签添加到图像组
tempzh = label.Label(font, text="晴", color=color,scale=2)
tempzh.x = 150
tempzh.y = 100
group.append(tempzh)

# 显示修改后的图像组
display.show(group)



# 导入os库,用来获取wifi信息
import os
# 导入rtc库,实现RTC时钟
import rtc
# 导入wifi、time库备用
import wifi
import time

# 导入网络库备用
import ssl
import socketpool
import adafruit_ntp

import adafruit_requests

# 使用os.getenv函数,从setting.toml文件里获取wifi ssid和密码
ssid = os.getenv("CIRCUITPY_WIFI_SSID")
password = os.getenv("CIRCUITPY_WIFI_PASSWORD")

# 连接到 wifi
print("Connecting to", ssid)
wifi.radio.connect(ssid, password)
print("Connected to", ssid)

# 使用adafruit_ntp.NTP函数初始化ntp服务,第一个函数是确定网络连接端口,
# 第二个函数设置时区,中国是+8时区,第三个函数用来指定ntp服务器地址
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")

# 使用ntp时间更新系统时间
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 "周四" ;nmj
    elif (wday == 4):
        return "周五"
    elif (wday == 5):
        return "周六"
    elif (wday == 6):
        return "周日"

# 初始化requests对象
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())

def get_weather():
    # 设置城市id
    city = "130102"
    # 这个函数使用的是高德API,使用该API需要先去注册相关账户,申请key。
    key = "29ef24130962cd634e531ab9299444c1"
    # 拼接天气链接url
    getweather_url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key
    # 获取天气json数据
    response = requests.get(getweather_url)
    json_resp = response.json()
    # 关闭连接
    response.close()
    # 解析json数据,并返回温度和天气信息
    for da in json_resp["lives"]:
        #print(da["temperature"])
        return da["temperature"], da["weather"]

# 先创建一个status变量,用来在设备启动时获取天气信息
status = "boot"

# 主循环
while True:
    # 每秒获取一次本地RTC时间
    t = time.localtime()
    # 首次启动或者本地RTC时间的分钟属性为0时,更新日期标签和天气标签
    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, str_tz =  get_weather()
        # 更新温度标签
        temp.text = "%s°" % (str_t)
        # 更新天气标签
        tempzh.text = str_tz
        status = "updated"
    # 每隔1秒 更新一次时钟标签,用于动态显示
    if (t.tm_sec % 2 == 0):
        timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
        timeL.color = 0x000000
    else:
        timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
        timeL.color = 0xD9D7C9
    # 刷新屏幕
    display.show(group)
    # 休眠1秒
    time.sleep(1)

心得体会:

本次followme活动,我使用了得捷电子的Adafruit ESP32-S3 TFT Feather板子完成了点亮,烧进python,控制屏幕显示中文,控制led灯闪烁,连接网络,制作天气日历的任务。

在任务一中,我学习了circuitpython的烧入方法和简单的语法,分清楚了ttf字体和点阵pcf字体的区别,最后成功在屏幕上面显示出中文文字。

在任务二中,我明白了Adafruit ESP32-S3 TFT Feather具有良好的网络性能,可以联网,开热点。

在任务三中,我成功点亮并控制了板子上led灯,学习了控制led灯闪烁的while循环语法

在任务四中,我总结上述任务成果,完成了天气日历。

在完成上述任务过程中,我获得了很多前辈们的悉心教导和鼓励,特别感谢 @walker2048 上传的教学视频,让我对于板子的功能有了更深的认识。

最后,感谢得捷电子和 eeworld 举办这次 followme 第二期活动

followme_罗伊斯争第一.rar (480.36 KB)
(下载次数: 4, 2023-11-8 19:29 上传)
本帖最后由 罗伊斯争第一 于 2023-11-9 16:09 编辑

回复评论 (2)

加油加油,我又开了个新坑,准备做esp32手表,V1版本开源了不建议打。建议等V2版本。

点赞 (1) 2023-11-9 11:18
引用: walker2048 发表于 2023-11-9 11:18 加油加油,我又开了个新坑,准备做esp32手表,V1版本开源了不建议打。建议等V2版本。

点赞  2023-11-9 16:09
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复