476|1

1

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子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下载中心

最新回复

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

回复
举报

731

帖子

4

TA的资源

纯净的硅(高级)

沙发
 

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

 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表