任务三:控制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等信息,并尝试进行重新连接