747|3

6

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子Follow me第2期】+任务汇总 Adafruit ESP32-S3 TFT Feather 智慧物联网 [复制链接]

 

【得捷电子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包

  1. #导入库文件
  2. import board
  3. import displayio
  4. import adafruit_imageload
  5. from adafruit_display_text import label
  6. from adafruit_bitmap_font import bitmap_font
  7. # 初始化显示屏
  8. display = board.DISPLAY
  9. board.DISPLAY.brightness = 0.35
  10. board.DISPLAY.rotation = 0
  11. #加载图片
  12. image, palette = adafruit_imageload.load("/img/img0.bmp",bitmap=displayio.Bitmap, palette=displayio.Palette)
  13. tile_grid = displayio.TileGrid(image, pixel_shader=palette)
  14. group = displayio.Group()
  15. #将图像加入组中
  16. group.append(tile_grid)
  17. def screen_dispstr(str):
  18. # 根据屏幕旋转角度确定每行显示的字符数
  19. if board.DISPLAY.rotation % 180 == 0:
  20. char_num = 23# 横屏
  21. else:
  22. char_num = 13# 竖屏
  23. strbuf = ""
  24. for i in range(len(str) / char_num):
  25. # 将字符串按每行字符数拆分,并添加换行符
  26. strbuf = strbuf + str[i * char_num:(i + 1) * char_num] + "\n"
  27. return strbuf
  28. # 设置要显示的字符串
  29. dis_str = "年月日小雪大雪晴"
  30. # 加载字体和设置颜色
  31. font = bitmap_font.load_font("/fonts/sytq_16.pcf")
  32. color = 0x4682B4
  33. # 创建显示文本的组和标签
  34. text_area = label.Label(font, text=screen_dispstr(dis_str), color=color)
  35. #设置文本位置
  36. text_area.x = 20
  37. text_area.y = 60
  38. text_area.line_spacing = 0.8
  39. text_area.scale = 1
  40. #将文字加入组中
  41. group.append(text_area)
  42. display.show(group)
  43. # 持续显示
  44. while True:
  45. pass

我这里把windows系统桌面壁纸放上去了

效果如下

任务二 网络功能使用

###连接到WiFi

  1. import os
  2. import wifi
  3. import board
  4. import displayio
  5. import adafruit_imageload
  6. from adafruit_display_text import label
  7. from adafruit_bitmap_font import bitmap_font
  8. from adafruit_display_text.scrolling_label import ScrollingLabel
  9. #扫描Wifi
  10. wifi.radio.start_scanning_networks()
  11. #停止扫描Wifi
  12. wifi.radio.stop_scanning_networks()
  13. #连接Wifi
  14. wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))
  15. print(f"Connected to {os.getenv('WIFI_SSID')}")
  16. print(f"My IP address: {wifi.radio.ipv4_address}")
  17. text = os.getenv("WIFI_SSID") + "IP" + str(wifi.radio.ipv4_address)
  18. type = bitmap_font.load_font("/fonts/DingTalk_ncn_60.pcf")
  19. #滚动播放
  20. my_scrolling_label = ScrollingLabel(
  21. type, text=text, max_characters=9, animate_time=0.3
  22. )
  23. my_scrolling_label.x = 10
  24. my_scrolling_label.y = 60
  25. group.append(my_scrolling_label)
  26. display.show(group)
  27. while True:
  28. my_scrolling_label.update()

效果如下

###创建热点

  1. import os
  2. import wifi
  3. import board
  4. import displayio
  5. import adafruit_imageload
  6. from adafruit_display_text import label
  7. from adafruit_bitmap_font import bitmap_font
  8. from adafruit_display_text.scrolling_label import ScrollingLabel
  9. #创建热点
  10. wifi.radio.start_ap(os.getenv("AP_SSID"), os.getenv("AP_PASSWORD"))
  11. text = os.getenv("AP_SSID")+""+ os.getenv("AP_PASSWORD")
  12. type = bitmap_font.load_font("/fonts/DingTalk_ncn_60.pcf")
  13. my_scrolling_label = ScrollingLabel(
  14. type, text=text, max_characters=9, animate_time=0.3
  15. )
  16. my_scrolling_label.x = 5
  17. my_scrolling_label.y = 60
  18. group.append(my_scrolling_label)
  19. display.show(group)
  20. while True:
  21. my_scrolling_label.update()

效果如下

手机可以连接WiFi热点

WIFI网络功能连接真是方便,两行代码就能解决全部问题,但是对隐藏网络不太友好,估计是库的问题,隐藏网络容易搜索不到

