很开心能参加得捷电子Follow me第2期活动,这一次的板卡是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一起使用。
外观指示图
这次我完成了四个任务
任务1:控制屏幕显示中文(必做任务)
完成屏幕的控制,并且能显示中文
搭配器件:Adafruit ESP32-S3 TFT Feather
这里我主要参考大佬们的设计
使用大佬们裁剪的字库,降低字库文件大小,从而确保程序空间足够使用。
使用板载资源需要载入board库,显示功能使用display库实现。设置好显示参数后即可使用display.show函数实现显示字符。
主要调用外部库adafruit_imageload、adafruit_display_text以实现生成一个Group对象,append添加,board.DISPLAY.show进行显示。
代码
import board
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
text_group = displayio.Group()
font = bitmap_font.load_font("\wenquanyi_10pt.pcf")
text_area = label.Label(font, text = "得捷电子Follow me第2期\n任务1:控制屏幕显示中文\n", color=0x149F14)
text_area.x = 3
text_area.y = 5
text_group.append(text_area)
text_area1 = label.Label(font, text = "奇迹12", color=0x149F14)
text_area1.x = 3
text_area1.y = 60
text_group.append(text_area1)
board.DISPLAY.show(text_group)
while True:
pass
任务2:网络功能使用(必做任务)
完成网络功能的使用,能够创建热点和连接到WiFi
搭配器件:Adafruit ESP32-S3 TFT Feather
这一部分比较简单,使用内部库就行
1.连接WiFi
项目通过连接热点实现网络访问,设备连接热点后获取IP地址和相关网络配置信息,从而实现设备的网络联机,核心代码就是wifi.radio.connect
代码
import board
import displayio
import wifi
import adafruit_requests
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
WIFI_SSID = "xxxx"
WIFI_PASSWORD = "xxxx"
wifi.radio.connect(WIFI_SSID, WIFI_PASSWORD)
text_group = displayio.Group()
font = bitmap_font.load_font("\wenquanyi_10pt.pcf")
text_area = label.Label(font, text = "得捷电子Follow me第2期\n任务2:网络功能的使用--创建热点", color=0x149F14)
text_area.x = 3
text_area.y = 5
text_group.append(text_area)
text_area1 = label.Label(font, text = "WIFI已连接\nIP: "+str(wifi.radio.ipv4_address), color=0x149F14)
text_area1.x = 3
text_area1.y = 60
text_group.append(text_area1)
board.DISPLAY.show(text_group)
while True:
pass
2.作为ap使用
也是通过内部库实现,很简单。
import board
import displayio
import wifi
import adafruit_requests
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
AP_SSID = "esp32-s3"
AP_PASSWORD = "123456789"
wifi.radio.start_ap(AP_SSID, AP_PASSWORD)
text_group = displayio.Group()
font = bitmap_font.load_font("\wenquanyi_10pt.pcf")
text_area = label.Label(font, text = "得捷电子Follow me第2期\n任务2:网络功能的使用--创建热点", color=0x149F14)
text_area.x = 3
text_area.y = 5
text_group.append(text_area)
text_area1 = label.Label(font, text = "WIFI: "+AP_SSID+"\nPASSWORD: "+AP_PASSWORD, color=0x149F14)
text_area1.x = 3
text_area1.y = 60
text_group.append(text_area1)
board.DISPLAY.show(text_group)
while True:
pass
任务3:控制WS2812B(必做任务)
使用按键控制板载Neopixel LED的显示和颜色切换
搭配器件:Adafruit ESP32-S3 TFT Feather
控制WS2812B灯珠,主要需要用到adafruit_led_animation,neopixel两个外部库。
读取按键需要调用内部库digitalio和board,分别用于控制io口和获取板载io的信息
import board
import displayio
import digitalio
import neopixel
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
ws2812_state = 0
button = digitalio.DigitalInOut(board.BUTTON)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
pixel.brightness = 0.8
font = bitmap_font.load_font("\wenquanyi_10pt.pcf")
text_area = label.Label(font, text = "得捷电子Follow me第2期\n任务3:控制WS2812B", color=0x149F14)
text_area.x = 3
text_area.y = 5
board.DISPLAY.show(text_area)
while True:
if not button.value and not button_pressed: # 按键被按下且之前未被按下
button_pressed = True
time.sleep(0.1) # 延迟一段时间进行消抖
if not button.value: # 确认按键仍然被按下
if(ws2812_state==0):
pixel.fill(0xFF0000)
ws2812_state+=1;
text_area = label.Label(font, text = "红色", color=0x149F14)
elif(ws2812_state==1):
pixel.fill(0x00FF00)
ws2812_state+=1;
text_area = label.Label(font, text = "绿色", color=0x149F14)
elif(ws2812_state==2):
pixel.fill(0x0000FF)
ws2812_state+=1;
text_area = label.Label(font, text = "蓝色", color=0x149F14)
elif(ws2812_state==3):
pixel.fill(0xFFFFFF)
ws2812_state+=1;
text_area = label.Label(font, text = "白色", color=0x149F14)
else :
pixel.fill(0x000000)
ws2812_state=0;
text_area = label.Label(font, text = "黑色", color=0x149F14)
text_area.x = 20
text_area.y = 20
board.DISPLAY.show(text_area)
elif button.value: # 按键未被按下
button_pressed = False
任务4:从下方5个分任务中选择1个感兴趣的完成即可(必做任务)
■ 分任务1:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息
建议搭配器件:Adafruit ESP32-S3 TFT Feather
项目基于板载屏幕进行时间、日期和天气的显示,调用第三方天气服务接口与时间接口从而获取实时的天气数据和当前时间。
由于未使用RTC,全部靠服务器获取,时间更新比较慢。
代码
import board
import displayio
import wifi
import adafruit_requests
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
import ssl
import socketpool
import adafruit_requests
WIFI_SSID = "qiji"
WIFI_PASSWORD = "123456789"
JSON_XINZHI_URL = "http://api.seniverse.com/v3/weather/now.json?key=xxxxxxxxxx&location=jinan&language=zh-Hans&unit=c"
JSON_TIME_URL = "http://quan.suning.com/getSysTime.do"
wifi.radio.connect(WIFI_SSID, WIFI_PASSWORD)
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
while True:
response = requests.get(JSON_XINZHI_URL)
weather = response.json()
results = weather['results']
location = results[0]['location']
now = results[0]['now']
dis_str = "城市:"+location['name']+"\n"
dis_str += "天气状况:"+now['text']+"\n"
dis_str += "温度:"+now['temperature']+"°C"+"\n"
response = requests.get(JSON_TIME_URL)
timejson = response.json()
dis_str += timejson['sysTime2']+"\n"
display = board.DISPLAY
board.DISPLAY.brightness = 0.9
board.DISPLAY.rotation = 0
font = bitmap_font.load_font("wenquanyi_10pt.pcf")
color = 0x9499CA
text_group = displayio.Group()
text_area = label.Label(font, text=dis_str, color=color)
text_area.x = 0
text_area.y = 10
text_area.line_spacing = 0.8
text_area.scale = 1
text_group.append(text_area)
display.show(text_group)
代码
https://download.eeworld.com.cn/detail/%E5%A5%87%E8%BF%B912/629579
心得体会
很高兴能够参加本次活动,这次活动我学习到了很多知识,也认识了很多大佬,很感谢大佬们开源的代码,让我在项目上少走了很多弯路,也希望以后follow me活动也能越来越好。
|