525|1

1

帖子

2

TA的资源

一粒金砂(初级)

楼主
 

【得捷电子Follow me第2期】任务1~4(分任务1) [复制链接]

  本帖最后由 黎琉一御 于 2023-11-20 13:38 编辑

    大家好,很高兴能参加本次得捷电子Follow me第2期活动,本人之前了解并使用过C51单片机和STM32的一些入门级产品和ESP产品线的ESP8266,以上均使用C/C++语言编写,在对于本次使用的Adafruit ESP32-S3 TFT Feather中尝试使用CircuitPython完成任务,由于之前几乎没有使用Phyhon进行过单片机开发,在完成的过程中也遇到了各种各样的问题,在毫无头绪的时候看了论坛里一些大佬的实列,逐步摸索,最终完成了本次实验,在这非常感谢各位大佬在论坛中的详细,也感谢得捷电子提供的机会。

第一部分:硬件介绍和整体实验完成演示视频

    本视频中将对活动使用的硬件进行介绍以及相关任务的一个简单描述,包含任务1~4(分任务1)

第二部分:任务总结报告

    在这部分我将对每一个分任务中使用的代码及相关思路进行介绍:
任务一:控制屏幕显示中文

    在任务一中,需要使用到一个大小为2.07MB的字库文件,当然这是比较简单但非常占用单片机资源的方式,也可以只添加自己需要的部分,具体字库会在第三部分的代码文件中进行展示。在实验中需要将字库文件放在与程序文件相同的目录下,本次任务的程序文件均以code.py进行命名。
    本次通过调用adafruit_display_text、adafruit_bitmap_font外部库实现,使用adafruit_bitmap_font中bitmap_font下的load_font代码获得font。显示文字则使用adafruit_display_text的Lable类创建实例,将之前获取的font作为参数,最后使用board.DISPLAY.show()完成文字显示
    下面是任务一使用的相关代码,代码实现了基础文字显示,以及文字的循环显示,能对文字的显示位置、大小、颜色进行自一定,具体在代码中有注释
import board
import terminalio
from adafruit_display_text import bitmap_label
from adafruit_bitmap_font import bitmap_font
import time

font = bitmap_font.load_font("Word_bank.pcf")

display = board.DISPLAY

color = {
        "black" : 0x000000,
        "white" : 0xFFFFFF,
        "red" : 0xFF0000,
        "green" : 0x00FF00,
        "blue" : 0x0000FF,
        "cyan" : 0x00FFFF,
        "magenta" : 0xFF00FF,
        "yellow" : 0xFFFF00,
        }#字体颜色配置

txtCollection = ["用户名:黎琉一御","Hello World!"]
#显示位
scaleCollection = [2,4]
#字体大小

text_area = bitmap_label.Label(font,color=color["white"])       #字体颜色
text_area.x = 0                                                 #初始X位置
text_area.y = 60                                               #初始Y位置
text_area.text = "任务一展示"
text_area.scale = 2
display.show(text_area)
time.sleep(2)
#基础显示

while True:
        text_area = bitmap_label.Label(font,color=color["blue"])       #字体颜色
        text_area.x = 0                                                 #初始X位置
        text_area.y = 60                                               #初始Y位置
        text_area.text = txtCollection[0]
        text_area.scale = scaleCollection[0]
        display.show(text_area)
        time.sleep(1)
        text_area = bitmap_label.Label(font,color=color["yellow"])       #字体颜色
        text_area.x = 0                                                 #初始X位置
        text_area.y = 60                                               #初始Y位置
        text_area.text = txtCollection[1]
        text_area.scale = scaleCollection[1]
        display.show(text_area)
        time.sleep(1)
#循环显示

任务二:网路功能使用

    对于该开发板仅需要调用现成的wifi库就能实现wifi的连接,因为手机的隐私保护限制,无法展示关于wifi的具体细节,下面是一些实现的图片

    在成功连接wifi后在TFT屏幕上显示所分配到的IP地址
    下面是任务二使用的相关代码,代码实现了连接wifi并显示IP地址,具体在代码中有注释
import board
import terminalio
import os
import wifi
from adafruit_display_text import bitmap_label
from adafruit_bitmap_font import bitmap_font
import time

font = bitmap_font.load_font("Word_bank.pcf")

display = board.DISPLAY

wifi.radio.connect('FTP_LI', 'interlinked')
#连接的wifi格式	wifi.radio.connect('wifi名称', '密码')				
adress = "IP地址" + str(wifi.radio.ipv4_address)

