X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
DigiKey得捷技术专区
[作品提交] 【得捷电子Follow me第2期】Adafruit ESP32-S3 TFT Feather_作业提交_汇总
eew_UqDS1M
2023-11-14 02:13
楼主
[TOC] # 视频演示 [视频演示](https://training.eeworld.com.cn/video/38386) # 项目介绍 这次的任务涵盖了四个主要方面,分别是控制屏幕显示中文、使用网络功能、控制WS2812B LED灯带,以及实现日历和时钟功能。我们使用了Adafruit ESP32-S3 TFT Feather开发板来完成这些任务。 Adafruit ESP32-S3 TFT Feather开发板采用了乐鑫ESP32-S3芯片,具备WiFi和蓝牙功能。它还配备了一个ST7789 TFT彩色显示屏,具有良好的图像显示效果。开发板上还集成了4 MB的闪存和2 MB的PSRAM,提供了足够的存储空间来存储程序和数据。 # 项目总结报告 ## 任务1:控制屏幕显示中文
第一个任务是对Adafruit ESP32-S3 TFT Feather开发板完成屏幕的控制,并且能显示中文。为了实现这个任务,我的实现步骤如下: 1. 导入字体文件:首先,我需要获取适用于显示中文的字体文件。在这里我采用的是wenquanyi的10pt字体,我需要将其放在程序的根目录下。wenquanyi字体包可以在(https://www.freshports.org/x11-fonts/wqy/)处下载。 2. 引用相应的库:我需要在程序中引用与显示屏和字体相关的库Adafruit Display Text库和Adafruit Bitmap Font库用于显示文本。 3. 初始化屏幕:在程序的开始部分,您需要初始化屏幕并设置其相关参数。 4. 加载和设置字体:使用Adafruit Bitmap Font库提供的函数,加载我所导入的中文字体文件。根据库的要求,需要进行字体的转换或设置特定的字体属性,如大小和样式。 5. 显示中文文本:使用Adafruit Display Text库提供的函数,选择合适的位置、指定文本的坐标、颜色和对齐方式,然后显示文本。 其代码如下所示: ```python import board import displayio from adafruit_display_text import label, wrap_text_to_lines from adafruit_bitmap_font import bitmap_font def print_chinese(): # 设置要显示的字符串 dis_str = "大家好" # 初始化显示屏 display = board.DISPLAY board.DISPLAY.brightness = 0.35 board.DISPLAY.rotation = 0 # 加载字体和设置颜色 font = bitmap_font.load_font("wenquanyi_10pt.pcf") color = 0x00FFFF # 创建显示文本的组和标签 text_group = displayio.Group() text_area = label.Label(font, text=screen_dispstr(dis_str), color=color) text_area.x = 30 text_area.y = 20 text_area.line_spacing = 1 text_area.scale = 3 text_group.append(text_area) display.show(text_group) # 持续显示 while True: pass def screen_dispstr(str): # 根据屏幕旋转角度确定每行显示的字符数 if board.DISPLAY.rotation % 180 == 0: char_num = 23# 横屏 else: char_num = 13# 竖屏 strbuf = "" for i in range(len(str) / char_num): # 将字符串按每行字符数拆分,并添加换行符 strbuf = strbuf + str[i * char_num:(i + 1) * char_num] + "\n" return strbuf ``` 主函数如下所示: ```python import task1 task1.print_chinese() ``` ## 任务2:网络功能使用 由于内置库已经可以很方便的实现创建热点以及连接wifi的功能,所以这里就不加赘述了,这里是通过调库的方式来实现的。
代码如下: ``` import board import wifi def createwifi(): # 1. 屏幕基础配置 display = board.DISPLAY # 2. 设置wifi和密码 SSID = "MyWIFI" PASSWORD = "11111111" # 3. 启动热点 wifi.radio.start_ap(SSID, PASSWORD) # # 4. 连接wifi # wifi.radio.connect("圣三一学团", "88888888") # 5. 显示IP地址 print("IP:",wifi.radio.ipv4_address) print("AP IP:",wifi.radio.ipv4_address_ap) while True: pass def connectwifi(): # 1. 屏幕基础配置 display = board.DISPLAY # 2. 设置wifi和密码 SSID = "MyWIFI" PASSWORD = "11111111" # # 4. 连接wifi wifi.radio.connect("圣三一学团", "88888888") # 5. 显示IP地址 print("IP:",wifi.radio.ipv4_address) print("AP IP:",wifi.radio.ipv4_address_ap) while True: pass ``` 主函数如下所示: ```python import task2 # task2.createwifi() # task2.connectwifi() ``` ## 任务3:控制WS2812B 任务3的要求是使用按键控制板载Neopixel LED的显示和颜色切换,这里我首先定义了板载按钮`board.BUTTON`作为输入按钮,并在主循环中判断按钮是否按下,然后使用neopixel库来控制板载ws2812B小灯。 并且其中需要注意的是红橙黄绿青蓝紫的十六进制颜色如下所示: | 颜色 | 十六进制代码 | | :| : | | 红 | #FF0000 | | 橙 | #FF7D00 | | 黄 | #FFFF00| |绿|#00FF00| |青|#00FFFF| |蓝|#0000FF| |紫|#FF00FF|
程序如下所示: ``` import time import board import digitalio import neopixel def controlpixel(): button_pin = board.BUTTON # 初始化按钮输入 button = digitalio.DigitalInOut(button_pin) button.direction = digitalio.Direction.INPUT button.pull = digitalio.Pull.UP # 初始化 pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=1) # 定义彩虹循环的颜色列表 colors = [ (0xff, 0, 0), # 红色 (0xff, 0x7d,0), # 橙色 (0xff, 0xff, 0), # 黄色 (0, 0xff, 0), # 绿色 (0, 0xff, 0xff), # 青色 (0, 0, 0xff), # 蓝色 (0xff, 0, 0xff) # 紫色 ] # 初始化颜色索引 color_index = 0 # 主循环 while True: if not button.value:# 判断按钮是否被按下 pixel.fill(colors[color_index]) pixel.show() print(f" {colors[color_index]}") color_index = (color_index + 1) % len(colors) time.sleep(0.1) ``` ## 任务4:日历&时钟 任务4的要求是完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息,为了实现这个功能,我们主要需要完成两个部分: 1. 通过api获取城市的天气信息 2. 通过rtc服务器获得时间信息 3. 显示信息 而其具体的流程如下: 1. 引入必要的库:我们需要引入wifi、socketpool、ssl和adafruit_requests等库,用于处理网络通信和数据获取。 2. 定义显示颜色和字体文件路径:我们可以根据需要定义要在屏幕上使用的显示颜色以及字体文件的路径。 3. 初始化WiFi:首先,我们需要初始化WiFi连接,以便后续能够与互联网进行通信。 4. 建立与HTTP服务器的连接:使用adafruit_requests库,我们可以建立与HTTP服务器的连接,以获取天气信息。这需要使用socketpool和ssl库来创建连接池和安全套接字。 5. 获取天气信息:通过向天气API发送请求,我们可以获取当前的天气、城市信息和天气预报。将服务器返回的数据解析为JSON格式,并提取所需的信息。 6. 处理天气信息:根据需要,由于高德api直接获取的信息是编码形式,我还需要对其解码操作。 7. 生成天气信息字符串:将处理后的天气信息组合成一个字符串,包含各种天气相关的信息。 8. 调整显示屏设置:根据需要,我们可以调整显示屏的亮度和方向,以确保信息在屏幕上的呈现效果良好。 9. 加载字体文件:根据指定的路径加载所需的字体文件,以便后续在屏幕上显示文本时使用。 10. 设置文本标签属性并显示:使用加载的字体,我们可以设置文本标签的属性,例如字体大小和颜色。然后,将文本标签添加到显示组中,并在屏幕上呈现天气信息。 11. 更新显示屏:最后,我们需要更新显示屏,以便将呈现的天气信息显示出来。
其具体实现的程序如下所示: ``` import os # 导入rtc库,实现RTC时钟 import rtc import board #显示部分 import displayio from adafruit_display_text import label from adafruit_bitmap_font import bitmap_font import time #网络部分 import ssl import wifi import socketpool import adafruit_requests import adafruit_ntp def clock(): display = board.DISPLAY #字体设置 font_cn_file = "font/wenquanyi_10pt.pcf" font_weather_file = "font/wenquanyi_10pt.pcf" font_cn = bitmap_font.load_font(font_cn_file) font_weather = bitmap_font.load_font(font_weather_file) #时钟图像组 time_group = displayio.Group( scale = 1, x = 0, y = 0, ) #时间标签 time_area =label.Label(font_cn,text = "%02d:%02d" %(20,20),color = 0xFFFFFF,x=70,y=50) time_group.append(time_area) #天气标签 weather_area =label.Label(font_weather,text = "天气:%s---温度:%s" %("Sunny","25"),color = 0xFFFFFF,x=55,y=80) time_group.append(weather_area) #wifi连接部分 secrets = { "ssid" : "ander", "password" : "anderloki" } print("扫描WiFiw网络:") 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("连接 %s"%secrets["ssid"]) wifi.radio.connect(secrets["ssid"], secrets["password"]) print("连接到 %s!"%secrets["ssid"]) #初始化时间request对象 pool = socketpool.SocketPool(wifi.radio) ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com") # 更新系统时间 rtc.RTC().datetime = ntp.datetime #天气获取函数 def get_weather(): contex = ssl.create_default_context() requests=adafruit_requests.Session(socketpool.SocketPool(wifi.radio),contex) # 设置城市id city = "你的城市代码" # 这里我采用的是高德的apoi key = "你的高德api" weather_url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key # json数据 print("getting: ",weather_url) response = requests.get(weather_url) json = response.json() # 返回天气信息 for data in json["lives"]: return data["weather"], data["temperature"] Ltime = time.localtime() weather_area.text = "天气:%s---温度:%s" %(get_weather()) time_area.text = "%02d:%02d" %(Ltime.tm_hour,Ltime.tm_min) display.show(time_group) #loop函数 while True: Ltime = time.localtime() if (Ltime.tm_sec % 60 == 0): time_area.text = "%02d:%02d" %(Ltime.tm_hour,Ltime.tm_min) print("更新时间") display.show(time_group) if(Ltime.tm_min % 2 != 0): time.sleep(0.9) if (Ltime.tm_sec % 60 == 0 and Ltime.tm_min % 2 == 0): weather_area.text = "天气:%s---温度:%s" %(get_weather()) print("更新天气") display.show(time_group) start = 0 ``` 主程序 ``` # import task1 # import task2 # import task3 import task4 # task1.print_chinese() # # task2.createwifi() # task2.connectwifi() # task3.controlpixel() task4.clock() ``` # 活动心得 作为一名学生,我非常自豪地参加了这次比赛。我要感谢得捷电子和电子工程世界,给予了我们这个宝贵的机会,让我们能够开发并展示自己的技能。他们也创造了一个友好的交流环境,让我们能够与其他参赛者和行业专家进行互动和学习。我衷心感谢电子工程世界,因为他们为我们提供了宝贵的资源和支持。 我在学习的过程中遇到了许多困难和挑战。但是,通过坚持努力,我成功地完成了我的项目。我想特别感谢那些无私奉献的开发者们,他们的辛勤工作和贡献使得库的搭建变得更加简单和高效。他们的付出让我们这些新手能够更快地入门和掌握编程技巧。 总的来说,这次比赛对我来说是一次丰富的经历。从最初的担心和不确定,到最后的任务完成和提交,我在这个过程中成长了许多。这次项目不仅给我带来了技术上的收获,也增强了我的自信心和团队合作能力。我感激这次机会,它让我更加深入地理解了项目开发的过程和价值。 # 源码 源码链接(https://download.eeworld.com.cn/detail/eew_UqDS1M/629863)
点赞
回复评论
暂无评论,赶紧抢沙发吧
最新活动
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
随便看看
STM8stvd编译如何生成可编程的bin文件或者hex文件
【RISC-V MCU CH32V103测评】- 3:USART - 为什么试了三个串口工具都不行?
关于ARM更改SDRAM问题
『难题』tornado调试难题一个
关于恒压源电源和恒流源电源的一些理解,,
cycloneIIFPGA如何产生RSDS输出或者迷你-LVDS输出
warning: parsing restarts here after previous syntax error
求BH1705光照传感器程序 (msp430)
TMS320VC5509运行的基本条件以及过程
请问有哪位知道WF19054是什么功能(方面)的芯片???
UFN驱动程序的Init函数是否创建了线程?
proteus8.3不会建立工程
有关DS18B20的,初学不怎么明白!
电容充放电时间的计算
传感器网络的概念与ZIGBEE的应用0
emwin 在lpc1788上的问题
高手等,USB数据的问题帮帮忙?
求助 BlueNRG-2的Unique device serial number读出来全是FF
蓝牙协议分析_基本概念
转行去卖唱,重新整理剩余的东西,调整价格
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复