基于RP2040游戏机制作简易气象站
这次参加2022暑假在家一起练活动,我采用RP2040和ESP32-s2制作了一个小型气象站,在这个过程中遇到了很多问题,也学到了很多的知识,受益良多。
标签
嵌入式系统
RP2040
ESP32-S2
2022暑假在家练
英语不会
更新2022-09-02
集美大学诚毅学院
668

基于RP2040游戏机制作简易气象站

一:项目要求

RP2040 Game Kit板通过提供的ESP32-S2的WiFi模块连接网络

在RP2040 Game Kit上显示某一个城市的气象信息 - 时间、温度、湿度、气压....

通过RP2040 Game Kit上的按键能够切换显示不同城市的信息 ,比如:上海、苏州、东京、洛杉矶、伦敦

二:项目设计思路

1.通过使用AT指令集,同时向esp32-s2的板子中烧录AT固件,编写程序使esp32-s2连接到wifi,然后通过心知天气网得API查询五个城市的天气,温度,时间。

2.通过编写程序,设置按键A作为切换天气时使用的按键。

3.通过json将获取到的信息进行解码,同时编写程序使lcd屏幕亮起传递解码后的城市信息。

Fq0EGAcj6Yf0Lrb7zKj4xvYUlHLR

三:硬件部分

这次的项目用了RP2040 Game Kit是基于树莓派RP2040的嵌入式系统学习平台,通过USB Type-C连接器供电,采用RP2040作为主控,可通过MicroPython或C/C++编程,性能强大。同时使用板子上的A按键作为切换使用,并有240*240分辨率的彩色LCD屏显示,配套的ESP32 S2 开发板除了ESP32wifi模组之外还集成了USB TYPE -C接口,两个按键,一个电源指示灯,一个用户LED灯,2排10pin的排针,将重要IO引出。ESP32-S2 是一款高度集成、高性价比、低功耗、主打安全的单核 Wi-Fi SoC,具备强大的功能和丰富的 IO 接口。使用乐鑫ESP-IF开发环境,我们可以通过USB对其编程,作为带wifi的MCU单独使用,也可以烧录AT固件,作为WiFi透传模块与RP2040游戏机套件结合使用。

四:主要代码部分说明

首先是导入使用的模块

import os
import time
import utime
import ujson
import machine
import _thread
import network
from machine import UART, Pin

然后是屏幕模块的调用以及自定义变量[pos]其中包括需要查找五个城市,屏幕模块是使用st7789模块,同时也进行的屏幕的初始化。

#屏幕
import st7789 as st7789
from fonts import vga1_16x32 as font1 
from fonts import vga2_8x8 as font2
import random
import framebuf
#自定义变量地点
pos =['beijing', 'shanghai', 'guangzhou', 'shenzhen','wuhan']
#屏幕初始化
st7789_res = 0
st7789_dc  = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
spi_sck=machine.Pin(2)
spi_tx=machine.Pin(3)
spi0=machine.SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
display = st7789.ST7789(spi0, disp_width, disp_width,
                          reset=machine.Pin(st7789_res, machine.Pin.OUT),
                          dc=machine.Pin(st7789_dc, machine.Pin.OUT),
                          xstart=0, ystart=0, rotation=0)

对按键A进行初始化设置。

buttonA = Pin(6,Pin.IN, Pin.PULL_UP) 

这部分程序是为了进行加载之前的测试,同时也是提醒用户还在加载中。

display.text(font2, "loading...", 10,60)
display.text(font1,"www.eetree.cn",0,200)

这一段代码是联网部分,使用了老师上课所讲的AT指令,其中“作业....”“150.....”是我的wifi和密码,大家可以更换成自己家中的wifi和密码,而key=‘Se....’是在心知天气上面免费注册得到的秘钥,这次查找天气部分也需要用到。

network_AT = network.Network(uart=UART(0, baudrate=115200, tx=Pin(12), rx=Pin(13)),
                             recvInfo="",  # receive buffer global variable
                             cmd_retore='AT+RESTORE',
                             cmd_mode='AT+CWMODE=1',  # config as station
                             cmd_inquiry='AT+CIPSTA?',  # inquiry the IP address
                             cmd_connectRouter='AT+CWJAP="作业","15060786575"',  # connect to Router
                             cmd_httpget='AT+HTTPCLIENT=2,0,"https://api.seniverse.com/v3/weather/now.json?key=S95Bj6jTY544NZSY5&location=beijing&language=en&unit=c",,,2',
                             cmd_ack='OK'
                             )

time.sleep(1)

接下来这一部分是联网成功的判断,要用到老师上课所讲的网络模块,在其中我定义了count部分,目的是为了达成循环进行判断,在判断成功后将结果通过display显示到lcd屏幕上面。

if(network_AT.connectNetwork() == True):
    # STATUS
    # 0:config network error
    # 1:config network ok
    # 2:http get error
    # 3:http get ok
    network_status = 1
    print('Done!')
    display.text(font1, "Press A to start",0, 120)

    time.sleep(1)
    
else:
    network_status = 0
    print('NetWork Config Error!')
