IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python / Micropython 获取天气数据 -> 正文阅读

[Python知识库]Python / Micropython 获取天气数据

来观察一下这个带参数的网址,注意参数的语法:

http://api.openweathermap.org/data/2.5/weather?q=Chengdu,CN&APPID=xxxxxx

到 openweathermap.org 免费注册一个账号,获得 APPID,替换上面网址里的 xxxxxx,把整个这一串贴到浏览器的地址栏后回车,看到一大串天气数据即为成功。

{"coord":{"lon":104.0667,"lat":30.6667},"weather":[{"id":701,"main":"Mist","description":"mist","icon":"50n"}],"base":"stations","main":{"temp":288.09,"feels_like":287.78,"temp_min":288.09,"temp_max":288.09,"pressure":1010,"humidity":82},"visibility":5000,"wind":{"speed":0,"deg":0},"clouds":{"all":40},"dt":1648502715,"sys":{"type":1,"id":9674,"country":"CN","sunrise":1648508216,"sunset":1648552805},"timezone":28800,"id":1815286,"name":"Chengdu","cod":200}

获得这样的数据并不需要任何编程,到这网站?,把上面的这一大堆贴到左边,右边会出现其缩进结构,看得更直观,还可以折叠。

下面这个python代码,从上面返回的一大堆数据中找到自己需要的部分数据,并赋值给变量,方便使用:输出是这样的:? 14.94 82 1010 mist 0 5000

import requests
import json

url = "http://api.openweathermap.org/data/2.5/weather?q=Chengdu,CN&APPID=xxxxxx"  

r = requests.get(url)       

temp       = r.json()['main']['temp']-273.15        # float
humidity   = r.json()['main']['humidity']           # int
pressure   = r.json()['main']['pressure']           # int
weather    = r.json()['weather'][0]['description']  # str      print(type(weather))
wind       = r.json()['wind']['speed']              # float
visibility = r.json()['visibility']                 # int

print('%.2f' %temp,humidity,pressure,weather,wind,visibility)    #    '%.2f'%temp 保留小数点后两位


有了数据至于怎么用,看需求了,比如上传到 MQTT ,SQL ,输出到 TFT 等。

实测 Micropython 几乎可以直接用这个代码,把 requests 替换为 urequests 即可。(把联网的代码写道boot.py里可以实现自动连接网络)

--------------------------------------------------------------------------

下面是 五天天气预报的数据获得(网站返回的是每间隔3小时整点数据,一天8条,总计40条)

import requests
import json

url = "http://api.openweathermap.org/data/2.5/forecast?q=Chengdu,CN&APPID=xxxxxx"

r = requests.get(url)  
j = r.json()['list']    # 返回40条, j[0] 查看第一条数据       
     
i=5
while i < 40:
    print('\nDay', int((i-2)/8) )   
    print('预报时刻:' , j[i]['dt_txt'])
    print('温度    :' , '%.2f'%(j[i]['main']['temp'] -273.15))    # 注意 '%.2f'% 的用法
    print('湿度    :' , j[i]['main']['humidity'])
    print('气压    :' , j[i]['main']['pressure'])
    print('天气    :' , j[i]['weather'][0]['description'])
    print('风速    :' , j[i]['wind']['speed'])
    print('能见度  :' , j[i]['visibility'])
    i += 8
    

接下来可以做一些更有意思的事,比如收到下雨的预报,微信提醒带伞什么的。。。

----------------------------------------------------------------------------------

这里简单提一下 Json ,有很多文章教程可以去看,我的经验是看的 { } [ ] ( ) : 所划分的数据块。

比如把 j[0]?打印出来看:weather??看起来和 main 差不多,但是多了一层 { },所以代码里是 ['weather'][0]

?

再具体一些就是:

? ?如果对象是 list ,里面的元素名字, 用 ['weather'][0]? 获得这一坨,再进一步处理

? ?如果对象是 dict,里面的元素名字,?用 ['wind']['speed']? 获得冒号后的数据

--------------------------------------------------------------------------

下面是 ESP8266 Micropython 输出到 I2C OLED

import urequests,network
import utime
from machine import I2C,Pin
from ssd1306 import SSD1306_I2C
i2c = I2C(scl = Pin(4),sda = Pin(5),freq = 10000) #软件I2C
oled = SSD1306_I2C(128, 64, i2c) #创建oled对象
oled.rect(0,0,127,63,1)
oled.show()
oled.text("Hello World!",15,27)
oled.show()

print('IP:',network.WLAN(network.STA_IF).ifconfig()[0] );

url = "http://api.openweathermap.org/data/2.5/weather?q=Chengdu,CN&APPID=xxxxxx"
r = urequests.get(url) 

temp       = r.json()['main']['temp']-273.15        # float
humidity   = r.json()['main']['humidity']           # int
pressure   = r.json()['main']['pressure']           # int
weather    = r.json()['weather'][0]['description']  # str      
wind       = r.json()['wind']['speed']              # float
visibility = r.json()['visibility']                 # int

print('%.2f' %temp,humidity,pressure,weather,wind,visibility)    

temp = int(temp * 100)/100  #  oled 库基本都不支持浮点数直接保留小数点后两位显示
oled.fill(0)
oled.text("temp:",0,0)
oled.text(str(temp),64,0)
oled.text("hum:",0,8)
oled.text(str(humidity),64,8)
oled.text("weather:",0,16)
oled.text(weather,64,16)
oled.show()


  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:19:14  更:2022-03-30 18:20:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:52:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码