[作品提交] 【得捷电子Follow me第2期】项目汇总

xiushen   2023-11-13 14:35 楼主
第一部分:演示视频
lv_0_20231113135551

第二部分:项目总结
今天完成了本期活动的全部内容,这次活动使用的是Adafruit ESP32-S3 TFT开发板。使用Visual Studio Code编写代码,完成了开发工具的学习,
学会了烧录circuitpython来进行开发,学会屏幕上显示中文,了网络功能的使用、WS2812B灯的控制、互联网更新日历。
搭建编译环境
首先搭建编译环境,在官网上下载circuitpython文件。依次按rst与boot按键进入uf2模式。
image.png  
然后把circuitpython拖入到FTHRS3BOOT磁盘中就算完成了。
并在官网上下载Bundle for Version 8.x外置库文件。需要用到里面的库时需存入到ilb文件夹中。完成后就可以开始烧程序了。
141139auh8ztm0qmxtmt8q.png
【得捷电子Follow me第2期】任务1:
任务内容:控制屏幕,显示中文
  • 1、首先导入内置库”board” “displayio”和外置库”adafruit_display_text”、”adafruit_bitmap_font”。
import board
import displayio
from adafruit_display_text import label, wrap_text_to_lines
from adafruit_bitmap_font import bitmap_font

 

  • 2、分别设置字符串与显示屏的各参数。
# 设置要显示的字符串
dis_str = "很荣欣参\n加这次活动"
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
# 初始化显示屏
display = board.DISPLAY
board.DISPLAY.brightness = 0.35
board.DISPLAY.rotation = 0
# 加载字体和设置颜色
font = bitmap_font.load_font("wenquanyi_10pt.pcf")
color = 0x00FFFF
# 创建显示文本的组和标签
text_group = displayio.Group()
text_area = label.Label(font, text=screen_dispstr(dis_str), color=color)
text_area.x = 30
text_area.y = 20
text_area.line_spacing = 1
text_area.scale = 3
text_group.append(text_area)
display.show(text_group)
# 持续显示
while True:
    pass

 

  • 最后while死循环定格屏幕。
image.png  
【得捷电子Follow me第2期】任务2:网络功能的使用
任务内容:1、创建热点、让手机可以连接到热点。2、连接wifi或者手机创建的热点。
  • 1、创建热点
  • 一、调用外部库。
  • import os
    import wifi
    import adafruit_requests

     

  • 二、创建热点。并将调试信息显示在屏幕上以便于调试。
  1. print("ESP32-S3 Access Point Test")
    print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")
    wifi.radio.start_ap(os.getenv("AP_SSID"), os.getenv("AP_PASSWORD"))
    print(f"My SSID: {"esp32"}")
    print(f"My PASSWORD: {"987654321"}")
    while True:
        pass

     

  • 并且在settings.toml中输入我们想要创建的热点名称和密码即可。
image.png  
  • 屏幕上调试画面如下。
image.png  
  • 手机可以正常连接到热点。
image.png  
  • 2、连接wifi。
  • 只需要在settings.toml中输入我们想要链接的wifi账号和密码即可。
image.png  
  • 连接后屏幕上显示出了ip地址。
image.png  
【得捷电子Follow me第2期】任务3:控制led灯闪烁
任务:使用按钮控制WS2812B的颜色切换。
  • 1.调用外部库。
  1. import time
    import board
    import digitalio
    import neopixel

     

  • 2.然后定义WS2812B的颜色数组
RAINBOW_COLORS = [
    (255, 0, 0),     # 红
    (255, 165, 0),   # 橙
    (255, 255, 0),   # 黄
    (0, 255, 0),     # 绿
    (0, 0, 255),     # 蓝
    (75, 0, 130),    # 靛蓝
    (238, 130, 238)  # 紫
]

 

  • 3、其次我们定义引脚功能。完成按键逻辑功能,WS2812B的亮灭。
#初始为红
Color = RAINBOW_COLORS[0]
# 初始化btn按钮对象
button = digitalio.DigitalInOut(board.BOOT0)
# 设置btn引脚为输入
button.direction = digitalio.Direction.INPUT
# 设置btn引脚为上拉
button.pull = digitalio.Pull.UP
debounce_delay = 0.1  # 消抖延迟,单位为秒
button_pressed = False
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
pixel.brightness = 0.3

 

  • 4、最后采用while循环的方式读取按键,切换WS2812B颜色。
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_Num]
            # 设置led颜色
            pixel.fill(Color)
            Color_Num += 1
            if Color_Num == 7:
                Color_Num -= 7
    elif button.value:  # 按键未被按下
        button_pressed = False

 

image.png  
【得捷电子Follow me第2期】任务4-1:日历和时钟
任务内容:完成本任务需要在显示文字的基础上增加互联网的功能,完成天气与日历的实时更新。
  • 1.导入需要用到的库。
  1. 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#用于显示字体
    # 导入os库,用来获取wifi信息
    import os
    # 导入rtc库,实现RTC时钟
    import rtc
    # 导入wifi、time库备用
    import wifi
    import time
    # 导入网络库备用
    import ssl
    import socketpool
    import adafruit_ntp
    import adafruit_requests

     

  • 2、创建组储存时间地点等信息
# 使用固件自带的屏幕设备,不需要另行初始化屏幕参数
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)

 

  • 3、连接到wifi
# 使用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)

 

  • 4、借用高德开放平台的web服务,需要取得web天气服务的key。利用ntp更新时间,输入自己所在的地区的城市id,获取天气和温度情况
image.png  
# 使用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 "周四"
    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 = "420902"
    # 这个函数使用的是高德API,使用该API需要先去注册相关账户,申请key。
    key = "83e63e24774f7cdcc123e664f1a017a3"
    # 拼接天气链接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"

 

  • 5.最后使用while循环实时更新时间与天气。
# 主循环
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)

 

141139yxe4ws0kw7zok0ew.jpg
心得体会:
本次followme活动,我使用了得捷电子的Adafruit ESP32-S3 TFT Feather板子学会了烧录circuitpython来进行开发,学会了网络功能的使用、WS2812B灯的控制、互联网更新日历。
在任务一中,我学习了circuitpython的烧入方法和简单的语法,学会了导入外置库文件,最后成功在屏幕上面显示出中文文字。
在任务二中,我明白了Adafruit ESP32-S3 TFT Feather具有良好的网络功能,可以联网,开热点。
在任务三中,我成功点亮并控制了板子上led灯,并学会了控制led灯的颜色控制,学习了控制led灯闪烁的while循环语法
在任务四中,我总结上述任务成果,完成了互联网天气日历。
在完成上述任务过程中,我获得了很多前辈们的悉心教导和鼓励,特别感谢各位大佬上传的教学视频,让我对于esp32板子的功能有了更深的认识也对物联网有了更深的认识。
最后,感谢得捷电子和 eeworld 举办这次 followme 第二期活动
第三部分:可编译下载的代码
任务.7z (795.86 KB)
(下载次数: 3, 2023-11-13 14:25 上传)
本帖最后由 xiushen 于 2023-11-13 14:34 编辑

回复评论 (1)

感谢楼主的技术分享,先收藏起来学习学习,顶起来

点赞 (1) 2023-11-20 15:18
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复