ltand

  • 2023-12-06
  • 发表了主题帖: 【得捷电子Follow me第2期】任务汇总【修改调整版】

    在本次的Follow Me第二期活动中,探讨如何借助ESP32-S3开发板, 在circuitpython环境中实现MCP9808温度传感器和光敏传感器的数据采集和展示,并将这些数据成功存储在SD卡中。同时,还将成功实现网络连接、高清屏幕显示、智能LED灯控制、实时日历和时钟等功能, 这些在演示视频和项目总结报告中有所体现.   内容一:演示视频 https://training.eeworld.com.cn/video/38427   内容二:项目总结报告   必做任务1:控制屏幕显示中文 本次任务控制板子自带的屏幕显示的中文,所以需要加载字体文件, 不过我还用到了读取 MCP9808 温度传感器和光敏传感器的数据,显示在屏幕上,并将温度数据写入 SD 卡中的temp.txt文件 使用的硬件要求: 官方文档接线方式   下边读取光敏感应器的值和海内存知己,天涯若比邻的文字效果图, 不过主要代码用显示的库加载经过压缩处理的字体文件, 具体操作可以看下方分享贴:   但是有个问题温度传感器和读取sd卡线插法检查多次, 但是读取sd卡库反馈no sdcard异常有点奇怪   最关键代码,写入温度数据和光敏传感器值到 SD 卡:使用 open 函数以写入模式打开 /sd/temp.txt 文件,将整个温度数据数组以每行一个值的方式写入文件。同时,将光敏传感器的值更新到显示文本标签, 其他代码是初始化传感器的引脚变量,挂载SD 卡, 将读取值显示屏幕上功能, 具体完整代码见结尾下方任务一的分享贴 temperature_data = [] # 用于存储温度数据的数组 while True: # 等待一段时间,避免刷新过快导致占用过多资源 tempC = mcp.temperature tempF = tempC * 9 / 5 + 32 # 转换成 F temp_label.text = str(tempC) print("Temperature: {} C {} F".format(tempC, tempF)) display.show(group) temperature_data.append(tempF) # 将温度数据添加到数组中 with open("/sd/temp.txt", "w") as f: # 将整个数组写入文件,每个温度值占一行 f.write("\n".join(map(str, temperature_data))) time.sleep(2)   任务2:网络功能使用 使用的硬件要求: ESP32-S3开发板 本次任务通过开发板创建热点, 供手机连接, 修改项目里settings.toml文件, 设置连接家里wifi名和wifi密码, 导入wifi库, 设置热点名为ESP32-S3, 让手机连接测试 测试成功   主要代码: # settings.toml文件 CIRCUITPY_WIFI_SSID = "l_home" CIRCUITPY_WIFI_PASSWORD = "159753@" CIRCUITPY_WEB_API_PASSWORD = "123456" CIRCUITPY_WEB_API_PORT = 80   import wifi def run(): print('===============================') wifi.radio.start_ap('ESP32-S3', '12345678@') print('=============================== ') run()   任务3:控制WS2812B 使用的硬件要求: ESP32-S3开发板 本次任务是通过板子的按键控制板子上唯一的一个灯珠的颜色变化, 但是板子有两个按键,一个是Rst, 另一个是Boot, 所以采用Boot键 通过按下Boot键切换不同颜色的灯, 拇指每按一下,切换数组的索引index, 相当于变换颜色值,也可以随机索引(随机换颜色)     主要代码: import time import board import digitalio import neopixel import random pixel = neopixel.NeoPixel(board.NEOPIXEL, 1) # 初始化btn按钮对象 btn = digitalio.DigitalInOut(board.BOOT0) # 设置btn引脚为输入 btn.direction = digitalio.Direction.INPUT # 设置btn引脚为上拉 btn.pull = digitalio.Pull.UP # 红 绿 蓝 黄 白 colorArr = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 255, 255)] index = 0 while True: if not btn.value: # 从colorArr中索引顺序切换颜色 if index == len(colorArr) - 1: index = 0 else: index = index+1 # pixel.fill(random.choice(colorArr)) # 从colorArr中随机选择一个颜色 pixel.fill(colorArr[index]) time.sleep(0.5) else: # 按键未按下时 pass   任务4:日历和时钟 使用的硬件要求: ESP32-S3开发板 本次任务基于ESP32-S3联网请求天气API和NTP服务器, 用于屏幕上显示现在的日期、时间和天气信息状况   最关键的是初始化NTP和RTC,使用`socketpool`和`adafruit_ntp`,从阿里云NTP服务器获取时间, 然后用`adafruit_requests`初始化HTTP请求, 请求高德地图天气信息的API,处理JSON响应数据获取温度、天气和城市信息,不过请求参数问题可以用postman去测试一下接口 # 导入内置库 import board import displayio import os import rtc import wifi import time # 导入显示库 import adafruit_imageload from adafruit_display_text import label from adafruit_bitmap_font import bitmap_font # 导入网络相关库 import ssl import socketpool import adafruit_ntp import adafruit_requests def run(): # 图像组实例对象 display = board.DISPLAY group = displayio.Group() # 加载背景图 image, palette = adafruit_imageload.load("/image/bg.png") palette.make_transparent(0) grid = displayio.TileGrid(image, pixel_shader=palette) group.append(grid) display.show(group) # 设置字体大小和颜色 font = bitmap_font.load_font("/font/simhei_16.pcf") nun_font = bitmap_font.load_font("/font/hei_60.pcf") color = 0xFFFFFF # 日期标签 date = label.Label(font, text="", color=color) date.x = 0 date.y = 30 group.append(date) # 星期标签 week = label.Label(font, text="", color=color) week.x = 100 week.y = 30 group.append(week) # 温度标签 temp = label.Label(font, text="", color=color) temp.x = 150 temp.y = 30 group.append(temp) # 天气标签 weatherLabel = label.Label(font, text="", color=color) weatherLabel.x = 190 weatherLabel.y = 30 group.append(weatherLabel) # 时分标签 timeLabel = label.Label(nun_font, text="", color=color) timeLabel.x = 20 timeLabel.y = 80 group.append(timeLabel) # 显示修改后的图像组 display.show(group) # 连接到wifi ssid = os.getenv("CIRCUITPY_WIFI_SSID") password = os.getenv("CIRCUITPY_WIFI_PASSWORD") wifi.radio.connect(ssid, password) print("wifi success", ssid) # adafruit_ntp库初始化网络, 时区, ntp地址 pool = socketpool.SocketPool(wifi.radio) ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com") # 设置连接阿里云的ntp服务器时间 rtc.RTC().datetime = ntp.datetime # 初始化requests对象,用来请求http的接口 pool = socketpool.SocketPool(wifi.radio) requests = adafruit_requests.Session(pool, ssl.create_default_context()) # 格式化星期 def get_weekday(index): arr = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] return arr[index] # 获取参数配置 CITY_CODE = os.getenv("CIRCUITPY_CITY_CODE") GAODE_KEY = os.getenv("CIRCUITPY_GAODE_KEY") def get_weather_info(): # 拼接接口参数 weather_url_api = f"https://restapi.amap.com/v3/weather/weatherInfo?city={CITY_CODE}&key={GAODE_KEY}" # 请求数据 response = requests.get(weather_url_api) json_resp = response.json() response.close() # 关闭连接 # 解析json数据 for key in json_resp["lives"]: return key["temperature"], key["weather"], key["city"] # 创建开始状态 status = "start" while True: # 每秒获取一次本地RTC时间 t = time.localtime() # 首次启动或者本地RTC时间的分钟属性为0时,更新日期标签和天气标签 if (status == "start" or t.tm_min == 0): # 更新日期 date.text = "%d月%d日" % (t.tm_mon, t.tm_mday) week.text = get_weekday(t.tm_wday) # 更新天气信息接口 temp_text, weather_text, city = get_weather_info() temp.text = "%s°" % (temp_text) weatherLabel.text = weather_text print("date: ", date.text, week.text) print("city temp weather: ", city, "%s°" % (temp_text), weather_text) status = "end" # 每隔1秒 更新一次时钟标签 if (t.tm_sec % 2 == 0): timeLabel.text = "%02d:%02d" % ( t.tm_hour, t.tm_min) else: timeLabel.text = "%02d:%02d" % ( t.tm_hour, t.tm_min) display.show(group) time.sleep(1)   汇总帖 【得捷电子Follow me第2期】任务1:控制屏幕显示中文 https://bbs.eeworld.com.cn/thread-1262971-1-1.html 【得捷电子Follow me第2期】任务1:控制屏幕显示温度写入sd卡 https://bbs.eeworld.com.cn/thread-1263339-1-1.html 【得捷电子Follow me第2期】任务2:网络功能使用 https://bbs.eeworld.com.cn/thread-1262972-1-1.html 【得捷电子Follow me第2期】任务3:控制WS2812B https://bbs.eeworld.com.cn/thread-1262952-1-1.html 【得捷电子Follow me第2期】任务4:日历和时钟 https://bbs.eeworld.com.cn/thread-1263250-1-1.html   总结 总之,ESP32-S3开发板是一款功能强大、灵活多变的开发板,它可以快速实现各种应用场景,并且具有良好的扩展性和可定制性。 感谢EEWORLD社区举办的这次Follow Me活动,  虽然本职业是web开发者,发货时间有点紧, 但通过本次活动的学习和实践,在这里结识了一批志同道合的伙伴,相互交流,共同成长。我了解circuitpython环境的下python的使用和一些常用库的调用, 帮助我更好地操作开发板上的功能 期待下一次活动的到来。   内容三:可编译下载的代码 下载的压缩包里已经包含背景图,字体,库 https://download.eeworld.com.cn/detail/ltand/629885

  • 加入了学习《2023得捷电子第一期总结视频》,观看 2023得捷电子第一期总结视频

最近访客

< 1/1 >

统计信息

已有1人来访过

  • 芯积分:69
  • 好友:--
  • 主题:7
  • 回复:0

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言