1120|1

4

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子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也并不负载,仅需一行代码:

  • # for connect to ap, no code
  • # for create an 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对开发者的支持!

点赞 关注
 
 

回复
举报

4

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
立即报名 | 2025 瑞萨电子工业以太网技术日即将开启!
3月-4月 深圳、广州、北京、苏州、西安、上海 走进全国6城
2025瑞萨电子工业以太网技术巡回沙龙聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案。
预报从速,好礼等您拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

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