764|2

12

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子Follow me第2期】+任务汇总 [复制链接]

 

官方任务页:

https://circuitpython.org/board/adafruit_feather_esp32s3_tft/

本次活动使用的板卡是Adafruit ESP32-S3 TFT Feather

 

演示视频

板卡简介:

Adafruit ESP32-S3 TFT Feather是由开源硬件行业知名公司Adafruit出品的一款富有特色的开源硬件,开发板使用乐鑫ESP32-S3芯片,支持WiFi和蓝牙能,自带高清TFT彩色显示屏。

特性

  • 搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口,集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE),配备原生 USB,可用作键盘/鼠标、MIDI 设备、磁盘驱动器等;
  • 获得FCC / CE认证,带有4 MB闪存和2 MB PSRAM;
  • 彩色 1.14“ IPS TFT,240x135 像素——采用 ST7789 芯片组的高清彩色显示屏,可从任何角度观看;
  • 电源选项 - USB C 型或锂聚合物电池,通过 USB-C 供电时可为内置电池充电;
  • LiPoly 电池监控器 - LC709203 芯片主动监控电池的电压和充电状态/通过 I2C 报告电池电量百分比;
  • 重置和DFU(BOOT0)按钮以进入ROM引导加载程序;
  • 内置原生USB串行端口,不需要单独的电缆,串行调试输出引脚(可选,用于检查硬件串行调试控制台);
  • 用于 I2C 设备的 STEMMA QT 连接器,具有可切换电源,可进入低功耗模式;
  • 板载 NeoPixel 具有引脚控制电源,可实现低功耗,用于多种状态显示;
  • 在深度睡眠模式下,可从Lipoly连接获得80~100uA的电流消耗;
  • 可与Arduino或CircuitPython一起使用。

实物图片:

 管脚高清图片:

  一些资源:

该板卡对应cpy网站:https://circuitpython.org/board/adafruit_feather_esp32s3_tft/

circuitpython教程:https://learn.adafruit.com/circuitpython-essentials

circuitpython对应板卡教程:https://learn.adafruit.com/adafruit-esp32-s3-feather/wippersnapper-essentials

EEPW教程:https://edm.eeworld.com.cn/Follow_me_2_Adafruit_ESP32_S3_TFT_Feather_files.pdf

circuitpython基础库:https://circuitpython.org/libraries

板卡固件烧录:

进入U盘模式:上电后双击rst按钮

演示效果:

 

 

任务1:控制屏幕显示中文(必做任务)

完成屏幕的控制,并且能显示中文

搭配器件:Adafruit ESP32-S3 TFT Feather

主要引入的外部库有:adafruit_imageload、adafruit_display_text、adafruit_bitmap_font

实际效果如下:

主要是调用了displayio库和 adafruit的文字显示库,主要功能是显示一张背景图片和汉字,由于circuitpython固件内置了显示屏的库,所以就不需要我们去其他地方寻找

代码如下:

import board
# 导入displayio库(内置的)
import displayio

# 导入外部库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

# 创建本例程里的唯一图像组
group = displayio.Group()

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

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

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

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

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

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

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

while True:
    pass

任务2:网络功能使用(必做任务)

完成网络功能的使用,能够创建热点和连接到WiFi

创建wifi很简单,一个函数即可完成调用,重新启动板卡后可以用PC连接该热点,连接wifi的功能实现在任务4部分。

搭配器件:Adafruit ESP32-S3 TFT Feather

创建热点:

import board
import displayio
import terminalio
import wifi
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font

# 1. 屏幕基础配置
display = board.DISPLAY

# 2. 设置wifi和密码
SSID = "adafruit_wifi"
PASSWORD = "11111111"

# 3. WiFi连接
wifi.radio.start_ap(SSID, PASSWORD)

# 4. 屏幕显示
text="WiFi:"+SSID+"\n"+"PASSWORD:"+PASSWORD
text_group = displayio.Group(scale=2,x=0,y=0,)
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=10, y=25)
text_group.append(text_area)  # Subgroup for text scaling
display.show(text_group)

while True:
    pass

电脑连接该热点效果图:

 

板卡显示效果:

  

 

任务3:控制WS2812B(必做任务)

使用按键控制板载Neopixel LED的显示和颜色切换

搭配器件:Adafruit ESP32-S3 TFT Feather