任务三 控制WS2812B

  1. '''
  2. Description:
  3. Author: Manda
  4. Version:
  5. Date: 2027-02-10 11:31:24
  6. LastEditors: Manda
  7. LastEditTime: 2023-10-16 01:40:10
  8. '''
  9. import time
  10. import board
  11. import digitalio
  12. import neopixel
  13. button_pin = board.D5
  14. Color_n = 0
  15. # 彩虹数组
  16. RAINBOW_COLORS = [
  17. (255, 0, 0), # 红
  18. (255, 165, 0), # 橙
  19. (255, 255, 0), # 黄
  20. (0, 255, 0), # 绿
  21. (0, 0, 255), # 蓝
  22. (75, 0, 130), # 靛蓝
  23. (238, 130, 238)# 紫
  24. ]
  25. #初始为红
  26. Color = RAINBOW_COLORS[0]
  27. #按钮初始化
  28. button = digitalio.DigitalInOut(button_pin)
  29. button.direction = digitalio.Direction.INPUT
  30. button.pull = digitalio.Pull.UP
  31. debounce_delay = 0.1# 消抖延迟,单位为秒
  32. button_pressed = False
  33. pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
  34. pixel.brightness = 0.3
  35. while True:
  36. if not button.value and not button_pressed:# 按键被按下且之前未被按下
  37. button_pressed = True
  38. time.sleep(debounce_delay)# 延迟一段时间进行消抖
  39. if not button.value:# 确认按键仍然被按下
  40. Color = RAINBOW_COLORS[Color_n]
  41. # 设置led颜色
  42. pixel.fill(Color)
  43. Color_n += 1
  44. if Color_n == 7:
  45. Color_n -= 7
  46. elif button.value:# 按键未被按下
  47. button_pressed = False

效果如下

没有按钮只能用铜丝替代了,简直太惨了,还好,顺利触发

任务四 日历&时钟

  1. ##连接wifi
  2. import os
  3. import wifi
  4. wifi.radio.start_scanning_networks()
  5. wifi.radio.stop_scanning_networks()
  6. wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))
  7. # 导入os库,用来获取wifi信息
  8. import os
  9. # 导入rtc库,实现RTC时钟
  10. import rtc
  11. # 导入wifi、time库备用
  12. import wifi
  13. import time
  14. # 导入网络库备用
  15. import ssl
  16. import socketpool
  17. import adafruit_requests
  18. import board
  19. import displayio
  20. import adafruit_ntp
  21. import adafruit_imageload
  22. from adafruit_display_text import label
  23. from adafruit_bitmap_font import bitmap_font
  24. # 初始化显示屏
  25. display = board.DISPLAY
  26. display.brightness = 0.35
  27. display.rotation = 0
  28. #加载图片
  29. image, palette = adafruit_imageload.load("/img/img0.bmp",bitmap=displayio.Bitmap, palette=displayio.Palette)
  30. tile_grid = displayio.TileGrid(image, pixel_shader=palette)
  31. group = displayio.Group()
  32. #将图像加入组中
  33. group.append(tile_grid)
  34. # 加载字体并定义字体颜色为黑色
  35. font = bitmap_font.load_font("/fonts/sytq_16.pcf")
  36. nun_font = bitmap_font.load_font("/fonts/DingTalk_ncn_60.pcf")
  37. color = 0xFFFFFF
  38. # 初始化日期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  39. date = label.Label(font, text="0", color=color)
  40. date.x = 50
  41. date.y = 30
  42. group.append(date)
  43. # 初始化星期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  44. week = label.Label(font, text="0", color=color)
  45. week.x = 150
  46. week.y = 30
  47. group.append(week)
  48. # 初始化时间标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  49. timeL = label.Label(nun_font, text="00:00", color=color)
  50. timeL.x = 10
  51. timeL.y = 80
  52. group.append(timeL)
  53. # 初始化温度标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  54. temp = label.Label(font, text="28°", color=color)
  55. temp.x = 70
  56. temp.y = 140
  57. group.append(temp)
  58. # 初始化天气标签并设置x,y轴绘图坐标,然后将标签添加到图像组
  59. tempzh = label.Label(font, text="晴", color=color)
  60. tempzh.x = 110
  61. tempzh.y = 140
  62. group.append(tempzh)
  63. # 显示修改后的图像组
  64. display.show(group)
  65. # 使用adafruit_ntp.NTP函数初始化ntp服务,第一个函数是确定网络连接端口,
  66. # 第二个函数设置时区,中国是+8时区,第三个函数用来指定ntp服务器地址
  67. pool = socketpool.SocketPool(wifi.radio)
  68. ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
  69. # 使用ntp时间更新系统时间
  70. rtc.RTC().datetime = ntp.datetime
  71. def get_wday(wday):
  72. if (wday == 0):
  73. return "周一"
  74. elif (wday == 1):
  75. return "周二"
  76. elif (wday == 2):
  77. return "周三"
  78. elif (wday == 3):
  79. return "周四"
  80. elif (wday == 4):
  81. return "周五"
  82. elif (wday == 5):
  83. return "周六"
  84. elif (wday == 6):
  85. return "周日"
  86. # 初始化requests对象
  87. pool = socketpool.SocketPool(wifi.radio)
  88. requests = adafruit_requests.Session(pool, ssl.create_default_context())
  89. # 请求获取JSON
  90. ## apihttp://t.weather.sojson.com/api/weather/city/101280601
  91. JSON_TIME_URL = "http://t.weather.sojson.com/api/weather/city/101280601"
  92. #pool = socketpool.SocketPool(wifi.radio)
  93. #requests = adafruit_requests.Session(pool, ssl.create_default_context())
  94. ## 读取解析Json
  95. response = requests.get(JSON_TIME_URL)
  96. #response.close()
  97. weather = response.json()
  98. city_weather = weather["data"]
  99. forecast = city_weather['forecast']
  100. response.close()
  101. # 先创建一个status变量,用来在设备启动时获取天气信息
  102. status = "boot"
  103. # 主循环
  104. while True:
  105. # 每秒获取一次本地RTC时间
  106. t = time.localtime()
  107. # 首次启动或者本地RTC时间的分钟属性为0时,更新日期标签和天气标签
  108. if (status == "boot" or t.tm_min == 0):
  109. # 更新日期标签
  110. date.text = "%d%d日" % (t.tm_mon, t.tm_mday)
  111. week.text = get_wday(t.tm_wday)
  112. # 获取天气信息
  113. str_t = city_weather['wendu']
  114. str_tz = forecast[0]['type']
  115. # 更新温度标签
  116. temp.text = "%s°" % (str_t)
  117. # 更新天气标签
  118. tempzh.text = str_tz
  119. status = "updated"
  120. # 每隔1秒 更新一次时钟标签,用于动态显示
  121. if (t.tm_sec % 2 == 0):
  122. timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
  123. timeL.color = 0xFFFFFF
  124. else:
  125. timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
  126. timeL.color = 0xBBFFFF
  127. # 刷新屏幕
  128. display.show(group)
  129. # 休眠1秒
  130. time.sleep(1)

