本帖最后由 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]
-
- 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():
-
- city = "321000"
-
- key = "d9e058910ed9d61d73c21565b571dd44"
-
- getweather_url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key
-
- response = requests.get(getweather_url)
- json_resp = response.json()
-
- response.close()
-
- for da in json_resp["lives"]:
-
- return da["temperature"], da["weather"]
-
-
- status = "boot"
-
-
- while True:
-
- t = time.localtime()
-
- 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"
-
- if (t.tm_sec % 2 == 0):
-
-
-
-
- image, palette = adafruit_imageload.load("/pic/test3.png")
-
- palette.make_transparent(0)
-
-
-
- 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)
-
-
-
- grid = displayio.TileGrid(image, pixel_shader=palette)
-
-
- group[0]=grid
- display.show(group)
-
- 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
-
-
- ssid = os.getenv("CIRCUITPY_WIFI_SSID")
- password = os.getenv("CIRCUITPY_WIFI_PASSWORD")
-
-
- 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_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>
- """
-
-
- @server.route("/client", GET)
- def client(request: Request):
- return Response(request, HTML_TEMPLATE, content_type="text/html")
-
-
- @server.route("/connect-websocket", GET)
- def connect_client(request: Request):
- global websocket
-
- if websocket is not None:
- websocket.close()
-
- websocket = Websocket(request)
-
- return websocket
-
-
- server.start(str(wifi.radio.ipv4_address))
-
-
- async def handle_http_requests():
- while True:
- server.poll()
-
- await async_sleep(0)
-
-
- 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)
-
-
- 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的网络功能非常好用,功能也很强大,由于本人对网络和板子的不了解,功能还不完善
第三部分
总结
非常荣幸能够参加得捷和eeword联合举办的followme 第二期的活动, 我之前一直使用C语言来编写程序,第一次使用circuitpython来开发,而且板子配套的库文件非常丰富
直接进行调库开发,省去了造轮子的困难,使用非常方便。可以说是打开了新世界的大门。
这款板子非常小巧,但功能却很强大,具有wifi和蓝牙功能,而且板载了一块oled屏幕,用来开发调试非常的方便。这次的配件我选了picow,picow也具有wifi和蓝牙功能,所以这次的选作任务我选择了ESP32-S3 feather和picow实现无线互联的功能。
|