770|1

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【得捷电子Follow me第2期】任务汇总 [复制链接]

  本帖最后由 eew_nqTQZ5 于 2023-10-30 21:29 编辑

第一部分

【得捷电子Follow me第2期】任务汇总视频-【得捷电子Follow me第2期】任务汇总视频-EEWORLD大学堂

第二部分

    2.0、板子很小巧,但功能却很强大,上边还有一块屏幕,可以很方便的进行debug,第一次使用前需要去circuit python官网下载esp32-s3 feather固件包,直接将该固件包拉入开发板显示的U盘上就行,很方便。烧好固件后就可以开始通过编辑U盘内的文件来实现想要的功能了。可以使用VScode安装circuitpython和python插件来进行编程,可以很方便的查看各个库文件源码。

    2.1必做任务1:控制屏幕显示中文

    介绍:本任务旨在演示如何在嵌入式系统中控制显示屏以显示中文文本。在这个任务中使用 CircuitPython 和 Adafruit 的库来控制显示屏,将中文文本显示在屏幕上。

    主要代码片段及说明:

  • # 设置要显示的字符串
  • dis_str = "2023年10月30日"
  • # 初始化显示屏
  • display = board.DISPLAY
  • board.DISPLAY.brightness = 0.35
  • board.DISPLAY.rotation = 0
  • # 加载字体和设置颜色
  • font = bitmap_font.load_font("/font/sytq_16.pcf")
  • color = 0x00FFFF
  • # 创建显示文本的组和标签
  • text_group = displayio.Group()
  • text_area = label.Label(font, text=screen_dispstr(dis_str), color=color)
  • text_area.x = 2
  • text_area.y = 6
  • text_area.line_spacing = 0.8
  • text_area.scale = 1
  • text_group.append(text_area)
  • display.show(text_group)

    心得体会建议:由于板子上自带了屏幕,所以初始化时只需要一行简单的调库函数,就可以完成屏幕的初始化,非常的方便,显示中文要自己制作字体文件,好在网上有很多制作的教程,这里使用了B站大佬“忙碌的死龙”的字体文件。

    必做任务2:网络功能使用

    介绍:本任务旨在演示如何在嵌入式系统中使用网络功能,连接到 Wi-Fi 并显示网络连接状态和 IP 地址。在这个任务中,我们使用 CircuitPython 中的wif库来实现该功能

    主要代码片段及说明:

  • # 使用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)
  • print(wifi.radio.ipv4_address)

 

    这段代码演示了如何连接热点,直接调用circuitpython 库中的os库和wifi库就可以完成。

    心得体会建议:这里注意要将WiFi的名字和密码放到相应的文件中,调用os库的作用就是打开文件,读取密码和WiFi名字。相比之下,这个任务是最为简单的一个。

2.3必做任务3:控制WS2812B

本任务旨在演示如何在嵌入式系统中控制 WS2812B LED,通过按下按钮来切换 LED 的颜色。在这个任务中,我们使用 CircuitPython的neopixel 的库来控制 WS2812B LED,并通过按钮按下来切换 LED 的颜色

    主要代码片段及说明:

  • button = digitalio.DigitalInOut(board.BUTTON)
  • button.direction = digitalio.Direction.INPUT
  • button.pull = digitalio.Pull.UP
  • debounce_delay = 0.1 # 消抖延迟,单位为秒
  • button_pressed = False
  • pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
  • pixel.brightness = 0.3
  • 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

这段代码逻辑也很简单,先初始化按键引脚,设置为输入功能,用来判断按键是否按下,然后调用neopixel(炫彩小灯)的库来改变小灯的状态。

    心得体会建议:改变小灯颜色非常的简单,小灯为RGB灯,每个颜色有八位数据控制,改变颜色时只需要给小灯传递相应的数据颜色就行。需要注意的是,这里未来省事实用的是软件延时来消除的按键抖动问题。

2.4、必做任务4:日历&时钟

介绍:本任务旨在演示如何在嵌入式系统中创建一个简单的日历和时钟应用。通过连接到 Wi-Fi 获取实时时间和天气信息,同时在显示屏上显示日期、星期、时间和天气情况。

主要代码片段及说明:

主要代码片段及说明:

  • def get_weather():
  • # 设置城市id
  • city = "321000"
  • # 这个函数使用的是高德API,使用该API需要先去注册相关账户,申请key。
  • key = "d9e058910ed9d61d73c21565b571dd44"
  • # 拼接天气链接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()
  • print(str_t)
  • print(str_tz)
  • # 更新温度标签
  • temp.text = "%s°" % (str_t)
  • # 更新天气标签
  • tempzh.text = str_tz
  • status = "updated"
  • # 每隔1秒 更新一次时钟标签,用于动态显示
  • if (t.tm_sec % 2 == 0):
  • # timeLabel.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
  • # timeLabel.color = 0x00FF00
  • # 加载图片
  • image, palette = adafruit_imageload.load("/pic/test3.png")
  • # 是否开启透明
  • palette.make_transparent(0)
  • # 创建图片布局
  • # group.remove(grid)
  • grid = displayio.TileGrid(image, pixel_shader=palette)
  • # 将图片布局添加到图像组,由于是第一个添加的,默认是最下层
  • group[0]=grid
  • else:
  • timeLabel.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
  • timeLabel.color = 0xD9D7C9
  • # 加载图片
  • image, palette = adafruit_imageload.load("/pic/test4.png")
  • # 是否开启透明
  • palette.make_transparent(0)
  • # 创建图片布局
  • # group.remove(grid)
  • grid = displayio.TileGrid(image, pixel_shader=palette)
  • # 将图片布局添加到图像组,由于是第一个添加的,默认是最下层
  • group[0]=grid
  • display.show(group)
  • # 休眠1秒
  • time.sleep(1)