Adafruit ESP32-S3 TFT Feather自带了两个按键,由于其中一个按键已经被定义为Rst按钮,且不能被调用,所以我们只能使用boot按键来控制ws2812b灯关,主要显示效果为按下按键后板卡ws2812b灭,当按下按键后开始变换颜色,再按下按键后停止闪烁。

主要引入的外部库有:neopixel、adafruit_led_animation.animation.blink、adafruit_led_animation.color

代码如下:

# 导入board内置库
import board
# 导入time内置库
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
# 设置像素灯数量,这样分开写方便以后修改代码,例如外接ws2812灯带或者矩阵
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=BLACK)

# 初始化btn按钮对象
btn = DigitalInOut(board.BOOT0)
# 设置btn引脚为输入
btn.direction = Direction.INPUT
# 设置btn引脚为上拉
btn.pull = Pull.UP

led_color = 0
ctl_flag = 0

# 进入while循环
while True:
    # 判断按键是否按下
    if not btn.value:
        ctl_flag = ~ctl_flag
    else:
        # 按键未按下时啥也不干
        pass
    if ctl_flag:
        if led_color % 5 == 0:
            blink = Blink(pixels, speed=0.1, color=JADE)
            print("LED is JADE")
        elif  led_color % 5 == 1:
            blink = Blink(pixels, speed=0.1, color=ORANGE)
            print("LED is ORANGE")
        elif  led_color % 5 == 2:
            blink = Blink(pixels, speed=0.1, color=GOLD)
            print("LED is GOLD")
        elif  led_color % 5 == 3:
            blink = Blink(pixels, speed=0.1, color=OLD_LACE)
            print("LED is OLD_LACE")
        elif  led_color % 5 == 4:
            blink = Blink(pixels, speed=0.1, color=BLACK)
            print("LED is BLACK")
    else:
        blink = Blink(pixels, speed=0.01, color=BLACK)
        print("LED is BLACK")
    led_color = led_color + 1
    time.sleep(0.2) # sleep for debounce
    # 执行led闪烁动态效果
    blink.animate()

任务4:

■  分任务1:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息

建议搭配器件:Adafruit ESP32-S3 TFT Feather

代码参考于李隆大佬,复用了布局部分,首先初始化了wifi和RTC库,wifi用来上网,rtc用来计时,然后初始化了NTP时钟服务器,用来获取时间,因为北京时间是在第8个市区,所以要加一个偏移,然后复用大佬的代码进行显示,天气部分同样使用的是高德的API,用来获取温度等信息,最后集成在一起完成显示,同时也完成了任务2连接wifi功能。

 

代码如下:

import board
# 导入displayio库(内置的)
import displayio

# 导入外部库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 #用于显示字体

# 导入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

# 使用固件自带的屏幕设备,不需要另行初始化屏幕参数
display = board.DISPLAY

# 创建本例程里的唯一图像组
group = displayio.Group()

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

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

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

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

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

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

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

# 初始化温度标签并设置x,y轴绘图坐标,然后将标签添加到图像组
temp = label.Label(font, text="30°", color=color)
temp.x = 170
temp.y = 10
group.append(temp)

# 初始化温度标签并设置x,y轴绘图坐标,然后将标签添加到图像组
place = label.Label(font, text="440309", color=color)
place.x = 80
place.y = 45
group.append(place)

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

# 初始化时间标签并设置x,y轴绘图坐标,然后将标签添加到图像组
timeL = label.Label(nun_font, text="23:59", color=color)
timeL.x = 15
timeL.y = 90
group.append(timeL)

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

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 = "440309"
    # 这个函数使用的是高德API,使用该API需要先去注册相关账户,申请key。
    key = "key"
    # 拼接天气链接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"]
#https://restapi.amap.com/v3/weather/weatherInfo?city=440309&key=40b11ec6dfc97398cf6fc77d7b9144d0
# 先创建一个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)

实际效果:

   

最后补充购买的另外两个模块的使用方法,仅简单试用了一下,没有深入了解

购买的模块1:LTR-329光照传感器使用

使用水果官方的测试代码,输出光强值,用手挡住则值变小

https://learn.adafruit.com/adafruit-ltr-329-ltr-303

代码库:

链接已隐藏,如需查看请登录或者注册

测试源码:

# SPDX-FileCopyrightText: Copyright (c) 2022 ladyada for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense

import time
import board
from adafruit_ltr329_ltr303 import LTR329

