【得捷电子Follow me第2期】任务汇总,天气时钟
[复制链接]
本帖最后由 乔狼和电子学姐 于 2023-11-20 16:51 编辑
首先很高兴能参加本次的得捷电子Follow me第2期的活动!大三电赛结束后心血来潮参加了活动,但由于当时参加活动晚,所以是后发货的一批,当时收到邮件得知提交作品可以延期到12月,再加上最近忙着考研也比较忙,因此就忘了这事。前些日子得到邮件才发现居然已经超过了期限!在咨询工作人员后得知还有最后期限,因此加紧来完成成果展示了。在这里对EEWorld和得捷电子官方深表歉意!同时也赞美官方的宽宏大量!
内容一
自我介绍、硬件介绍与任务展示:
Followme 第二期 自我介绍及成果展示-Followme 第二期 自我介绍及成果展示-EEWORLD大学堂
内容二:任务总结报告
事先声明,笔者主要是通过b站up“忙碌的死龙”(在EEWorld的名字叫walker2048)学习了这块开发板,因此代码可能存在一定相似性,但确实是由笔者自己关闭视频后手动coding的成果,如有雷同。纯属学习成果好:)
任务一:
任务要求:完成屏幕的控制,并且能显示中文:
这个任务为了显示中文需要导入adafruit_bitmap_font模块以添加中文字体。出于对单片机存储空间的考虑,且任务四为天气时钟,因此使用了针对天气优化的字体,只有和天气有关的中文。使用了一个字典,Key为颜色的字符串,Value为颜色对应的RGB码。创建标签,参数包含内容、颜色、坐标,然后添加到组中,最后将组展示即可完成任务。源码如下:
import board
import displayio
from adafruit_bitmap_font import bitmap_font
from adafruit_display_text import label
display = board.DISPLAY
group = displayio.Group()
font = bitmap_font.load_font("/font/sytq_16.pcf")
# 定义一个字典方便使用
color_Dir = {
"purple" : 0x9900FF,
"white" : 0xFFFFFF,
"red" : 0xFF0000,
"green" : 0x00FF00,
"blue" : 0x00FFFF,
"cyan" : 0x00FFFF,
"orange" : 0xFF9900,
"yellow" : 0xFFFF00,
}
group.append(label.Label(font, text="风", color=color_Dir["blue"], x=0, y=60)) # 追加到组中
group.append(label.Label(font, text="雨", color=color_Dir["red"], x=60, y=60))
group.append(label.Label(font, text="雷", color=color_Dir["orange"], x=120, y=60))
group.append(label.Label(font, text="雪", color=color_Dir["purple"], x=180, y=60))
display.show(group) # 显示
while True:
pass
任务二:
任务要求:完成网络功能的使用,能够创建热点和连接到WiFi
这个任务较为简单,也是拿到开发板后所做的第一件事。
连接WIFI:只需要在U盘中settings.toml进行设置,不需要编写python程序。WIFI_SSID和WIFI_PASSWORD设置了待连接的WIFI的名称和密码,WEB_API_PASSWORD和WEB_API_PORT则设置了通过浏览器进入WEB工作流调试的密码和端口。源码如下:
CIRCUITPY_WIFI_SSID = "JOWOLF"
CIRCUITPY_WIFI_PASSWORD = "12345678"
CIRCUITPY_WEB_API_PASSWORD = "123456"
CIRCUITPY_WEB_API_PORT = 80
图为连接好的网络工作流
创建热点:两句话
import wifi
wifi.radio.start_ap('ESP32_TFT', '12345678')
任务三:
任务要求:使用按键控制板载Neopixel LED的显示和颜色切换
这个任务通过导入adafruit_led_animation库可以很简单的完成,将板上的像素灯定义为LED,并创建一个NeoPixel类的对象pixel,只需要再以此创建Blink和ColorCycle类对象即可展示灯效;通过状态机实现不同等效切换,将BOOT0定义为Key,并通过轮询检测按键实现状态切换。源码如下:
import board
import time
import neopixel
from digitalio import DigitalInOut,Direction,Pull
#导入灯效BLink和ColorCycle
from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.colorcycle import ColorCycle
#从adafruit_led_animation.color库导入五种颜色定义
from adafruit_led_animation.color import JADE, BLACK, ORANGE, GOLD, OLD_LACE
#初始化LED灯
LED = board.NEOPIXEL
pixel = neopixel.NeoPixel(LED, 1, brightness=0.3, auto_write=False, pixel_order=neopixel.GRB)
#初始化按键Key
Key = DigitalInOut(board.BOOT0)
Key.direction = Direction.INPUT
Key.pull = Pull.UP # 配置为上拉
#LED模式状态指示物
pixel_flag = 0
blink = Blink(pixel, speed=0.5, color=BLACK)
colorcycle = ColorCycle(pixel, speed=0.5)
#主循环
while True:
# 轮询式按键输入
if not Key.value:
pixel_flag = pixel_flag + 1
if (pixel_flag % 5== 1):
blink = Blink(pixel, speed=1, color=JADE)
print("LED is Blink in JADE slowly")
elif (pixel_flag % 5 == 2):
blink = Blink(pixel, speed=0.1, color=JADE)
print("LED is Blink in JADE quickly")
elif (pixel_flag % 5 == 3):
blink = Blink(pixel, speed=0.5, color=ORANGE)
print("LED is Blink in ORANGE")
elif (pixel_flag % 5 == 4):
blink = Blink(pixel, speed=0.5, color=GOLD)
print("LED is Blink in GOLD")
elif (pixel_flag % 5 == 0):
colorcycle = ColorCycle(pixel, speed=0.3)
print("LED is ColorCycle in RAINBOW")
else:
pass
time.sleep(0.2)
if (pixel_flag % 5 == 0):
colorcycle.animate()
else:
blink.animate()
任务四:
任务要求:完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息
这个任务相对笔者来说有一些困难,因此笔者采用了比较”小聪明“的做法,即时间和天气情况都通过调用json api来获取,每隔30s进行一次,这样就可以实现显示到分的天气时钟了。
使用的天气json数据来自http://t.weather.sojson.com/api/weather/city/101110101
时间json数据来自苏宁的http://quan.suning.com/getSysTime.do
导入了wifi库用于联网,adafruit——requests库用于获取json数据。主要思路就是联网之后获取两个json数据,处理之后存到一个字典中,然后创建一个group,将字典中的数据一个一个创建成标签添加到组中,然后通过display.show显示。每30s就重新获取数据进行一次上述操作。源码如下:
import board
import wifi
import time
import ssl
import socketpool
import adafruit_requests
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
color = {
"black": 0x000000,
"white": 0xFFFFFF,
"red": 0xFF0000,
"green": 0x00FF00,
"blue": 0x0000FF,
"cyan": 0x00FFFF,
"magenta": 0xFF00FF,
"yellow": 0xFFFF00,
"orange" : 0xFF9900,
}
# 获取JSON数据,返回一个字典,包含有城市、天气、温度、湿度、空气质量、时间Key
def get_data():
data_dir = {}
time_date = requests.get(JSON_TIME_URL).json()
city_data = requests.get(JSON_WEATHER_URL).json()
time_list = time_date['sysTime2'].split(" ")
data_dir['date'] = time_list[0]
data_dir['time'] = time_list[1][0:5]
data_dir['city'] = city_data['cityInfo']['city']
data_dir['weather'] = city_data['data']['forecast'][0]['type']
data_dir['temp'] = city_data['data']['wendu']
data_dir['air'] = city_data['data']['quality']
data_dir['humi'] = city_data['data']['shidu']
return data_dir
# wifi连接
while not wifi.radio.connected:
try:
wifi.radio.connect('JOWOLF', '12345678')
except ConnectionError:
print("Wifi connect error:{},wait for retry")
time.sleep(2)
print(f"IP Address:{wifi.radio.ipv4_address}")
# 苏宁的时间URL
JSON_TIME_URL = "http://quan.suning.com/getSysTime.do"
# 修改城市气象代码,即可获取其他城市天气情况
JSON_WEATHER_URL = "http://t.weather.sojson.com/api/weather/city/101110101"
# 显示屏显示初始化
font = bitmap_font.load_font("wenquanyi_9pt.pcf")
display = board.DISPLAY
group = displayio.Group()
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
#开机显示
data_dir = get_data()
timelable = label.Label(font, text=data_dir["time"], color=color["white"], scale=5, x=65, y=20)
datelable = label.Label(font, text=data_dir["date"], color=color["white"], scale=1, x=0, y=60)
citylable = label.Label(font, text=data_dir["city"], color=color["white"], scale=2, x=0, y=80)
wealable = label.Label(font, text=data_dir["weather"], color=color["orange"], scale=2, x=90, y=80)
templable = label.Label(font, text=data_dir["temp"] + "°C", color=color["red"], scale=4, x=140, y=75)
airlable = label.Label(font, text="空气质量:" + data_dir["air"], color=color["green"], scale=1, x=0, y=112)
humilable = label.Label(font, text="湿度:" + data_dir["humi"], color=color["blue"], scale=1, x=100, y=112)
group.append(timelable)
group.append(datelable)
group.append(citylable)
group.append(wealable)
group.append(templable)
group.append(airlable)
group.append(humilable)
display.show(group)
while True:
#每隔30s更新
data_dir = get_data()
timelable.text = data_dir["time"]
datelable.text = data_dir["date"]
citylable.text = data_dir["city"]
wealable.text = data_dir["weather"]
templable.text = data_dir["temp"] + "°C"
airlable.text = "空气质量:" + data_dir["air"]
humilable.text = "湿度:" + data_dir["humi"]
display.show(group)
time.sleep(30)
心得体会:
这是笔者第一次使用python做嵌入式开发,此前在课内用汇编和c写过STC89C52,也用c写过stm32,本次使用python开发的经历真可谓是打开了新世界的大门,非常简单轻松!同时也被circuitPython网络工作了开发环境震惊,非常方便实用。祝EEWorld和Followme活动越办越好!
内容三
源码、库以及使用的字体文件:源码和库和字体-嵌入式开发相关资料下载-EEWORLD下载中心
|