676|0

1

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

得捷电子 Follow me 第二期汇总贴 [复制链接]

 

这是一个汇总帖——很高兴这次能参加这次的DigiKey联合EEWORLD发起的Followme活动,我是一名大三的在校学生本打算在暑假和开学期间多充实一下自己,可惜过了国庆节才收到货。但是好事不怕晚!先做一个简单介绍:

studio_video_1699537528133
视频链接https://training.eeworld.com.cn/course/68203首先是第一个任务,用到了esp32s3和pico扩展板5703(主要是sd卡槽,我买的时候没货了,不想等)

首先是第一个任务,用到了esp32s3和pico扩展板5703(主要是sd卡槽,我买的时候没货了,不想等)要用到sd卡第一件事就是先连上引脚,引脚连接如下:

引脚 功能 连接ESP32
VCC 电源3V 3V供电
GND 共地
SCK 时钟线 SCK
MI 主机SPI输入,从机输出 MISO
MO 主机SPI输出,从机SPI输入 MOSI
CS 片选 A5
DET(15) 检测SD卡是否接入 A2

 

图片是用pixso做的,再根据教程挂载sd卡文件系统,连接sd卡需要用到adafruit_sdcard库

做个字库

先做了一个读写测试看看sd卡是否能正常读写
VID_20231107_164510
 
读写正常,然后把png存在sd卡里

最终代码如下


import os
import time
import digitalio
import board
import storage
import displayio
import adafruit_imageload
import adafruit_sdcard
# 导入外部库adafruit_display_text里的lable,用于显示标签
from adafruit_display_text import label
# 导入外部库adafruit_bitmap_font里的lable
from adafruit_bitmap_font import bitmap_font
display = board.DISPLAY

SD_CS = board.A5  
spi = board.SPI()
cs = digitalio.DigitalInOut(SD_CS)
sdcard = adafruit_sdcard.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")
#文件用/sd

# 打印sd卡内容
def print_directory(path, tabs=0):
    for file in os.listdir(path):
        stats = os.stat(path + "/" + file)
        filesize = stats[6]
        isdir = stats[0] & 0x4000

        if filesize < 1000:
            sizestr = str(filesize) + " bytes"
        elif filesize < 1000000:
            sizestr = "%0.1f KB" % (filesize / 1000)
        else:
            sizestr = "%0.1f MB" % (filesize / 1000000)

        prettyprintname = ""
        for _ in range(tabs):
            prettyprintname += "   "
        prettyprintname += file
        if isdir:
            prettyprintname += "/"
        print("{0:<40} Size: {1:>10}".format(prettyprintname, sizestr))

        # recursively print directory contents
        if isdir:
            print_directory(path + "/" + file, tabs + 1)

print("Files on filesystem:")
print("====================")
print_directory("/sd")



# 尝试读写
with open("/sd/hello.txt", "w") as f:
    print("hello world", file=f)

print()
print("SD card I/O benchmarks")

# Test read and write speed in several scenarios:
#  * 512 or 4096 bytes at a time
#  * Writing 1 time or 16 times
# First write the content to the SD card, then read it back, reporting the
# time taken.
for sz in 512, 4096:
    b = bytearray(sz)
    for i in range(sz):
        b[i] = 0xaa
    for n in (1, 16):
        with open("/sd/hello.bin", "wb") as f:
            t0 = time.monotonic_ns()
            for i in range(n):
                f.write(b)
            t1 = time.monotonic_ns()

        dt = (t1-t0) / 1e9
        print(f"write {len(b)} x {n} in {dt}s {n * len(b) / dt / 1000:.1f}Kb/s")

        with open("/sd/hello.bin", "rb") as f:
            t0 = time.monotonic_ns()
            for i in range(n):
                f.readinto(b)
            t1 = time.monotonic_ns()

        dt = (t1-t0) / 1e9

        print(f"read  {len(b)} x {n} in {dt}s {n * len(b) / dt / 1000:.1f}Kb/s")
        print()


group = displayio.Group()
image, palette = adafruit_imageload.load("/sd/clock.png")
palette.make_transparent(0)

grid = displayio.TileGrid(image, pixel_shader=palette)

group.append(grid)

display.show(group)
# 加载字体并定义字体颜色为黑色
font_temp = bitmap_font.load_font("/font/sytq_16.pcf")
font_time = bitmap_font.load_font("/font/DingTalk_ncn_60.pcf")
font = bitmap_font.load_font("/font/sytq_16.pcf")
color = 0x000000

# 初始化日期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
date = label.Label(font, text="11月7日", color=color)
date.x = 20
date.y = 10
group.append(date)

# 初始化星期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
week = label.Label(font, text="周二", color=color)
week.x = 180
week.y = 10
group.append(week)

