【得捷电子Follow me第2期】任务大集合
[复制链接]
板子拿的比较晚,把任务完成后又一大堆事搞得没时间编辑帖子和拍视频,今天事情搞完,来画个句号。
视频链接是这个:菜鸟任务大集合
话不多说,先上任务代码、效果和代码解释,心得体会就放在帖子的最后吧。
任务一:显示中文
实现代码如下。导入的库中,board是使用屏幕的基础,displayio则用于具体控制,time用于延时,lable则是标签作用,bitmap_font则用于字库文字的显示。
import board
import displayio
import time
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
#屏幕基础配置
display = board.DISPLAY
#字体设置
font_cn_file = "fonts/JingHongXingKai-Regular-50.bdf"
font_cn = bitmap_font.load_font(font_cn_file)
#创建一个图像组,比例设置为1
text_group = displayio.Group(
scale=1,
x=0,
y=35,
)
#主循环
while True:
text_cn = "流梓"
text_cn_area = label.Label(font_cn, text=text_cn, color=0xFFFFFF, x=75, y=0)
text_group.append(text_cn_area) #添加第一行文字到图像组
text_cn = "汉字显示"
text_cn_area = label.Label(font_cn, text=text_cn, color=0xFFFFFF, x=25, y=50)
text_group.append(text_cn_area) #添加第二行文字到图像组
display.show(text_group)
关于这个字体“惊鸿行楷”,是从字体网站下载后,使用FontForge生成.bdf供显示使用,具体如何操作可以看乔帮主的直播教程。
显示的主要部分在于创建一个图像组,然后向这个图像组中添加标签,标签对应文本或图片内容。关于图像组,设置的时候指定了在屏幕坐标系中的一个位置,那么加下来标签的位置是在图像组的坐标系中定位的,scale参数用于缩放,实测放大后点阵汉字显示效果较差,大概是因为字体分辨率不高,放大就糊了。
任务二:网络功能使用
对于任务二,我是联合天气时钟项目一起完成的。毕竟如果想要获取时间和实时天气,就必须要使用网络功能。这里把天气时钟的请求部分分离出来作为演示。
网络部分运行结果如下,可以看到对局域网进行了扫描,并连接到了我的热点“流梓的IPhone”,接着对高德发送请求以获得天气信息。
实现代码如下,库的导入在代码中有说明。前段时间简单玩过ESP32的网络功能,也是跟着教程走,这次换到Python,发现大致流程相近,Python的操作在库的帮助下更为简单,只需要创建一个连接池,就可以进行各种各样的网络请求操作,十分方便,对我这种网络小白也很友好。
对于网络连接的详细原理,受制于匮乏的网络知识,我无法做详细阐述,代码的原理请听其他大佬的讲解,因为我也是看他们的讲解慢慢摸索的😂
# 导入os库,用来获取wifi信息
import os
# 导入rtc库,实现RTC时钟
import rtc
import board
#显示部分
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
#网络部分
import ssl
import wifi
import socketpool
import adafruit_requests
import adafruit_ntp
#选择板载屏幕
display = board.DISPLAY
#字体设置
font_cn_file = "fonts/JingHongXingKai-Regular-50.bdf"
font_weather_file = "fonts/JingHongXingKai-17.bdf"
font_cn = bitmap_font.load_font(font_cn_file)
font_weather = bitmap_font.load_font(font_weather_file)
#wifi连接部分
secrets = {
"ssid" : "你的热点",
"password" : "你的密码"
}
print("扫描WiFiw网络:")
for network in wifi.radio.start_scanning_networks():
print("\t%s\t\tRSSI: %d\tChannel: %d" % (str(network.ssid, "utf-8"),
network.rssi, network.channel))
wifi.radio.stop_scanning_networks()
print("连接 %s"%secrets["ssid"])
wifi.radio.connect(secrets["ssid"], secrets["password"])
print("连接到 %s!"%secrets["ssid"])
#初始化时间request对象
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
# 更新系统时间
rtc.RTC().datetime = ntp.datetime
#天气获取函数
def get_weather():
contex = ssl.create_default_context()
requests=adafruit_requests.Session(socketpool.SocketPool(wifi.radio),contex)
weather_url = "申请到的API"
# json数据
print("getting: ",weather_url)
response = requests.get(weather_url)
json = response.json()
# 返回天气信息
for data in json["lives"]:
return data["weather"], data["temperature"]
对于热点的创建,请看代码,主要是使用了os库的ap功能,可以方便的打开热点。
import board
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import os
import wifi
wifi.radio.start_ap('流梓的WiFi','liuzidewifi') #启动热点,设置名称和密码
#选择板载屏幕
display = board.DISPLAY
#字体设置
font_cn_file ="fonts/JingHongXingKai-17.bdf"
font_cn = bitmap_font.load_font(font_cn_file)
wifi_group = displayio.Group(
scale = 1,
x = 17,
y = 17,
)
wifi_area =label.Label(font_cn,text = "WIFI名字: 流梓的WiFi\nPassWord:liuzidewifi",color = 0xFFFFFF,x=0,y=0)
wifi_group.append(wifi_area)
display.show(wifi_group)
while True:
pass
实现效果如下:
任务三:WS2812B控制
这项任务需要控制板载的WS2812,我使用Boot按键来控制,实现了按一下按键,灯珠颜色进行一次渐变后熄灭。具体效果图片不好展示,可以待会儿看视频。
直接上代码
import time
import board
import digitalio
import neopixel
# board.BUTTON 与 board.BOOT0 等同
button = digitalio.DigitalInOut(board.BUTTON)
button.switch_to_input(pull=digitalio.Pull.UP)
"开启板载WS2812供电"
power = digitalio.DigitalInOut(board.NEOPIXEL_POWER)
"设置引脚为输出模式"
power.direction = digitalio.Direction.OUTPUT
"设置引脚输出高电平"
power.value = True
"创建灯珠对象,数量为1,引脚为board.neopixel"
pixel = neopixel.NeoPixel(board.NEOPIXEL,1)
"设置合适灯珠亮度"
pixel.brightness = 0.1
"模式参数"
mode = 0
status = False
while True:
if not button.value:
if status == False:
print("BUTTON")
status = True
mode += 1
else:
status = False
if mode == 1:
for G in range(0,255):
pixel.fill((255,G,0))
time.sleep(0.001)
for R in range(0,255):
pixel.fill((255-R,255,0))
time.sleep(0.001)
for B in range(0,255):
pixel.fill((0,255,B))
time.sleep(0.001)
for G in range(0,255):
pixel.fill((0,255-G,255))
time.sleep(0.001)
for R in range(0,255):
pixel.fill((R,0,255))
time.sleep(0.001)
for B in range(0,255):
pixel.fill((255,0,255-B))
time.sleep(0.001)
pixel.fill((0,0,0))
mode = 0
这后面臭长臭长的一段循环是渐变的土法子😂,思路来源于在CSDN看到的一张图:
按照这三条线配置R、G、B值实现渐变效果。此外,我感觉各类板子的引脚配置流程都差不多,Python配置起来最为简单。
任务四:分任务1
之前盘ESP32做的就是一个有天气时钟功能的小玩意,这次就选了这个。
一样,先上图:
可以和电脑时间做个对比,武汉最近降温有点厉害,这鬼天气。
实现代码如下:
# 导入os库,用来获取wifi信息
import os
# 导入rtc库,实现RTC时钟
import rtc
import board
#显示部分
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
#网络部分
import ssl
import wifi
import socketpool
import adafruit_requests
import adafruit_ntp
#选择板载屏幕
display = board.DISPLAY
#字体设置
font_cn_file = "fonts/JingHongXingKai-Regular-50.bdf"
font_weather_file = "fonts/JingHongXingKai-17.bdf"
font_cn = bitmap_font.load_font(font_cn_file)
font_weather = bitmap_font.load_font(font_weather_file)
#时钟图像组
time_group = displayio.Group(
scale = 1,
x = 0,
y = 0,
)
#时间标签
time_area =label.Label(font_cn,text = "%02d:%02d" %(20,20),color = 0xFFFFFF,x=70,y=50)
time_group.append(time_area)
#天气标签
weather_area =label.Label(font_weather,text = "天气:%s---温度:%s" %("Sunny","25"),color = 0xFFFFFF,x=55,y=80)
time_group.append(weather_area)
#wifi连接部分
secrets = {
"ssid" : "你的热点",
"password" : "你的密码"
}
print("扫描WiFiw网络:")
for network in wifi.radio.start_scanning_networks():
print("\t%s\t\tRSSI: %d\tChannel: %d" % (str(network.ssid, "utf-8"),
network.rssi, network.channel))
wifi.radio.stop_scanning_networks()
print("连接 %s"%secrets["ssid"])
wifi.radio.connect(secrets["ssid"], secrets["password"])
print("连接到 %s!"%secrets["ssid"])
#初始化时间request对象
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
# 更新系统时间
rtc.RTC().datetime = ntp.datetime
#天气获取函数
def get_weather():
contex = ssl.create_default_context()
requests=adafruit_requests.Session(socketpool.SocketPool(wifi.radio),contex)
weather_url = "你的API"
# json数据
print("getting: ",weather_url)
response = requests.get(weather_url)
json = response.json()
# 返回天气信息
for data in json["lives"]:
return data["weather"], data["temperature"]
Ltime = time.localtime()
weather_area.text = "天气:%s---温度:%s" %(get_weather())
time_area.text = "%02d:%02d" %(Ltime.tm_hour,Ltime.tm_min)
display.show(time_group)
#loop函数
while True:
Ltime = time.localtime()
if (Ltime.tm_sec % 60 == 0):
time_area.text = "%02d:%02d" %(Ltime.tm_hour,Ltime.tm_min)
print("更新时间")
display.show(time_group)
if(Ltime.tm_min % 2 != 0):
time.sleep(0.9)
if (Ltime.tm_sec % 60 == 0 and Ltime.tm_min % 2 == 0):
weather_area.text = "天气:%s---温度:%s" %(get_weather())
print("更新天气")
display.show(time_group)
start = 0
可以看到,相较于网络使用任务,天气时钟则是在其基础上添加了显示部分,将从网络获取的时间和天气信息显示在板载屏幕上。使用的两种字体只在大小上有区别,因为用scale放大的话糊了不好看。循环里的判断语句则是设置为每两分钟更新一次天气信息,保证实时性。
好了,任务的代码和效果就是上面写的那样,下面简单讲讲我的心得吧。楼主是个大学牲,之前接触到的嵌入式开发诸如Arduino、ESP32、STM32大都使用C语言进行开发,这次浅尝Python,首先不太适应的就是语法,Python的严格缩进制裁了我代码不规范的问题,不尽相同的配置流程也开拓了我的视野。Python的易用性给我留下了很深的印象,也许,我会把这块板子用于接下来的宿舍桌面改造工程中,用它控制诸如ws2812灯带、补充照明灯等设备。总的来说,在Follow me 第2期的活动中,我受益匪浅!
源码:>> 点击下载
|