588|3

3

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子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期的活动中,我受益匪浅!

 

源码:>>  点击下载

最新回复

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来   详情 回复 发表于 2023-11-21 18:34
点赞 关注
 
 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

相较于网络使用任务,天气时钟则是在其基础上添加了显示部分,将从网络获取的时间和天气信息显示在板载屏幕上,,

整的不错了

加油!

 
 
 

回复

3

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
 
 

回复

731

帖子

4

TA的资源

纯净的硅(高级)

4
 

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表