# 初始化时间标签并设置x,y轴绘图坐标,然后将标签添加到图像组
time = label.Label(font_time, text="18:32", color=color)
time.x = 30
time.y = 40
group.append(time)

# 显示修改后的图像组
display.show(group)

while True:
    pass

效果如下图

 

 第二个任务:实现网络功能

具体来说就是创建热点和连上wifi,因为校园网要用邮箱和密码登录不是普通的连接WiFi方式,研究了好久没研究明白,最后还是用了手机热点充当WiFi

这步其实很简单,但是看了坛友说不把密码泄露我也选择在setting文件里设置密码和连接的热点

连接WiFi代码如下

import os
import wifi

print("ESP32-S3 Station Test")

print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")

print("Available WiFi networks:")
for network in wifi.radio.start_scanning_networks():
    print("\t%s\t\tRSSI: %d\tChannel: %d" % (str(network.ssid, "utf-8"),
                                             network.rssi, network.channel))
wifi.radio.stop_scanning_networks()

print(f"Connecting to {os.getenv('CIRCUITPY_WIFI_SSID')}")
wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD"))
print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}")
print(f"My IP address: {wifi.radio.ipv4_address}")

这里的circuitpy_wifi_ssid和circuit_wifi_password是我在setting中进行设置的,但是如果不设置直接把它换成WiFi名字和密码也可以 。效果如下图

下面是创建热点的代码,设置好WiFi名和密码(密码默认空)就可以连上esp32创建的热点了,但是没有互联网服务

import os
import time
import ssl
import wifi
import socketpool
import microcontroller
import adafruit_requests

wifi.radio.start_ap("esp32wifi", "12345678")
print(f"SSID: esp32wifi")
print(f"PASSWORD: 12345678")

while True:
    pass

第三个任务:控制WS2812B

这个任务要用到adafruit_led_animation库,采用boot按键输入,设置为按一下灯变一个颜色并打印结果。这个和直播里面讲的基本的点灯和按键都有联系,差不多综合一下,再导入库里面的一些颜色词语就可以了

import board
import time
# 从digitalio内置库导入DigitalInOut, Direction, Pull
from digitalio import DigitalInOut, Direction, Pull
# 导入neopixel外置库
import neopixel
# 从adafruit_led_animation.animation.blink库导入Blink
from adafruit_led_animation.animation.blink import Blink
# 从adafruit_led_animation.color库导入五种颜色定义
from adafruit_led_animation.color import JADE, BLACK, ORANGE, GOLD, OLD_LACE
# 初始化像素灯引脚
pixel_pin = board.NEOPIXEL
# 设置像素灯数量
num_pixels = 1
# 初始化像素灯
pixels = neopixel.NeoPixel(
    pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=neopixel.GRB
)
# 初始化blink动态效果
blink = Blink(pixels, speed=0.5, color=JADE)
# 初始化btn按钮对象
btn = DigitalInOut(board.BOOT0)
# 设置btn引脚为输入
btn.direction = Direction.INPUT
# 设置btn引脚为上拉
btn.pull = Pull.UP

# 定义led_color变量,用于五种颜色切换
led_color = 0

# 进入while循环
while True:
    # 判断按键是否按下
    if not btn.value:
        # 若按键按下,则对led_color求余数,根据余数指定led颜色
        if led_color % 5 == 0:
            blink = Blink(pixels, speed=0.5, color=BLACK)
            print("LED is black")
        elif  led_color % 5 == 1:
            blink = Blink(pixels, speed=0.5, color=ORANGE)
            print("LED is ORANGE")
        elif  led_color % 5 == 2:
            blink = Blink(pixels, speed=0.5, color=GOLD)
            print("LED is GOLD")
        elif  led_color % 5 == 3:
            blink = Blink(pixels, speed=0.5, color=OLD_LACE)
            print("LED is OLD_LACE")
        elif  led_color % 5 == 4:
            blink = Blink(pixels, speed=0.5, color=JADE)
            print("LED is JADE")
        # led_color 增加1
        led_color = led_color + 1
    else:

        pass
    time.sleep(0.2) 
    blink.animate()

VID_20231109_133104


第四个任务:分任务1:日历&时钟

这个任务可以在第一个任务的基础上加上ntp校时,再在高德api那里获取一下天气和温度参数再重新设计一下界面,我为了让另一个扩展板有一点存在感,也把字库存在了sd卡里,然后还要加上第二个任务的联网功能,因为这个代码比较长,所以我删掉了第一个任务代码里面的读写测试部分。

import board
# 导入displayio库(内置的)
import displayio
import storage
import digitalio
import adafruit_sdcard
# 导入外部库adafruit_imageload,如果没有就在教程附件下载
import adafruit_imageload
# 导入外部库adafruit_display_text里的lable,用于显示标签
from adafruit_display_text import label
# 导入外部库adafruit_bitmap_font里的lable
from adafruit_bitmap_font import bitmap_font

