[作品提交] 【得捷电子Follow me第2期】任务提交

bjm212501   2023-10-13 20:32 楼主

应主办方要求,需要每个任务分别完成,所以再投一帖

对汇总帖感兴趣的可以移步 http://bbs.eeworld.com.cn/thread-1258882-1-1.html

在此再次感谢DigiKey和EEworld组织的Follow me 第2期活动,让我有机会零成本入门Adafruit ESP32-S3 TFT Feather

 

第一部分

汇报视频- 【得捷电子Follow me第2期】视频汇报-EEWORLD大学堂

 


 

第二部分

 

任务一 显示中文

说实话,我觉得这个任务的主要难点在于字体的制作

import board 
import displayio
from adafruit_display_text import label #外置库
from adafruit_bitmap_font import bitmap_font #外置库

display = board.DISPLAY
group = displayio.Group()

font = bitmap_font.load_font("/font/sh_20.pcf") #导入字体

def labletext(x, y, text, font=font, color=0xFFFFFF): #生成标签函数,默认字体为font,颜色为白
    return label.Label(font, text=text, color=color, x=x, y=y)

text = labletext(45, 65, "你好,世界!")

group.append(text) #将文字的标签加入显示组

display.show(group) #让屏幕更新,显示显示组

while True: #有死循环界面才会一直保持
    pass

效果如图:

7c8b230a7648ae0ba112789236e0f46.jpg

照相技术不怎么好,请忽略

 

任务二 链接wifi&创建热点

这个任务很简单,甚至完全没有成就感

首先,连接wifi需要在settings.toml中写入以下内容,这样每次就会自己连接,不用在每个代码中操作

CIRCUITPY_WIFI_SSID = "你的wifi名称"
CIRCUITPY_WIFI_PASSWORD = "你的wifi密码"

第一次重启后往往连不上,不用急,重开三四次就会有了

b24a8cafb4cfc7f61f5b83aa7d7bfc0.jpg

左上角出现ip说明联网成功

创建热点则仅需要以下代码

import wifi

wifi.radio.start_ap('Follow_me_Task2', '88888888')#设置热点名称与密码
print("Hotspot Launched")#控制台提示,可以删除

#对,就这么简单

效果如下,能用手机搜出来即可

40985cde2adf975a26d9131710bde6c.jpg

 

任务三 按键控制LED

终于出现了,看不懂的东西!

import board
import time
import neopixel
from digitalio import DigitalInOut, Direction, Pull

pixel_pin = board.NEOPIXEL
pixels = neopixel.NeoPixel(pixel_pin, 1, brightness=0.1, auto_write=False) #使用neopixel实例化控制灯

def pixelsetcolor(c):#因为反正就这一个像素,所以直接偷个懒写个换色方法
    pixels[0] = c 
    pixels.show() #更新

btn = DigitalInOut(board.BOOT0) 
btn.direction = Direction.INPUT # 这行和下一行我都不太明白具体是做什么,请大佬补充(
btn.pull = Pull.UP #好像是叫设置上拉,不过我没太理解

color = 0

while True: #主循环
    if not btn.value: #btn.value在平常是1,按下时是0
        if color % 8 == 0:
            pixelsetcolor(0xFF0000)
            print("Pixel is R")
        elif color % 8 == 1:
            pixelsetcolor(0x00FF00)
            print("Pixel is G")
        elif color % 8 == 2:
            pixelsetcolor(0x0000FF)
            print("Pixel is B")
        elif color % 8 == 3:
            pixelsetcolor(0xFFFF00)
            print("Pixel is Yellow")
        elif color % 8 == 4:
            pixelsetcolor(0xFF00FF)
            print("Pixel is Megenta")
        elif color % 8 == 5:
            pixelsetcolor(0x00FFFF)
            print("Pixel is Cyan")
        elif color % 8 == 6:
            pixelsetcolor(0xFFFFFF)
            print("Pixel is Light")
        elif color % 8 == 7:
            pixelsetcolor(0x000000)
            print("Pixel is Dark")
        color += 1
    else:
        pass
    time.sleep(0.2)#有效点击间隔

效果如下,不过这个需要按按键所以详细效果请参考视频

dcf81235a62eb3b789f5d2e9d58eba5.jpg

 

任务四  分任务1 天气时钟

大任务简单说下结构:

图片背景和文字的显示方法差不多,不过需要一个加载图片的库

文字标签是可以更改文字的,可以利用这点来更新

使用网络相关功能校准时间以及获取天气

主循环内每秒更新一次时间,每小时更新一次天气等其他信息

import board, displayio
import rtc, wifi, ssl
import time as Time
import socketpool
import adafruit_imageload
import adafruit_ntp
import adafruit_requests
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font

display = board.DISPLAY
group = displayio.Group()

def lableimage(path): #生成图片标签方法
    image, palette = adafruit_imageload.load(path) 
    return displayio.TileGrid(image, pixel_shader=palette) 

grid = lableimage("/img/ddw.png") #实例化图片标签

group.append(grid) #加入显示组

font = bitmap_font.load_font("/font/sytq_16.pcf") #导入字体
timef = bitmap_font.load_font("/font/time.bdf")

def labletext(x, y, text, font=font, color=0x000000): #生成文字标签方法
    return label.Label(font, text=text, color=color, x=x, y=y)

#依次实例化并加入显示组
date = labletext(48, 20, "0月0日")
day = labletext(150, 20, "周八")
time = labletext(22, 58, "00:00", font=timef)
weather = labletext(12, 112, "?")
temp = labletext(198, 112, "00°")

group.append(date)
group.append(day)
group.append(time)
group.append(weather)
group.append(temp)

#从网上校准时间
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
rtc.RTC().datetime = ntp.datetime

#设置响应
requests = adafruit_requests.Session(pool, ssl.create_default_context())

def get_weather(): #获取时间方法
    city = "120101" #地区代码,根据实际情况更改
    key = "自行填写" #使用了高德的ipa,可以自行申请
    url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key
    response = requests.get(url)
    json_resp = response.json()
    response.close()
	#返回温度和天气两个值
    return json_resp["lives"][0]["temperature"], json_resp["lives"][0]["weather"]

days = ["周一","周二","周三","周四","周五","周六","周日"]
state = "init"

while True:
    n = Time.localtime()
    if (state == "init" or n.tm_min == 0):
		#更新标签内容
        date.text = "%d月%d日" % (n.tm_mon, n.tm_mday)
        day.text = days[n.tm_wday]
        t, w = get_weather()
        weather.text = w
        temp.text = "%s°" % (t)
        state = "running"
	#更新时间并显示
    time.text = "%02d:%02d" % (n.tm_hour, n.tm_min)
    display.show(group)
    Time.sleep(1)

效果如图

44e0a5e9edd02c3cbfabaced6198e8e.jpg

 


 

第三部分

源码下载:download.eeworld.com.cn/detail/bjm212501/629534

提示:源码中的settings.toml需要自行更改;代码中填写的apikey已经失效,请自行申请,运行会报错KeyError: lives

 

心得体会、意见及建议
本次活动的adafruit板子使用了用途广泛的esp32,并且有非常完整的开发文档,为我们操作查错提供了很大的便利,唯一一点美中不足就是flash,装几个字库就没地方了哈哈哈。首次体验了针对化的python语言编程,操作简单,开放度高,学习性及可玩性强,非常感谢eeworld和digikey举办此次活动,并希望活动举办更多类似活动。

 

回复评论

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