time.sleep(1)
count = 0

page=0
while True:
    if(network_status == 0):
        if(network_AT.connectNetwork() == True):
            print('config network Done!')
            network_status = 1
        else:
            network_status = 0
            print('NetWork Config Error!')
            
               
    elif(network_status == 1):
        if(network_AT.httpGet() == True):
            count = (count+1) % 5
                       
                                  
            network_AT.cmd_httpget = f'AT+HTTPCLIENT=2,0,"https://api.seniverse.com/v3/weather/now.json?key=S95Bj6jTY544NZSY5&location={pos[count]}&language=en&unit=c",,,2'
            
            time.sleep(1)            

            network_status = 3
       
            
            print('HttpGet Done!')
        else:
            network_status = 2
                      
    
    elif(network_status == 2):
        network_status = 1
        time.sleep(1)
        print('HttpGet try again!')
             
    elif(network_status == 3):

后面的这一部分包括按下按键之后城市的切换,以及通过json指令代码解析从心知天气上面获取的信息。

        buttonValueA = buttonA.value()
        if(buttonValueA==0):#按下为0
                       
            print(network_AT.recvInfo)
            
            str_start = network_AT.recvInfo.find('{')
            print(str_start)
            str_end = network_AT.recvInfo.find(']}')
            print(str_end)
            weatherInfo_str = network_AT.recvInfo[str_start:str_end+2]
            print(weatherInfo_str)

            weather_json = ujson.loads(weatherInfo_str)
            weather_location = weather_json['results'][0]['location']['name']
            print(weather_location, end=' ')
            weather_text=weather_json['results'][0]['now']['text']
            weather_now = weather_json['results'][0]['now']['code']#下面图片选择
            print(weather_now, end=' ')
            weather_temp = weather_json['results'][0]['now']['temperature']
            print(weather_temp, end='℃')
            weather_time = weather_json['results'][0]['last_update']
            print(weather_time)
            weather_humi = weather_json['results'][0]['now']['humidity']
            print(weather_humi)
            weather_pressure = weather_json['results'][0]['now']['pressure']
            print(weather_pressure)

最后的部分则是将从心知天气上面获得的天气情况代码通过运算从库中调用出来,在通过display与其他信息一同显示在lcd屏幕上。

            #图片
            str1="/weather1/"
            str2 = str(weather_now)
            str3 = ".bin"
            tu = str1+str2+str3
            print(tu)
            f_tu = open(tu, 'rb')
            buf = f_tu.read(6000)
            
            
            #屏幕
            display.fill(st7789.BLACK)
            display.blit_buffer(buf,160,0, 51,0)
            display.text(font1, weather_location, 10, 20)
            display.text(font1, weather_text,0, 100)
            display.text(font1, weather_temp+"c", 0, 150)
            display.text(font1, weather_time[11:16], 120, 150)
            display.text(font1, weather_time[0:10], 0, 200)
            display.text(font1, 'hum:'+weather_humi, 130, 100)
            display.text(font1, 'prs:'+weather_pressure, 0, 65)

            network_status = 1

五:遇到的主要麻烦

1.因为我一开始学习的是C++,但是此次活动大多数是使用Micro python进行编程,所以在写语法的过程中发现有的写法是有太不一样的,后来我去看了一下别人之前制作的例子,并学习了一些python的内容,然后解决了程序编写上的问题,在这个过程中,我也学到了很多知识。

2.第1次接触rp2040以及esp32-s2模块,在rp2040上面虽然它的按键布局较少,但如何调用是一开始困扰我的大难题,后来一直通过查找资料,同时查找设计图最后找到了需要的部分,才明白了如何调用。

3.SP32-S2WiFi模块它运行的不稳定,包括烧录固件过程中会出现失败,还有运行过程中会延迟,后来尝试了很多方法,例如重启程序,更换软件重新烧录,检查接线以及端口,最终可以完成运行。

4.在接线的过程中,需要我不断的去查找RP2040的图以及ESP32-S2的程序同时要找到它们相应的广角,一开始由于我读图技术的问题比较慢,也读错了不少次,但在后来不断的更正之下,终于找到了正确的地方。

六:未来的计划与建议

这是我第1次参加硬禾学堂电子森林的活动,通过这一次的活动,我深深体会到了rp20400及esp32-s2模块的强大,也在这个期间学会了很多的技能,学到了很多的东西,同时也认识到了自己还有很多不足的地方,例如在利用结构图去寻找相应的接口以及接线上还需要提升,在以后放假的时间里,我会尽力去再做一些与专业知识,相关的知识,并做到实践和理论相结合,为以后的学习添加更多的内容,在这个过程中不断进步,不断成长。同时能够学到更多的技术,也学会了一个新的编程语言micropython以及新的软件thonny,这两者都特别适合初学者尝试,也让我认识到自己一些语法上的错误和改正,最后感谢硬禾学堂提供的这次2022暑假一起练活动。

附件下载
最后版本基于rp2040和esp32的简易气象站.zip
团队介绍
集美大学诚毅学院
团队成员
英语不会
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号