614|1

7

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子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-12-7 07:31
点赞 关注
 
 

回复
举报

6807

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

扩展性和可定制性在楼主这里充分发挥了一下哈

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
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
快速回复 返回顶部 返回列表