# 使用固件自带的屏幕设备,不需要另行初始化屏幕参数
display = board.DISPLAY
SD_CS = board.A5  
spi = board.SPI()
cs = digitalio.DigitalInOut(SD_CS)
sdcard = adafruit_sdcard.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")
group = displayio.Group()

# 加载图片
image, palette = adafruit_imageload.load("/sd/clock.png")
# 是否开启透明
palette.make_transparent(0)

# 创建图片布局
grid = displayio.TileGrid(image, pixel_shader=palette)

# 将图片布局添加到图像组,由于是第一个添加的,默认是最下层
group.append(grid)

# 显示当前图像组
display.show(group)

# 加载字体并定义字体颜色为黑色
font_temp = bitmap_font.load_font("/sd/OPSans_48.pcf")
font = bitmap_font.load_font("/sd/sytq_16.pcf")
color = 0x000000

# 初始化日期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
date = label.Label(font, text="11月7日", color=color)
date.x = 6
date.y = 45
group.append(date)

# 初始化星期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
week = label.Label(font, text="周二", color=color)
week.x = 166
week.y = 109
group.append(week)

# 初始化时间标签并设置x,y轴绘图坐标,然后将标签添加到图像组
timeL = label.Label(font, text="18:32", color=color)
timeL.x = 6
timeL.y = 100
group.append(timeL)

temp = label.Label(font_temp, text="-7°", color=color)
temp.x = 128
temp.y = 19
group.append(temp)

# 初始化天气标签并设置x,y轴绘图坐标,然后将标签添加到图像组
tempzh = label.Label(font, text="晴", color=color)
tempzh.x = 110
tempzh.y = 140
group.append(tempzh)

# 显示修改后的图像组
display.show(group)

# 导入os库,用来获取wifi信息
import os
# 导入rtc库,实现RTC时钟
import rtc
# 导入wifi、time库备用
import wifi
import time

# 导入网络库备用
import ssl
import socketpool
import adafruit_ntp
import adafruit_requests
# 使用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)

# 使用adafruit_ntp.NTP函数初始化ntp服务,第一个函数是确定网络连接端口,
# 第二个函数设置时区,中国是+8时区,第三个函数用来指定ntp服务器地址
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")

# 使用ntp时间更新系统时间
rtc.RTC().datetime = ntp.datetime

def get_wday(wday):
    if (wday == 0):
        return "周一"
    elif (wday == 1):
        return "周二"
    elif (wday == 2):
        return "周三"
    elif (wday == 3):
        return "周四"
    elif (wday == 4):
        return "周五"
    elif (wday == 5):
        return "周六"
    elif (wday == 6):
        return "周日"
# 初始化requests对象
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())

def get_weather():
    # 设置城市id
    city = "450900"
    # 这个函数使用的是高德API,使用该API需要先去注册相关账户,申请key。
    key = "18ccc5b1002a0ba264ab5cd58bf03640"
    # 拼接天气链接url
    getweather_url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key
    # 获取天气json数据
    response = requests.get(getweather_url)
    json_resp = response.json()
    # 关闭连接
    response.close()
    # 解析json数据,并返回温度和天气信息
    for da in json_resp["lives"]:
        #print(da["temperature"])
        return da["temperature"], da["weather"]
# 先创建一个status变量,用来在设备启动时获取天气信息
status = "boot"

# 主循环
while True:
    # 每秒获取一次本地RTC时间
    t = time.localtime()
    # 首次启动或者本地RTC时间的分钟属性为0时,更新日期标签和天气标签
    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()
        # 更新温度标签
        temp.text = "%s°" % (str_t)
        # 更新天气标签
        tempzh.text = str_tz
        status = "updated"
    # 每隔1秒 更新一次时钟标签,用于动态显示
    if (t.tm_sec % 2 == 0):
        timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
        timeL.color = 0x000000
    else:
        timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
        timeL.color = 0xD9D7C9
    # 刷新屏幕
    display.show(group)
    # 休眠1秒
    time.sleep(1)

其中的定位是要依靠城市代码来实现,试了几个不同的城市代码会显示不同的天气和温度

 

心得体会

参加这次活动让我首次接触到了除keil之外的方法,学到了circuitpython的一些基础用法,接触到了ESP32系列的板子,身为一个只接触过51和stm32的大学生,这次活动对我来说是受益匪浅。除此之外,在交流群里面大佬们也十分热情,从他们的交流里也学到了很多知识。十分感谢得捷电子和电子工程世界举办的这个活动,给了我们这个学习的平台。

 

follow me第二期.zip

6 KB, 下载次数: 2

followme代码

点赞 关注
 
 

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

随便看看
查找数据手册?

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