i2c = board.I2C()  # uses board.SCL and board.SDA
# i2c = board.STEMMA_I2C()  # For using the built-in STEMMA QT connector on a microcontroller

time.sleep(0.1)  # sensor takes 100ms to 'boot' on power up
ltr329 = LTR329(i2c)

while True:
    print("Visible + IR:", ltr329.visible_plus_ir_light)
    print("Infrared    :", ltr329.ir_light)
    print()
    time.sleep(0.5)  # sleep for half a second

实际效果:

 

购买的模块2:ADAFRUIT NAU7802 24-BIT ADC - ST使用

 

类似于电桥的使用,要配个一个应变片,手头没有这个模块,所以改成了只打印两路ADC的采样值,没有办法体验到24位ADC的实际效果

 

https://learn.adafruit.com/adafruit-nau7802-24-bit-adc-stemma-qt-qwiic

代码库:

链接已隐藏,如需查看请登录或者注册

测试源码:

# SPDX-FileCopyrightText: 2023 Cedar Grove Maker Studios
# SPDX-License-Identifier: MIT

"""
nau7802_simpletest.py  2023-01-13 2.0.2  Cedar Grove Maker Studios

Instantiates two NAU7802 channels with default gain of 128 and sample
average count of 2.
"""

import time
import board
from cedargrove_nau7802 import NAU7802

# Instantiate 24-bit load sensor ADC; two channels, default gain of 128
nau7802 = NAU7802(board.I2C(), address=0x2A, active_channels=2)


def zero_channel():
    """Initiate internal calibration for current channel.Use when scale is started,
    a new channel is selected, or to adjust for measurement drift. Remove weight
    and tare from load cell before executing."""
    print(
        "channel %1d calibrate.INTERNAL: %5s"
        % (nau7802.channel, nau7802.calibrate("INTERNAL"))
    )
    print(
        "channel %1d calibrate.OFFSET:   %5s"
        % (nau7802.channel, nau7802.calibrate("OFFSET"))
    )
    print("...channel %1d zeroed" % nau7802.channel)


def read_raw_value(samples=2):
    """Read and average consecutive raw sample values. Return average raw value."""
    sample_sum = 0
    sample_count = samples
    while sample_count > 0:
        while not nau7802.available():
            pass
        sample_sum = sample_sum + nau7802.read()
        sample_count -= 1
    return int(sample_sum / samples)


# Instantiate and calibrate load cell inputs
print("*** Instantiate and calibrate load cells")
# Enable NAU7802 digital and analog power
enabled = nau7802.enable(True)
print("Digital and analog power enabled:", enabled)

print("REMOVE WEIGHTS FROM LOAD CELLS")
time.sleep(3)

nau7802.channel = 1
zero_channel()  # Calibrate and zero channel
nau7802.channel = 2
zero_channel()  # Calibrate and zero channel

print("READY")

### Main loop: Read load cells and display raw values
while True:
    print("=====")
    nau7802.channel = 1
    value = read_raw_value()
    print("channel %1.0f raw value: %7.0f" % (nau7802.channel, value))

    nau7802.channel = 2
    value = read_raw_value()
    print("channel %1.0f raw value: %7.0f" % (nau7802.channel, value))

实际效果:

 

对本次活动的心得体会

感谢得捷和eeword的活动,让我有机会体验树Adafruit ESP32-S3 TFT Feather的开发,希望活动能继续办下去。

本次活动学习了CircuitPython基础语法,学会了一些简单外设的驱动,学会了如何编译下载程序,如何点亮一块OLED屏幕,也学习了如何使用开源库来完成项目,多学习借鉴代码对自己项目的完成有很大的帮助。最后祝活动越办越好。

 

 

code.zip

227.51 KB, 下载次数: 2

最新回复

没有视频啊,要求制作一个效果展示的视频     详情 回复 发表于 2023-10-16 08:14
点赞 关注
 
 

回复
举报

6534

帖子

9

TA的资源

版主

沙发
 

没有视频啊,要求制作一个效果展示的视频  

点评

感谢大佬提醒,我都忘了还有这回事了  详情 回复 发表于 2023-10-16 09:19
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

12

帖子

3

TA的资源

一粒金砂(中级)

板凳
 
秦天qintian0303 发表于 2023-10-16 08:14 没有视频啊,要求制作一个效果展示的视频  

感谢大佬提醒,我都忘了还有这回事了

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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