【得捷电子Follow me第2期】 任务汇总
[复制链接]
首先感谢得捷电子与EEWORLD组织的活动,能够让国内硬件爱好者有机会接触中国市场不多见的Adafruit系列开发板。
话不多说,下面是本人的任务汇总。
代码下载链接:https://download.eeworld.com.cn/detail/eew_ut8S09/629868
成果展示视频:https://training.eeworld.com.cn/video/38387
任务1:控制屏幕显示中文
使用的核心程序库:adafruit_bitmap_font(加载pcf字体)、adafruit_display_text(用于显示文本)
效果展示:
相关代码:
- import board
- import displayio
-
- import adafruit_imageload
- from adafruit_display_text import label
- from adafruit_bitmap_font import bitmap_font
-
- display = board.DISPLAY
- group = displayio.Group()
- image, palette = adafruit_imageload.load("1.png")
-
- grid = displayio.TileGrid(image, pixel_shader=palette)
-
- group.append(grid)
-
- font = bitmap_font.load_font("/wenquanyi_13px.pcf")
- color=0xFF0000
- d = label.Label(font, text="得捷电子", color=color,scale=2)
- d.x = 110
- d.y = 60
- group.append(d)
- e = label.Label(font,text="EEWORLD",color=0x000000,scale=2)
- e.x=110
- e.y=115
- group.append(e)
-
- display.show(group)
- while True:
- pass
在活动前期就有朋友讨论,字体的制作较复杂,因此本人使用了开源字体文泉驿米黑,它的开发团队已经预先制作好pcf格式字体,选用的汉字大小为13px*13px,pcf格式文件大小为1.8M,对于这块存储空间较小的开发板也能够容纳。最主要的是它完美包含各种常用汉字,但缺点就是显示效果是非常古老的点阵效果,不过本人还是比较喜欢的,哈哈。另外,为了防止界面枯燥,添加了得捷电子与EEWORLD的logo作为文字显示测试的背景,也为制作天气时钟做准备。
任务2:网络功能使用
这个任务实际上是最简单的了。浏览论坛时,大家都尝试使用代码连接wifi网络,实际上,circuitpython设置了settings.toml文件,编辑此文件添加参数,即可自动联网,就可以在自己的程序中直接使用wifi.radio等操作访问网络,参数如下:
- CIRCUITPY_WIFI_SSID = "接入点名称"
- CIRCUITPY_WIFI_PASSWORD = "密码"
把这些内容添加到settings.toml就可以在开发板启动时自动联网了。
创建AP也并不负载,仅需一行代码:
-
-
- import wifi
- wifi.radio.start_ap("ESP32S3", "1145141919810")
任务3:控制WS2812B
使用的核心程序库:adafruit_pixelbuf.mpy、neopixel.mpy
效果展示:
相关代码:
- import board
- import digitalio
- import neopixel
- import time
- button = digitalio.DigitalInOut(board.BUTTON)
- button.switch_to_input(pull=digitalio.Pull.UP)
- power = digitalio.DigitalInOut(board.NEOPIXEL_POWER)
- power.direction = digitalio.Direction.OUTPUT
- power.value = True
-
- pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
- pixel.brightness = 0.5
-
- color_index = 0
- colors = [
- (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 0, 255), (255, 255, 0), (0, 255, 255), (255, 255, 255)]
- while True:
- if not button.value:
- color_index = (color_index+1) % 7
- pixel.fill(colors[color_index])
- time.sleep(0.2)
-
开发板的按键(左侧靠近屏幕那个)由于承担控制ESP32S3芯片启动方式的功能,所以它是默认要拉到高电平的,当按下按键,引脚电平被拉低时,就可以改变启动模式。因此,代码中,将这个按钮的输入模式设为上拉。用相关库定义好各种变量,在死循环中,不断检测按键引脚电平。若为低电平,所对应的value成员变量便为False,由此检测按键状态;按下时,将当前颜色的编号加1,并刷新RGB灯颜色;另外再延迟0.2秒,防止颜色变个不停。
另外在订购开发板时,没有注意到活动说明,加购了额外的三个树莓派pico,而活动要求订购的器件需要全部用到。为此,我对任务三进行扩展,使用树莓派控制开发板上的LED灯。
效果展示:
- import board
- import digitalio
- import neopixel
- import time
- button = digitalio.DigitalInOut(board.BUTTON)
- button.switch_to_input(pull=digitalio.Pull.UP)
- power = digitalio.DigitalInOut(board.NEOPIXEL_POWER)
- power.direction = digitalio.Direction.OUTPUT
- power.value = True
-
- pixel = neopixel.NeoPixel(board.NEOPIXEL,1)
- pixel.brightness=0.5
-
- control_pins = list(map(digitalio.DigitalInOut, [board.A1,board.A3,board.A5]))
- for pin in control_pins:
- pin.direction = digitalio.Direction.INPUT
-
- colors = [(255,0,0),(0,255,0),(0,0,255)]
- while True:
- for i,pin in enumerate(control_pins):
- if pin.value:
- pixel.fill(colors[i])
- break
- time.sleep(1)
主要是利用树莓派定时对开发板的引脚输入高电平,然后开发板进行读取,若匹配到对应引脚的高电平,则将LED灯改变成对应颜色。
任务4:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息
效果展示:
设计思路大致分为以下阶段:获取数据、处理数据、显示数据。
获取数据:时间:ntp rtc
天气:心知天气
- import board
- import displayio
-
- import adafruit_imageload
- from adafruit_display_text import label
- from adafruit_bitmap_font import bitmap_font
-
- import os
- import rtc
- import wifi
- import time
-
- import ssl
- import socketpool
- import adafruit_ntp
- import adafruit_requests
-
- pool = socketpool.SocketPool(wifi.radio)
- ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
- rtc.RTC().datetime = ntp.datetime
- requests = adafruit_requests.Session(pool, ssl.create_default_context())
-
- display = board.DISPLAY
- group = displayio.Group()
- image, palette = adafruit_imageload.load("/img/weather_back.png")
-
- grid = displayio.TileGrid(image, pixel_shader=palette)
-
- group.append(grid)
-
- font = bitmap_font.load_font("/font/wenquanyi_13px.pcf")
- color = 0x000000
- dateLabel = label.Label(font, text="", color=color, scale=2)
- dateLabel.x = 10
- dateLabel.y = 20
- group.append(dateLabel)
- timeLabel = label.Label(font, text="", color=color, scale=4)
- timeLabel.x = 30
- timeLabel.y = 62
- group.append(timeLabel)
- weatherLabel = label.Label(font, text="", color=color, scale=2)
- weatherLabel.x = 10
- weatherLabel.y = 114
- group.append(weatherLabel)
-
- WEEK_TEXT = ["一", "二", "三", "四", "五", "六", "日"]
-
-
- def updateDatetimeLabel(force=False):
- t = time.localtime()
- if (t.tm_min == 0 and t.tm_sec == 0) or force:
- dateLabel.text = "%d/%d/%d 星期" % (t.tm_year,
- t.tm_mon, t.tm_mday)+WEEK_TEXT[t.tm_wday]
- if t.tm_sec % 2 == 0 or force:
- timeLabel.text = "%02d:%02d" % (t.tm_hour, t.tm_min)
-
-
- def updateWeatherLabel(force=False):
- t = time.localtime()
- if (t.tm_min == 0 and t.tm_sec == 0 and t.tm_hour == 0) or force:
- city = "beijing"
- url = f"""https://api.seniverse.com/v3/weather/daily.json
- ?key=your_key&location={city}&language=zh-Hans&unit=c&start=0&days=1"""
- resp_json = {}
- try:
- resp = requests.get(url)
- resp_json = resp.json()
- resp.close()
- location = resp_json["results"][0]["location"]["name"]
- weather_text = resp_json["results"][0]["daily"][0]["text_day"]
- weather_high = resp_json["results"][0]["daily"][0]["high"]
- weather_low = resp_json["results"][0]["daily"][0]["low"]
- weatherLabel.text = f"{location} {
- weather_high}~{weather_low}℃ {weather_text}"
- except Exception as e:
- print(e)
- weatherLabel.text = "获取天气失败"
-
-
- updateDatetimeLabel(True)
- updateWeatherLabel(True)
- while True:
- updateDatetimeLabel()
- updateWeatherLabel()
- display.show(group)
- time.sleep(0.2)
-
活动感想
参加DIGIKEY和EEWORLD的活动,让我深刻感受到ESP32-S3在物联网领域的强大应用潜力。
任务一要求控制屏幕显示中文,这直接涉及到ESP32-S3的嵌入式图形处理能力。通过使用Adafruit ESP32-S3 TFT Feather和相应的库,我成功实现了屏幕的控制,并能够显示中文。这展示了ESP32-S3在嵌入式系统中的多语言支持和图形处理性能,为产品在全球范围内的应用提供了更广泛的可能性。
任务二要求完成网络功能的使用,包括创建热点和连接到WiFi。ESP32-S3的强大网络功能是其在物联网中的一项重要优势。通过使用相关库和示例代码,我成功地实现了在ESP32-S3上创建热点和连接到WiFi网络。这使得开发者可以轻松地将ESP32-S3应用于各种物联网场景,例如智能家居、工业自动化等,实现设备之间的无缝通信。
任务三涉及控制WS2812B,通过按键实现板载Neopixel LED的显示和颜色切换。这一任务展示了ESP32-S3在嵌入式系统中对外部设备的灵活控制。通过使用适当的库和硬件接口,我成功地实现了对WS2812B的控制,并通过按键实现LED的显示和颜色切换。这为产品的用户界面设计提供了更多可能性,例如在智能家居中,通过灯光颜色表示不同的状态或信息;以及各种装饰的需求等。
任务四中要求完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息。这个任务更深入地展示了ESP32-S3在物联网中的应用。通过连接到互联网,ESP32-S3可以获取实时的天气信息,并结合日历和时钟功能,为用户提供更加智能的服务。这对于各种场景如智能办公室、智能家居等都是有实际需求的,而ESP32-S3作为一款低功耗、高性能的芯片,正好满足这些应用场景的需求。
对于开发者来说,赠送ESP32-S3开发板的活动是一次宝贵的学习机会。得捷电子和EEWORLD通过提供这样的活动,不仅为开发者提供了先进的硬件平台,也为他们提供了实际应用的任务,激发了学习和创新的热情。这种支持性的活动有助于推动技术的发展和应用的推广。通过提供免费的开发板,厂商可以让更多的开发者接触到最新的硬件技术,激发他们对新技术的兴趣。同时,通过设计有趣而实际的任务,开发者能够更全面地了解硬件的性能和应用场景,从而更好地将其运用到实际项目中。
最后,再次感谢得捷电子和EEWORLD对开发者的支持!
|