[作品提交] 【得捷电子Follow me第2期】晓辉的任务提交(完整内容)

louislouis   2023-10-15 09:54 楼主

首先感谢活动主办方得捷电子和eeworld,让我们有机会体验最新的电子产品,领略电子技术的魅力。

本项目包括以下内容:

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

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

搭配器件:Adafruit ESP32-S3 TFT Feather

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

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

搭配器件:Adafruit ESP32-S3 TFT Feather

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

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

搭配器件:Adafruit ESP32-S3 TFT Feather

任务4:从下方5个分任务中选择1个感兴趣的完成即可(必做任务)

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

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

IMG_1880.PNG

任务/项目总结报告:

软件部分:

这款开发板支持python语言编程,可以只借助浏览器提供的ide进行编程和调试,通过浏览器修改code.py文件并保存,即可完成程序编写。

相比传统的单片机和嵌入式微处理器,这款开发板的编程方式更加方便快捷。

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

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

搭配器件:Adafruit ESP32-S3 TFT Feather

项目使用板载屏幕进行中文显示,中文字符的显示需要借助中文字库实现,本项目中使用自制的字库完成。

使用板载资源需要载入board库,显示功能使用display库实现。设置好显示参数后即可使用display.show函数实现显示字符。

字库可以根据实际需要显示的字符进行裁剪,降低字库文件大小,从而确保程序空间足够使用。

代码如下:

import board
import displayio
from adafruit_display_text import label, wrap_text_to_pixels
from adafruit_bitmap_font import bitmap_font

str2display="任务1:控制屏幕显示中文\n出新意与法度之中\n寄妙理于豪放之外\n所谓游刃有余\n运斤成风"

display = board.DISPLAY
board.DISPLAY.brightness = 0.6
font = bitmap_font.load_font("opposans_m_12.pcf")
color = 0xFF7500
background_color = 0x000000
text_group = displayio.Group()
text_area = label.Label(font, text="\n".join(wrap_text_to_pixels(str2display,16)), color=color, background_color=background_color)
text_area.x = 2
text_area.y = 10
text_area.line_spacing = 1.1
text_area.scale = 1
text_group.append(text_area)
display.show(text_group)
while True:
    pass

演示效果如图:

IMG_6302.PNG

通过本任务的实验,使我更加清晰地理解字符显示的原理,为后续项目开发提供思路。

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

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

搭配器件:Adafruit ESP32-S3 TFT Feather

项目通过连接热点实现网络访问,设备连接热点后获取IP地址和相关网络配置信息,从而实现设备的网络联机。

网络功能的使用可以使板子连接上互联网,进而与互联网进行交互拓展。

程序主要需要wifi、ssl、socketpool等库实现,数据请求需要使用adafruit_requests库实现。

代码如下:

secrets = {
'ssid' : 'hiabia',
'password' : '85523425d6134',
'timezone' : "Asia/Shanghai"
}
import wifi
import ssl
import socketpool
import adafruit_requests
import time
wifi.radio.connect(secrets["ssid"], secrets["password"])
print("Connected to {}!".format(secrets["ssid"]))
print("IP:", wifi.radio.ipv4_address)
# 请求URLs
TEXT_URL = "http://wifitest.adafruit.com/testwifi/index.html"
JSON_TIME_URL = "http://quan.suning.com/getSysTime.do"
print("ESP32-S2 WebClient Test")
print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
print(f"Fetching text from {TEXT_URL}")
response = requests.get(TEXT_URL)
print("-" * 40)
print(response.text)
print("-" * 40)
print()
time.sleep(3)
print(f"Fetching and parsing json from {JSON_TIME_URL}")
response = requests.get(JSON_TIME_URL)
print("-" * 40)
print(f"Time: {response.json()['sysTime2']}")
print("-" * 40)
print("Done")

演示效果如图:

IMG_6303.jpeg

通过连接wifi、开启热点等功能的使用,让我们更清晰地理解该开发板的网络连接使用方法,为后续物联网相关功能的开发提供基础。

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

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

项目程序须载入board、time、neopixel等库,board库实现板载资源的相关功能,time库实现时间数据的处理,neopixel库实现ws2812b的控制。

通过配置ws2812b的亮度信息、三原色信息从而可以调用fill函数实现指定颜色的亮灭,效果非常棒。

搭配器件:Adafruit ESP32-S3 TFT Feather

代码如下:

import time
import board
import neopixel
import touchio
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
pixel.brightness = 0.3
touch_A1 = touchio.TouchIn(board.D5)
# touch_A2 = touchio.TouchIn(board.D10)
touch_A3 = touchio.TouchIn(board.D12)
grape = (190, 75, 219)
teal = (56, 217, 169)
red = (20, 100, 219)
while True:
    if touch_A1.value:
        pixel.fill(grape)
        time.sleep(0.05)
    # if touch_A2.value:
    #     pixel.fill(teal)
    #     time.sleep(0.05)
    if touch_A3.value:
        pixel.fill(red)
        time.sleep(0.05)

演示效果如图:

IMG_6304.jpeg
886d8eaf763ad83a093f81916086e88.jpg

 

WS28212B控制LED颜色的功能使用,可以更深刻地理解通信协议、IO接口的相关功能,通过使用WS2812B可以更加精确可靠地控制灯光,降低代码调试的难度,提高开发效率。

任务4:从下方5个分任务中选择1个感兴趣的完成即可(必做任务)

我选择的是分任务1:

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

项目基于板载屏幕进行时间、日期和天气的显示,调用第三方天气服务接口从而获取实时的天气数据。

使用time库管理时间信息,最后,使用一个while循环进行数据信息的定时刷新。

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

代码如下:

import board
import rtc
import wifi
import adafruit_ntp
import os
import ssl
import time
import displayio
import terminalio
import socketpool
import adafruit_requests

from adafruit_display_text import bitmap_label, label

DATA_SOURCE = "http://api.seniverse.com/v3/weather/now.json?key=SG-nLPzA3pyLEy9Tw&location=tianjin&language=en&unit=c"

# --| User Config |--------------------------------
TZ_OFFSET = 8  # time zone offset in hours from UTC
NEO_PIN = board.NEOPIXEL  # neopixel pin
NEO_CNT = 1  # neopixel count
# -------------------------------------------------

# Set up TFT display
display = board.DISPLAY
board.DISPLAY.brightness = 0.55
board.DISPLAY.rotation = 0

group = displayio.Group()

time_color = 0xFF0000

weather_color = 0x00FF00


time_area = label.Label(terminalio.FONT, text="Hello", color=time_color)
time_area.x = 2
time_area.y = 10
time_area.line_spacing = 0.8
time_area.scale = 1

weather_area = label.Label(terminalio.FONT, text="Weather", color=weather_color)
weather_area.x = 2
weather_area.y = 30
weather_area.line_spacing = 0.8
weather_area.scale = 1

main_group = displayio.Group()
main_group.append(group)
main_group.append(time_area)
main_group.append(weather_area)

# Show the main group on the display
display.show(main_group)

# Connect to local network
wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD"))

print("Wifi connected.")

# Get current time using NTP
print("Fetching time from NTP.")
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, server="ntp.aliyun.com", tz_offset=TZ_OFFSET)
rtc.RTC().datetime = ntp.datetime

#
requests = adafruit_requests.Session(pool, ssl.create_default_context())

# Define time interval between requests
time_interval = 3000  # set the time interval to 30 minutes

# Wait for wake up time
now = time.localtime()
print("Current time: {:2}:{:02}:{:02}".format(now.tm_hour, now.tm_min, now.tm_sec))

response = requests.get(DATA_SOURCE)

while True:
    # Fetch weather data from 心知 API
    
    print("Fetching json from", DATA_SOURCE)
    if now.tm_sec == 10:
        response = requests.get(DATA_SOURCE)
    print(response.json())

    # Extract temperature and weather condition data from API response
    current_temp = response.json()["results"][0]["now"]["temperature"]
    current_weather_condition = response.json()["results"][0]["now"]["text"]
    
    current_city = response.json()["results"][0]["location"]["name"]

    print("Weather condition: ", current_weather_condition)
    
    time_area.text = "Hello EEWorld\nTime is {:2}:{:02}:{:02}".format(
        now.tm_hour, now.tm_min, now.tm_sec
    )
    
    weather_area.text="City: " + current_city+"\n"\
    +"Temperature: {}".format(current_temp)+"\n"\
    +"Weather: "+ current_weather_condition

    # just sleep until next time check
    time.sleep(0.5)
    now = time.localtime()

演示效果如图:

IMG_6305.jpeg

该任务是一个相对综合应用的任务,分别使用了网络连接、数据请求、界面显示等功能,可以很好地锻炼代码编写。

在项目的各项任务完成过程中,还学习了图片显示、触摸按键等功能,体验到了这款板子的强大功能,希望得捷电子和电子工程世界官方可以继续多举办类似活动,带领更多电子爱好者体验电子的乐趣。

可编译下载的代码:

最后,项目代码如下:

项目代码
 

本帖最后由 louislouis 于 2023-10-15 09:53 编辑

    代码.zip (2023-10-15 08:55 上传)

    6.78 MB, 下载次数: 4

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复