这段代码使用了rtc模块和aliyun来确定准确时间,使用高德天气API来获取当地当天天气情况,为了更好的显示效果加了两张背景图,轮流显示。

心得体会建议:这个任务可以说是前边几个任务的集合,将前边的知识全部融合了进来,得益于circuit python库的封装,代码看起来却是非常的清晰明了,大大减少了开发过程中的工作量。

2.5、选作任务5与PICO W进行网络连接

介绍:使用ESP32-S3 feather创建服务端,在网页上显示板子核心温度,实现远程控制开发板上neopixel(炫彩小灯)颜色的功能,并使用picow作为客户端,连接到服务端。实现两块板子的无线连接。

主要代码片段及说明:

  • import os
  • from asyncio import create_task, gather, run, async_sleep
  • import board
  • import microcontroller
  • import neopixel
  • import socketpool
  • import wifi
  • from adafruit_httpserver import Server, Request, Response, Websocket, GET
  • # 使用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)
  • pool = socketpool.SocketPool(wifi.radio)
  • server = Server(pool, debug=True)
  • pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
  • websocket: Websocket = None
  • # HTML模板,包含一个显示CPU温度的段落和一个颜色选择器
  • HTML_TEMPLATE = """
  • <html lang="en">
  • <head>
  • <title>Websocket Client</title>
  • </head>
  • <body>
  • <p>CPU temperature: <strong>-</strong>°C</p>
  • <p>NeoPixel Color: <input type="color"></p>
  • <script>
  • const cpuTemp = document.querySelector('strong');
  • const colorPicker = document.querySelector('input[type="color"]');
  • let ws = new WebSocket('ws://' + location.host + '/connect-websocket');
  • ws.onopen = () => console.log('WebSocket connection opened');
  • ws.onclose = () => console.log('WebSocket connection closed');
  • ws.onmessage = event => cpuTemp.textContent = event.data;
  • ws.onerror = error => cpuTemp.textContent = error;
  • colorPicker.oninput = debounce(() => ws.send(colorPicker.value), 200);
  • function debounce(callback, delay = 1000) {
  • let timeout
  • return (...args) => {
  • clearTimeout(timeout)
  • timeout = setTimeout(() => {
  • callback(...args)
  • }, delay)
  • }
  • }
  • </script>
  • </body>
  • </html>
  • """
  • # 定义路由处理函数,返回HTML模板
  • @server.route("/client", GET)
  • def client(request: Request):
  • return Response(request, HTML_TEMPLATE, content_type="text/html")
  • # 定义路由处理函数,处理WebSocket连接请求
  • @server.route("/connect-websocket", GET)
  • def connect_client(request: Request):
  • global websocket # pylint: disable=global-statement
  • if websocket is not None:
  • websocket.close() # Close any existing connection
  • websocket = Websocket(request)
  • return websocket
  • # 启动服务器
  • server.start(str(wifi.radio.ipv4_address))
  • # 异步任务,轮询HTTP请求
  • async def handle_http_requests():
  • while True:
  • server.poll()
  • await async_sleep(0)
  • # 异步任务,处理WebSocket请求
  • async def handle_websocket_requests():
  • while True:
  • if websocket is not None:
  • if (data := websocket.receive(fail_silently=True)) is not None:
  • r, g, b = int(data[1:3], 16), int(data[3:5], 16), int(data[5:7], 16)
  • pixel.fill((r, g, b))
  • await async_sleep(0)
  • # 异步任务,通过WebSocket发送CPU温度数据
  • async def send_websocket_messages():
  • while True:
  • if websocket is not None:
  • cpu_temp = round(microcontroller.cpu.temperature, 2)
  • websocket.send_message(str(cpu_temp), fail_silently=True)
  • await async_sleep(1)
  • # 主函数,启动所有的异步任务
  • async def main():
  • await gather(
  • create_task(handle_http_requests()),
  • create_task(handle_websocket_requests()),
  • create_task(send_websocket_messages()),
  • )
  • # 运行主函数
  • run(main())

心得体会建议:这段任务实现了两块板子的无线连接,ESP32-S3 feather和picow的网络功能非常好用,功能也很强大,由于本人对网络和板子的不了解,功能还不完善

第三部分

followme2.zip (344.87 KB, 下载次数: 1)

总结

    非常荣幸能够参加得捷和eeword联合举办的followme 第二期的活动, 我之前一直使用C语言来编写程序,第一次使用circuitpython来开发,而且板子配套的库文件非常丰富
直接进行调库开发,省去了造轮子的困难,使用非常方便。可以说是打开了新世界的大门。
    这款板子非常小巧,但功能却很强大,具有wifi和蓝牙功能,而且板载了一块oled屏幕,用来开发调试非常的方便。这次的配件我选了picow,picow也具有wifi和蓝牙功能,所以这次的选作任务我选择了ESP32-S3 feather和picow实现无线互联的功能。

最新回复

 这款板子非常小巧,但功能却很强大,具有wifi和蓝牙功能,而且板载了一块oled屏幕,用来开发调试非常的方便。这次的配件我选了picow,picow也具有wifi和蓝牙功能,所以这次的选作任务我选择了ESP32-S3 feather和picow实现无线互联的功能。 恭喜完成任务   详情 回复 发表于 2023-11-5 11:36
点赞 关注
 
 

回复
举报

7188

帖子

11

TA的资源

版主

沙发
 

 这款板子非常小巧,但功能却很强大,具有wifi和蓝牙功能,而且板载了一块oled屏幕,用来开发调试非常的方便。这次的配件我选了picow,picow也具有wifi和蓝牙功能,所以这次的选作任务我选择了ESP32-S3 feather和picow实现无线互联的功能。

恭喜完成任务

 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表