1.项目介绍
我在本次2022暑假在家练活动中选择的是树莓派RP2040的嵌入式系统学习平台,这个开发平台可以使用C、C++和MicroPython进行开发编程。我在本次活动中选择项目3 简易气象站。
2.整体设计思路
- 适用esp32作为客户端,烧录AT固件,让rp2040与esp32通过AT指令实现联网通信
- 通过ADC读取X、Y轴摇杆电位器电压值,我设置的是向下向右摇实现城市的切换
3.框图和软件流程图
4.简单的硬件介绍
rp2040,实际上就是树莓派raspberry pi pico。RP2040是Raspberry Pi 的首款微控制器。它为微控制器领域带来了我们高性能、低成本和易用性的标志性价值。RP2040 提供了硬件SPI总线以及硬件 I2C 总线各两组,我们可以使用一组SPI总线控制LCD屏幕,使用一组I2C总线接收姿态传感器的返回数据。他的优点是双核Arm Cortex M0+内核,可以运行到133MHz;264KB内存;性能强大、高度灵活的可编程IO可用于高速数字接口。
ESP32-S2-MINI-1模组由我国高新技术企业乐鑫科技推出的一款带2.4 GHz WiFi 模组,他内置 ESP32S2 系列芯片,Xtensa® 单核 32 位 LX7 微处理器;内置芯片叠封 4 MB flash,可叠封 2 MB PSRAM。拥有37 个 GPIO,可以搭载丰富的外设,板载的PCB 天线提高了无线传输能力。
四向摇杆是通过电压的变化值即可,判断摇杆是往哪个方向拨动。
本次暑期一起练,结合了rp2040和esp32的优点做出了这个项目。
5.实现的功能及图片展示
成功通过esp32联网获取信息
板子开机显示connecting....界面,待连接wifi成功后显示“SUCCEED”
等待通过http请求从心知天气获取实时天气信息后,摇杆确认,屏幕展示。
在每一次成功获取数据准备好后,就会让屏幕变蓝色,“try joysticks”尝试一下摇杆,发现向下摇和向右摇可以进入界面
进入界面,可以看到城市名,实时天气图标,温度,湿度,气压,最后更新时间和城市所在时区。
这里我设置了几个城市,有汕头,厦门,伦敦(用来看时区变化的),北京,珠海。可以通过我提供的源码进行一一尝试,可是我的心知天气没有付费是试用版,如果要请求伦敦的天气还请记得更换秘钥哦!否则将无法解析返回的json值!将会直接报错退出程序.......
摇杆控制五个城市轮流播放后,将会回到第一个城市,依次循环播放。
5.主要代码片段及说明
首先是联网,这里需要前期准备工作,把AT固件烧录到esp32中,引入需要的库,认好rx/tx的接线,然后在rp2040当中调试。
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="12344","qwertyui"', # connect to Router
cmd_httpget='AT+HTTPCLIENT=2,0,"https://api.seniverse.com/v3/weather/now.json?key=S9cFGkU9-8xUWGEKe&location=shantou&language=en&unit=c",,,2',
cmd_ack='OK'
)
time.sleep(2)
if(network_AT.connectNetwork() == True):
network_status = 1
print('Done!')
display.text(font2, "SUCCEED", 35, 150)
time.sleep(1)
display.text(font2, "turning blue...", 0, 200,0xfb08)
else:
network_status = 0
print('NetWork Config Error!')
time.sleep(3)
count = 0
然后需要对屏幕进行初始化。这里模仿了硬禾学堂在资料区上传在gitee的库和包,还有摇杆的初始化和值的判断,可以用硬禾的开源代码中的joystick直观感受。就不在此赘述了。
然后就是去查查阅心知天气的api请求方式还有返回的json值格式,这里要爆夸一下micropython的ujson库,省了很多事。具体使用方式欢迎问度娘!
weather_json = ujson.loads(weatherInfo_str)
weather_location = weather_json['results'][0]['location']['name']
weather_text=weather_json['results'][0]['now']['text']
weather_now = weather_json['results'][0]['now']['code']#天气图片
#气压
weather_pressure = weather_json['results'][0]['now']['pressure']
#湿度
weather_humidity = weather_json['results'][0]['now']['humidity']
#wendu
weather_temp = weather_json['results'][0]['now']['temperature']
#qiya
weather_pressure = weather_json['results'][0]['now']['pressure']
weather_time = weather_json['results'][0]['last_update']
6.遇到的主要难题及解决方法
- 查阅返回的json值格式,json会返回一个code代表实时天气图标,在心知天气称为天气现象代码,链接在这里。可是下载了这些图标压缩包后发现都是png文件,在硬禾学堂的显示屏st7789的实例中使用的是bin文件,可是网上没有找到转化为bin的工具。自己动手丰衣足食,我想起了一个工具,matlab。这里有个显示屏的坑,就是图片的宽度值必须准确,否则图片会显示不出来。所以综上:先将1到38号先批量统一大小,然后批量将图片转为bin,由于matlab的for的限制,对0号图标需要对matlab进行删改。我将放在代码包里欢迎取阅。当然matlab里面还有不太完善的地方需要的时候需要简单调试。
- 对于五个城市的循环查询,我想到了取模的方法。
count = (count+1) % 5
这样就实现了循环,保障5个城市按循环展示
同理对按摇杆次数进行判断,实现了城市的切换。
- 还有一个问题经常会出现ValueError: syntax error in JSON,虽然多点几下上传和多按几下reset就好了,但不知道是什么原因,还在排查。现在已经是能够成功实现完成任务了。
7.未来的计划或建议
这个项目中,其实还是有可以完善的地方,比如有了摇杆,显示屏和按键,能不能rp2040上做一个gui输入城市序列号或者手动选择wifi联网。亦或者这次活动其实有附带扬声器板卡,能不能做出语音播报天气等更加完善的功能,这些都是需要不断学习思考的。
这次的活动我受益颇多,对micropython的了解更加深入,也能够对python基础语法进行再回顾,有付出才会有收获,感谢硬禾学堂给我的这次机会参加活动。