Beetle ESP32 C3 通过网络获取气象数据
本帖最后由 仔爸 于 2023-6-3 11:58 编辑在DFROBOT的产品维库中,有一篇关于Beetle ESP32 C3通过网络获取天气数据的文章,可惜是通过Arduino实现的,仔爸在这几天通过MicroPython进行编程,想尝试用MPython实现获取网络天气数据,同时将这些获取的数据发送到SIoT物联网数据库,并通过Mind + V1.8中的可视化面板展示出来。
上一篇[]中我们已经尝试将ESP32 C3进行了无线网络的连接,同时通过siot.py接收来自物联网服务器(行空板)的消息。而本例中我们将使用Beetle ESP32 C3联网后,通过API KEY获取OpenWeather网站上的天气数据,发送到物联网服务器。因此我们首先去OpenWeather网站注册账号并获取API KEY。
一、注册OpenWeather账号并获取API KEY
1. 进入https://openweathermap.org/appid/,单击右上角的**Sign in**,然后单击**Create an Account**,然后填写一张创建新账号的表单,完成注册。注意需要进入邮箱单击一下激活账号的链接。
2. 单击右上角的用户名,并在下拉菜单中单击**My API Keys**,进入获取API Key的界面(单击下图中的3处也一样)。默认自动生成了一个Key,也可以单击右侧的**Generate**按钮创建新的Key。将其中一个key进行复制。
3. 第一步中单击邮箱中的激活账号链接后,会继续收到一封邮件,里面介绍如何使用Key的方法。我们可以复制并修改其中一些参数,来实现中国某个城市的天气数据。如想获取中国宁波的天气数据,则可将q=后面改为NingBo, CN(无需区分大小写):
http://api.openweathermap.org/data/2.5/weather?q=NingBo,CN&APPID=0baff7057**********82526d3a5
将该链接粘贴到浏览器地址栏,按下回车后,将返回一组以JSON格式的天气数据信息。注意观察里面的相关信息,如temp与气温相关,pressure表示气压,wind是风速等等。
需要注意的是,此处获取的气温是**开氏度**,不是国外常用的华氏度,也不是国内常见的摄氏度,关于开氏度的介绍见下面的文字,详见[# 为什么绝对零度正好是-273.15度?](https://www.zhihu.com/question/54691426)一文。
>1848年,被誉为“[热力学](https://www.zhihu.com/search?q=%E7%83%AD%E5%8A%9B%E5%AD%A6&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2603061228%7D)之父”开尔文勋爵在其论文《关于一种[绝对温标](https://www.zhihu.com/search?q=%E7%BB%9D%E5%AF%B9%E6%B8%A9%E6%A0%87&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2603061228%7D)》中,提出了一种与测温物质的属性无关的纯理论上的温标,将这种“绝对温标”将理论上的温度下限值,也就是-273.15℃设为“绝对零度”,并以摄氏度作为其单位增量。是的,这种温标也就是后来的[热力学温标](https://www.zhihu.com/search?q=%E7%83%AD%E5%8A%9B%E5%AD%A6%E6%B8%A9%E6%A0%87&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2603061228%7D),其单位为K(开尔文),根据定义,1K的温度变化与1℃相等,只是两者的计算起点不同而已,两者可以简单地用“K = ℃ + 273.15”来进行换算,比如说1℃,就相当于274.15K。
所以我们只要将获得的气温数据减去273.15就得到了摄氏度。
二、创建消息主题
在行空板的SIoT服务器上创建用于接收并保存天气数据的主题,本例我们仅创建气温和风力两个主题。
三、编写程序
编写MicroPython程序,并保存到Beetle ESP32 C3设备上。
```python
import urequests
import ujson
import time
import siot #导入同目录下的siot.py
SERVER="192.168.10.223"#行空板的IP地址
CLIENT_ID=""
IOT_pubTopic_temp='siot/temp'
IOT_pubTopic_windspeed='siot/windspeed'
IOT_UserName='siot'
IOT_PassWord='dfrobot'
siot.init(CLIENT_ID,SERVER,user=IOT_UserName,password=IOT_PassWord)
def WIFIconnect(): #无线链接
import network
ssid='shufang'#无线名称
password='25222214'#修改为无线密码
station=network.WLAN(network.STA_IF)
if station.isconnected() == True:
print("WiFi already connected")
print(station.ifconfig())
return
station.active(True)
station.connect(ssid,password)
while station.isconnected() == False:
pass
print("Connection successful")
print(station.ifconfig())
WIFIconnect()
siot.connect()
urlpath="https://api.openweathermap.org/data/2.5/weather?q=NingBo,CN&APPID=0baff705*************82526d3a5"
while True:
time.sleep(2)
response = urequests.get(urlpath) #从OpenWeather网站获取天气数据流
dict1=response.json()#转为json格式
temp=str('%.2f'%(dict1["main"]["temp"]-273.15)) #开氏度减273.15等于摄氏度,并保留2位小数
windspeed=str(dict1["wind"]["speed"])
#print(temp,windspeed)
siot.publish(IOT_pubTopic_temp,temp,qos=1) #将气温数据发送到物联网服务器,qos=1表示数据保存在服务器上
siot.publish(IOT_pubTopic_windspeed,windspeed,qos=1) #发送并保存风力数据
```
四、数据显示在可视化面板
打开Mind+ 1.8,单击右上角的**可视化面板**按钮,创建一个空白项目,然后连接行空板物联网服务器,并设计两个可视化组件,折线图连接气温主题,进度仪表盘连接风力主题。这样就可以显示物联网服务器上的气象数据了。
本例我们尝试用Beetle ESP32 C3获取网络数据,并将其作为消息发送者,将获取的数据发送并保存到物联网服务器的数据库中。如果我们为ESP32 C3外接一些传感器,同样可以将数据发送到物联网服务器,其原理是一样的。
话说开发esp系列的固件用arduino环境多还是micropy多呀?还有就是库丰富度问题? txm派瑞深山锹 发表于 2023-6-27 11:26
话说开发esp系列的固件用arduino环境多还是micropy多呀?还有就是库丰富度问题? ...
这个看个人喜好,以及自己掌握的编程语言的程度。最近在学python和micropython,所以都会往这方面靠近。 厉害厉害 不错不错 厉害厉害 赞赞赞赞赞! 仔爸 发表于 2023-8-8 00:03
这个看个人喜好,以及自己掌握的编程语言的程度。最近在学python和micropython,所以都会往这方面靠近。 ...
感谢分享经验,受教了受教了
页:
[1]