color = {
        "black" : 0x000000,
        "white" : 0xFFFFFF,
        "red" : 0xFF0000,
        "green" : 0x00FF00,
        "blue" : 0x0000FF,
        "cyan" : 0x00FFFF,
        "magenta" : 0xFF00FF,
        "yellow" : 0xFFFF00,
        }#字体颜色配置

text_area = bitmap_label.Label(font,color=color["white"])       #字体颜色
text_area.x = 0                                                 #初始X位置
text_area.y = 60                                               #初始Y位置
text_area.text = "任务二展示"
text_area.scale = 2
display.show(text_area)
time.sleep(2)

text_area = bitmap_label.Label(font,color=color["white"])       #字体颜色
text_area = bitmap_label.Label(font,text=adress)
text_area.scale = 2
text_area.x = 0
text_area.y = 60
display.show(text_area)

while True:
    pass

 

任务三:控制WS2812B

    在本实验中为了能更为直观的显示出对WS2812B的控制,将使用按键进行控制板载的Neopixel LED

    通过调用adafruit_led_animation库文件,其中包含了多种LED显示效果,包括颜色、显示状态等,在本实验中将选取红、黄、蓝、绿的闪烁模式进行显示,通过Blink(pixels, speed=0.5, color=BLACK)和ColorCycle(pixels, speed=0.5)实现闪烁和循环两种显示模式,其中pixels对应控制的WS2812B,speed对应显示的时间间隔,color对应显示的颜色,因为ColorCycle模式将对颜色进行循环显示,故不进行颜色设置。

    对于该开发板,在本次实验中使用boot按键作为控制按键。通过调用digitalio库,使用DigitalInOut(board.BOOT0)获得boot按键对应IO口的电平变化,并对按键进行初始化用direction属性控制输入模式buttom.direction = Direction.INPUT,在对pull属性进行配置buttom.pull = Pull.UP设置为上拉模式,通过buttom.value获取IO口电平变化,通过判断实验功能

下面是任务三使用的相关代码,代码实现了通过boot按键对WS2812B的控制,具体在代码中有注释

import board
import time
import neopixel
from digitalio import DigitalInOut,Direction,Pull
from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.colorcycle import ColorCycle
from adafruit_led_animation.color import RED, YELLOW, BLUE, GREEN,BLACK

pixel_pin = board.NEOPIXEL
pixel_num = 1
pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.1, auto_write=False, pixel_order=neopixel.GRB)
#初始化像素灯

buttom = DigitalInOut(board.BOOT0)
buttom.direction = Direction.INPUT
buttom.pull = Pull.UP
#初始化BOOT0按键

#LED模式状态指示物
pixel_modeflag = 0
blink = Blink(pixels, speed=0.5, color=BLACK)
colorcycle = ColorCycle(pixels, speed=0.5)
print("LED ColorCycle")

while True:
    if not buttom.value: #监测按键
        pixel_modeflag = pixel_modeflag + 1
        if (pixel_modeflag % 5 == 1):
            blink = Blink(pixels, speed=0.2, color=RED)
            print("LED Blink in RED")
        elif (pixel_modeflag % 5 == 2):
            blink = Blink(pixels, speed=0.2, color=YELLOW)
            print("LED Blink in YELLOW")
        elif (pixel_modeflag % 5 == 3):
            blink = Blink(pixels, speed=0.2, color=BLUE)
            print("LED Blink in BLUE")
        elif (pixel_modeflag % 5 == 4):
            blink = Blink(pixels, speed=0.2, color=GREEN)
            print("LED Blink in GREEN")            
        elif (pixel_modeflag % 5 == 0):
            colorcycle = ColorCycle(pixels, speed=0.1)
            print("LED ColorCycle")
    else:
        pass
    time.sleep(0.2)
        
    if (pixel_modeflag % 5 == 0):
        colorcycle.animate()#循环显示配置输出
    else:
        blink.animate()#闪烁显示配置输出

任务四:分任务一:日历&时钟

    在本实验中通过联网获取数据,实验互联网更新的万年历时钟,并显示当地的天气信息

    综合使用任务一和任务二的代码,先将从网路上获取的数据输出,在数据获取部分需要本地的城市代码,在第三部分中准备了一个Execl文件,其中包含了所有城市的城市代码,方便各位进行查找,对返回的数据进行整理,其中部分格式如下:

{'sysTime1': '20231118195118', 'sysTime2': '2023-11-18 19:51:18'}

