【小型家用气象站】通过uart获取esp8266气象数据
[复制链接]
本帖最后由 reayfei 于 2021-7-18 22:26 编辑
小型家用气象站需要实现对未来24h的天气预报进行显示,这样就需要一个模块能够,连接网络获取气象网站的信息,很久之前就购买过esp8266模块,那个时候python的学习热潮特别火,所以自己也买了相关书籍。
后来了解后,发现python非常强大,可以导入很多库,这样你需求的很多功能,仅需要几行代码就能完成,大大提高编码效率。这一次,还能作为完成作品的一部分,也是花费很少的时间,就调试通,功能也很稳定。
某宝购买到的esp8266模块,到手后,需要烧写基于ESP8266的MicroPython固件
https://micropython.org/download/#esp8266
打开常用的串口工具,设置波特率为115200,打开串口并给ESP8266重启上电,打印如下字符说明烧写固件成功:
如何从气象网站获取信息呢?
可以从气象部门或专业的公司网站提供的API进行获取。我这里使用的是心知天气提供的。
需要自己申请一个API密钥,然后使用这个密钥,随时都可以进行获取,心知天气提供的接口有很多种,比如:天气实况,24小时逐小时天气预报,未来15天逐日天气预报和昨日天气,气象灾害预警等等,我这里使用的未来15天逐日天气预报和昨日天气,只需要把红框days=5修改为days=1即可。
以下是从心知天气获取到的json数据:
{
"results": [{
"location": {
"id": "WX4FBXXFKE4F",
"name": "北京",
"country": "CN",
"path": "北京,北京,中国",
"timezone": "Asia/Shanghai",
"timezone_offset": "+08:00"
},
"daily": [{ //返回指定days天数的结果
"date": "2015-09-20", //日期
"text_day": "多云", //白天天气现象文字
"code_day": "4", //白天天气现象代码
"text_night": "晴", //晚间天气现象文字
"code_night": "0", //晚间天气现象代码
"high": "26", //当天最高温度
"low": "17", //当天最低温度
"precip": "0", //降水概率,范围0~100,单位百分比(目前仅支持国外城市)
"wind_direction": "", //风向文字
"wind_direction_degree": "255", //风向角度,范围0~360
"wind_speed": "9.66", //风速,单位km/h(当unit=c时)、mph(当unit=f时)
"wind_scale": "", //风力等级
"rainfall": "0.0", //降水量,单位mm
"humidity": "76" //相对湿度,0~100,单位为百分比
}, {
"date": "2015-09-21",
"text_day": "晴",
"code_day": "0",
"text_night": "晴",
"code_night": "0",
"high": "27",
"low": "17",
"precip": "0",
"wind_direction": "",
"wind_direction_degree": "157",
"wind_speed": "17.7",
"wind_scale": "3",
"rainfall": "0.0",
"humidity": "76"
}, {
... //更多返回结果
}],
"last_update": "2015-09-20T18:00:00+08:00" //数据更新时间(该城市的本地时间)
}]
}
micropython源码:
import network
import time
import os
import urequests
import ujson
ssid = 'dxxxk'
password ='xxxxxxxxxxxxx'
def ConnectNet(ssid ,password):
mynetwork=network.WLAN(network.STA_IF)
mynetwork.active(True)
mynetwork.connect(ssid,password)
while True:
if(mynetwork.isconnected()):
break
else :
time.sleep(1)
print(mynetwork.ifconfig())
if __name__=='__main__':
ConnectNet(ssid,password)
while True:
result2=urequests.get('https://api.seniverse.com/v3/weather/daily.json?key=xxxxxxxxxxxx&location=dalian&language=en&unit=c&start=0&days=1')
j2=ujson.loads(result2.text)
#print(j2['results'][0]['location']['name'],end=' ')
#print(j2['results'][0]['daily'][0]['date'],end=' ')
print("A",end=' ')
print(j2['results'][0]['daily'][0]['code_day'],end=' ')
print(j2['results'][0]['daily'][0]['high'],end=' ')
print(j2['results'][0]['daily'][0]['low'],end=' ')
print(j2['results'][0]['daily'][0]['wind_scale'],end=' ')
print("B")
time.sleep(20)
功能实现后,uart打印出来的气象信息:辽宁大连的未来24小时天气预报。
|