在DFROBOT的产品维库中,有一篇关于Beetle ESP32 C3通过网络获取天气数据的文章,可惜是通过Arduino实现的,仔爸在这几天通过MicroPython进行编程,想尝试用MPython实现获取网络天气数据,同时将这些获取的数据发送到SIoT物联网数据库,并通过Mind + V1.8中的可视化面板展示出来。
上一篇[[Beetle ESP32 C3 物联网亮板载灯]]中我们已经尝试将ESP32 C3进行了无线网络的连接,同时通过siot.py接收来自物联网服务器(行空板)的消息。而本例中我们将使用Beetle ESP32 C3联网后,通过API KEY获取OpenWeather网站上的天气数据,发送到物联网服务器。因此我们首先去OpenWeather网站注册账号并获取API KEY。
一、注册OpenWeather账号并获取API KEY
-
进入https://openweathermap.org/appid/,单击右上角的Sign in,然后单击Create an Account,然后填写一张创建新账号的表单,完成注册。注意需要进入邮箱单击一下激活账号的链接。
-
单击右上角的用户名,并在下拉菜单中单击My API Keys,进入获取API Key的界面(单击下图中的3处也一样)。默认自动生成了一个Key,也可以单击右侧的Generate按钮创建新的Key。将其中一个key进行复制。
-
第一步中单击邮箱中的激活账号链接后,会继续收到一封邮件,里面介绍如何使用Key的方法。我们可以复制并修改其中一些参数,来实现中国某个城市的天气数据。如想获取中国宁波的天气数据,则可将q=后面改为NingBo, CN(无需区分大小写):
http://api.openweathermap.org/data/2.5/weather?q=NingBo,CN&APPID=0baff7057**********82526d3a5
将该链接粘贴到浏览器地址栏,按下回车后,将返回一组以JSON格式的天气数据信息。注意观察里面的相关信息,如temp与气温相关,pressure表示气压,wind是风速等等。
需要注意的是,此处获取的气温是开氏度,不是国外常用的华氏度,也不是国内常见的摄氏度,关于开氏度的介绍见下面的文字,详见# 为什么绝对零度正好是-273.15度?一文。
1848年,被誉为“热力学之父”开尔文勋爵在其论文《关于一种绝对温标》中,提出了一种与测温物质的属性无关的纯理论上的温标,将这种“绝对温标”将理论上的温度下限值,也就是-273.15℃设为“绝对零度”,并以摄氏度作为其单位增量。是的,这种温标也就是后来的热力学温标,其单位为K(开尔文),根据定义,1K的温度变化与1℃相等,只是两者的计算起点不同而已,两者可以简单地用“K = ℃ + 273.15”来进行换算,比如说1℃,就相当于274.15K。
所以我们只要将获得的气温数据减去273.15就得到了摄氏度。
二、创建消息主题
在行空板的SIoT服务器上创建用于接收并保存天气数据的主题,本例我们仅创建气温和风力两个主题。
三、编写程序
编写MicroPython程序,并保存到Beetle ESP32 C3设备上。
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外接一些传感器,同样可以将数据发送到物联网服务器,其原理是一样的。