效果如下所示

干到2点真不容易,终于完成了全部任务,总的来说Adafruit ESP32-S3 TFT Feather这块板子可玩性很好,唯一的缺点是发热量比较大,这次活动也受益匪浅,希望eeworld可以多举办一些这样的活动。

最后放一张原装与我自己DIY的Adafruit ESP32-S3 TFT Feather对比图

第三部分

##可编译下载的代码
代码,库,及资源全部放在了这个压缩包中

fw2任务.rar

(618.4 KB, 下载次数: 1)

心得体会

我非常感谢得捷和电子工程世界举办这次令人难忘的活动。在这次Follow Me第二期中,我不仅学到了大量有关嵌入式系统的知识,还对ESP32-S3模块的功能有了更深入的了解。作为一名机械设计师,我原本专注于机械方面的工作,但我深知嵌入式系统与物联网是未来的发展方向。通过这次学习,我对将来的项目能够应用所学的知识充满信心。这次学习让我看到了机械设计与嵌入式系统相互融合的巨大潜力,我期待能在未来的工作中将这些知识应用到实际项目中。这次活动也有一个小遗憾,主办方错误评估了我们的热情,备货不足。发货太慢了,我自己DIY的同款板子都做了两三版,底层重新构造了一遍,得捷官方的板子还没发货。。尽管如此还是要感谢主办方给予我这个宝贵的学习机会!

End

最新回复

板载的BME280测温也不准,主要时ESP32-S3发热太大    详情 回复 发表于 2023-10-17 17:01
点赞 关注
 
 

回复
举报

172

帖子

3

TA的资源

一粒金砂(高级)

沙发
 

大佬厉害,还来个DIY,点个赞


 
 
 

回复

6876

帖子

10

TA的资源

版主

板凳
 

板载的BME280测温也不准,主要时ESP32-S3发热太大 

点评

对的  详情 回复 发表于 2023-10-21 11:16
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

6

帖子

3

TA的资源

一粒金砂(中级)

4
 
秦天qintian0303 发表于 2023-10-17 17:01 板载的BME280测温也不准,主要时ESP32-S3发热太大 

对的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条
    中星联华&ADI明日直播
    直播主题:大咖面对面,轻松玩转高速ADC性能测试
    直播时间:3月25日(周二)14:00
    活动奖励:京东卡、双肩包

    查看 »

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

     
    机器人开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 3

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表