reayfei 发表于 2021-7-18 22:10

【小型家用气象站】通过uart获取esp8266气象数据

本帖最后由 reayfei 于 2021-7-18 22:26 编辑

<p><span style="font-size:16px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;小型家用气象站需要实现对未来24h的天气预报进行显示,这样就需要一个模块能够,连接网络获取气象网站的信息,很久之前就购买过esp8266模块,那个时候python的学习热潮特别火,所以自己也买了相关书籍。</span></p>

<p><span style="font-size:16px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;后来了解后,发现python非常强大,可以导入很多库,这样你需求的很多功能,仅需要几行代码就能完成,大大提高编码效率。这一次,还能作为完成作品的一部分,也是花费很少的时间,就调试通,功能也很稳定。</span></p>

<p><span style="font-size:16px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;某宝购买到的esp8266模块,到手后,需要烧写基于ESP8266的MicroPython固件</span></p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="font-size:16px;">&nbsp;https://micropython.org/download/#esp8266</span></p>

<p><span style="font-size:16px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;打开常用的串口工具,设置波特率为115200,打开串口并给ESP8266重启上电,打印如下字符说明烧写固件成功:</span></p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">如何从气象网站获取信息呢?</span></p>

<p><span style="font-size:16px;">可以从气象部门或专业的公司网站提供的API进行获取。我这里使用的是心知天气提供的。</span></p>

<p><span style="font-size:16px;">需要自己申请一个API密钥,然后使用这个密钥,随时都可以进行获取,心知天气提供的接口有很多种,比如:天气实况,24小时逐小时天气预报,未来15天逐日天气预报和昨日天气,气象灾害预警等等,我这里使用的未来15天逐日天气预报和昨日天气,只需要把红框days=5修改为days=1即可。</span></p>

<p>&nbsp;</p>

<p></p>

<p><span style="font-size:16px;">&nbsp;以下是从心知天气获取到的json数据:</span></p>

<pre>
<code class="language-python">{
"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" //数据更新时间(该城市的本地时间)
}]
}</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">micropython源码:</span></p>

<pre>
<code class="language-python">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&amp;location=dalian&amp;language=en&amp;unit=c&amp;start=0&amp;days=1')
                j2=ujson.loads(result2.text)
                #print(j2['results']['location']['name'],end=' ')
                #print(j2['results']['daily']['date'],end=' ')
                print("A",end=' ')
                print(j2['results']['daily']['code_day'],end=' ')
                print(j2['results']['daily']['high'],end=' ')
                print(j2['results']['daily']['low'],end=' ')
                print(j2['results']['daily']['wind_scale'],end=' ')
                print("B")
               
                time.sleep(20)</code></pre>

<p><span style="font-size:16px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span></p>

<p><span style="font-size: 16px;">功能实现后,uart打印出来的气象信息:辽宁大连的未来24小时天气预报。</span></p>

<p></p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【小型家用气象站】通过uart获取esp8266气象数据