{'time': '2023-11-18 19:31:20', 'date': '20231118', 'message': 'success感谢又拍云(upyun.com)提供CDN赞助',

'cityInfo': {'updateTime': '14:46', 'citykey': '101071401', 'city': '葫芦岛市', 'parent': '辽宁'},

'data': {'wendu': '2', 'pm10': 27.0, 'quality': '优', 'shidu': '24%',

'forecast':

[{'notice': '愿你拥有比阳光明媚的心情', 'sunrise': '06:47', 'week': '星期六', 'sunset': '16:37', 'low': '低温 -8℃', 'ymd': '2023-11-18', 'date': '18', 'fl': '3级', 'fx': '西风', 'high': '高温 8℃', 'aqi': 29, 'type': '晴'},

{'notice': '愿你拥有比阳光明媚的心情', 'sunrise': '06:48', 'week': '星期日', 'sunset': '16:36', 'low': '低温 3℃', 'ymd': '2023-11-19', 'date': '19', 'fl': '3级', 'fx': '北风', 'high': '高温 12℃', 'aqi': 23, 'type': '晴'},

    不难看出这是一个大的字典,拥有较多的数据量,跟其中的键值进行分类,根据自己的需求进行显示

    在本实验中以辽宁葫芦岛为例,显示当地的地点信息,对应的时间和空气质量、天气状态、最高温度、最低温度、以及相应的寄语(notice)

    通过连接wifi后每秒对数据进行一次请求,因为数据返回和处理的原因,不能实现实时显示,但可通过降低间隔提高显示刷新,在连接部分,如无法连接到wifi则会输出Wifi connect error等信息,并尝试进行重新连接

下面是任务四使用的相关代码,代码实现了通过互联网更新的万年历时钟,并显示当地的天气信息,具体在代码中有注释
import board
import os, wifi
import time
import ssl
import socketpool
import adafruit_requests

from adafruit_display_text import bitmap_label
from adafruit_bitmap_font import bitmap_font

JSON_TIME_URL = "http://quan.suning.com/getSysTime.do"
JSON_WEATHER_URL = "http://t.weather.sojson.com/api/weather/city/{}"
#请求获取JSON

#获取数据,返回str
def get_date():
    response = requests.get(JSON_TIME_URL)
    time_date = response.json()

    city_code = "101071401"#城市码
    url = JSON_WEATHER_URL.format(city_code)
    response = requests.get(url)
    city_date = response.json()   

    City_Name = city_date['cityInfo']['parent']+'省 '+city_date['cityInfo']['city']
    City_Weather = city_date['data']
    City_Forecast = City_Weather['forecast']
    CurrentTime = time_date['sysTime2'] + '  ' + City_Forecast[0]['week']
    TotalStr = City_Name
    TotalStr += "\n时间:" + CurrentTime
    TotalStr += "\n空气质量:" + City_Weather['quality']
    TotalStr += "\t天气状态:" + City_Forecast[0]['type']
    TotalStr += "\n最高温度:" + City_Forecast[0]['high'][2:]
    TotalStr += "\n最低温度:" + City_Forecast[0]['low'][2:]
    TotalStr += "\n寄语:" + City_Forecast[0]['notice'] 
    #print(type(TotalStr))
    return TotalStr

font = bitmap_font.load_font("Word_bank.pcf")
display = board.DISPLAY
color = {
        "black" : 0x000000,
        "white" : 0xFFFFFF,
        "red" : 0xFF0000,
        "green" : 0x00FF00,
        "blue" : 0x0000FF,
        "yellow" : 0xFFFF00,
        }
def screen_display(text):
    text_area = bitmap_label.Label(font,color=color["white"])
    text_area.scale = 1
    text_area.x = 0
    text_area.y = 5
    text_area.text = text
    display.show(text_area)
#显示屏显示初始化  

while not wifi.radio.connected:
    try:
        wifi.radio.connect('FTP_LI','interlinked')
    except ConnectionError as e:
        print("Wifi connect error:{},wait for retry".format(e))
    time.sleep(0.1)
#wifi连接

pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())


while True:       
    screen_display(get_date())
    time.sleep(1)

第三部分:可编译下载的代码

对于本次【得捷电子Follow me第2期】任务1~4(分任务1)中使用的全部字库文件和相关代码及相关程序文件,已进行打包并上传,这里提供了两个下载方式

百度网盘链接:

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

提取码:h9hr 
下载中心:Follow me第2期 Adafruit ESP32-S3 TFT Feather-嵌入式开发相关资料下载-EEWORLD下载中心

最新回复

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来   详情 回复 发表于 2023-11-23 19:00
点赞 关注
 
 

回复
举报

731

帖子

4

TA的资源

纯净的硅(高级)

沙发
 

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表