11832浏览
查看: 11832|回复: 28

[MP动手做] MicroPython动手做(33)——物联网之天气预报

[复制链接]
MicroPython动手做(33)——物联网之天气预报图1

天气(自然现象)
是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象,即某瞬时内大气中各种气象要素(如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等)空间分布的综合表现。

天气过程就是一定地区的天气现象随时间的变化过程。各种天气系统都具有一定的空间尺度和时间尺度,而且各种尺度系统间相互交织、相互作用。许多天气系统的组合,构成大范围的天气形势,构成半球甚至全球的大气环流。天气系统总是处在不断新生、发展和消亡过程中,在不同发展阶段有着其相对应的天气现象分布。

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 18:42:46

11、六位触摸按键选择城市天气预报

P 上海   Y 福州   T 北京   H 重庆   O 深圳  N 济南

[mw_shl_code=python,false]#MicroPython动手做(33)——物联网之天气预报
#六位触摸按键选择城市天气预报

from machine import Timer
from mpython import *
import urequests
import network
import ntptime
import music
import json


touch_threshold = {'P': 400, 'Y': 400, 'T': 400, 'H': 400, 'O': 400, 'N': 400}

tim12 = Timer(12)
_status_p = _status_y = _status_t = _status_h = _status_o = _status_n = 0
def on_touchpad_P_pressed():pass
def on_touchpad_P_unpressed():pass
def on_touchpad_Y_pressed():pass
def on_touchpad_Y_unpressed():pass
def on_touchpad_T_pressed():pass
def on_touchpad_T_unpressed():pass
def on_touchpad_H_pressed():pass
def on_touchpad_H_unpressed():pass
def on_touchpad_O_pressed():pass
def on_touchpad_O_unpressed():pass
def on_touchpad_N_pressed():pass
def on_touchpad_N_unpressed():pass

def timer12_tick(_):
  global _status_p, _status_y, _status_t, _status_h, _status_o, _status_n
  try:
    touchPad_P.read();pass
  except:
    return
  if touchPad_P.read() < touch_threshold['P']:
    if 1 != _status_p:_status_p = 1;on_touchpad_P_pressed()
  elif 0 != _status_p:_status_p = 0;on_touchpad_P_unpressed()
  if touchPad_Y.read() < touch_threshold['Y']:
    if 1 != _status_y:_status_y = 1;on_touchpad_Y_pressed()
  elif 0 != _status_y:_status_y = 0;on_touchpad_Y_unpressed()
  if touchPad_T.read() < touch_threshold['T']:
    if 1 != _status_t:_status_t = 1;on_touchpad_T_pressed()
  elif 0 != _status_t:_status_t = 0;on_touchpad_T_unpressed()
  if touchPad_H.read() < touch_threshold['H']:
    if 1 != _status_h:_status_h = 1;on_touchpad_H_pressed()
  elif 0 != _status_h:_status_h = 0;on_touchpad_H_unpressed()
  if touchPad_O.read() < touch_threshold['O']:
    if 1 != _status_o:_status_o = 1;on_touchpad_O_pressed()
  elif 0 != _status_o:_status_o = 0;on_touchpad_O_unpressed()
  if touchPad_N.read() < touch_threshold['N']:
    if 1 != _status_n:_status_n = 1;on_touchpad_N_pressed()
  elif 0 != _status_n:_status_n = 0;on_touchpad_N_unpressed()

def weather_getWeather(_weather, _city):
  if weather_serveraddr=="http://www.tianqiapi.com":
    nowResult = urequests.get(weather_serveraddr+"/api/?appid="+weather_appid+"&appsecret="+weather_appsecret+"&version=v6&cityid="+_city)
    json=nowResult.json()
    nowResult.close()
    return json[_weather]
  else:
    nowResult = urequests.get(weather_serveraddr+"/api/weather/?appid="+weather_appid+"&appsecret="+weather_appsecret+"&version=v6&cityid="+_city)
    json=nowResult.json()
    nowResult.close()
    return json[_weather]

brightness=9

weather_serveraddr = "http://www.tianqiapi.com"

weather_appid = "85215611"

weather_appsecret = "Kx8r5ZCY "

# 事件回调函数
def on_touchpad_P_pressed():
  global g_my_variable
  music.pitch(147, 500)
  oled.fill(0)
  oled.DispChar("上海", 0, (1-1)*16, 1)
  oled.DispChar(weather_getWeather("wea", "101020100"), 0, (2-1)*16, 1)
  oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101020100"))), 0, (3-1)*16, 1)
  oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101020100"))), 0, (4-1)*16, 1)
  oled.show()
def on_touchpad_H_pressed():
  global g_my_variable
  music.pitch(175, 500)
  oled.fill(0)
  oled.DispChar("重庆", 0, (1-1)*16, 1)
  oled.DispChar(weather_getWeather("wea", "101040100"), 0, (2-1)*16, 1)
  oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101040100"))), 0, (3-1)*16, 1)
  oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101040100"))), 0, (4-1)*16, 1)
  oled.show()
def on_touchpad_Y_pressed():
  global g_my_variable
  music.pitch(247, 500)
  oled.fill(0)
  oled.DispChar("福州", 0, (1-1)*16, 1)
  oled.DispChar((str("天气情况:") + str(weather_getWeather("wea", "101230101"))), 0, (2-1)*16, 1)
  oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101230101"))), 0, (3-1)*16, 1)
  oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101230101"))), 0, (4-1)*16, 1)
  oled.show()
def on_touchpad_O_pressed():
  global g_my_variable
  music.pitch(196, 500)
  oled.fill(0)
  oled.DispChar("深圳", 0, (1-1)*16, 1)
  oled.DispChar(weather_getWeather("wea", "101280601"), 0, (2-1)*16, 1)
  oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101280601"))), 0, (3-1)*16, 1)
  oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101280601"))), 0, (4-1)*16, 1)
  oled.show()
def on_touchpad_T_pressed():
  global g_my_variable
  music.pitch(165, 500)
  oled.fill(0)
  oled.DispChar("北京", 0, (1-1)*16, 1)
  oled.DispChar(weather_getWeather("wea", "101010100"), 0, (2-1)*16, 1)
  oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101010100"))), 0, (3-1)*16, 1)
  oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101010100"))), 0, (4-1)*16, 1)
  oled.show()
def on_touchpad_N_pressed():
  global g_my_variable
  music.pitch(220, 500)
  oled.fill(0)
  oled.DispChar("济南", 0, (1-1)*16, 1)
  oled.DispChar(weather_getWeather("wea", "101120101"), 0, (2-1)*16, 1)
  oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101120101"))), 0, (3-1)*16, 1)
  oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101120101"))), 0, (4-1)*16, 1)
  oled.show()


tim12.init(period=100, mode=Timer.PERIODIC, callback=timer12_tick)
my_wifi = wifi()
my_wifi.connectWiFi("zh","zy1567")
while not (my_wifi.sta.isconnected()):
  pass
rgb[1] = (0*brightness//9, 102*brightness//9, 0*brightness//9)
rgb.write()
music.pitch(131, 50)
ntptime.settime(8, "ntp.ntsc.ac.cn")
oled.fill(0)
oled.DispChar("触摸按键选城市", 0, (1-1)*16, 1)
oled.DispChar("P 上海   Y 福州", 0, (2-1)*16, 1)
oled.DispChar("T 北京   H 重庆", 0, (3-1)*16, 1)
oled.DispChar("O 深圳  N 济南", 0, (4-1)*16, 1)
oled.show()[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 15:11:34

9、使用三轴传感器选择城市天气预报

向前倾斜为安徽合肥,向后为福建福州
向左为上海,向右为北京


[mw_shl_code=python,false]#MicroPython动手做(33)——物联网之天气预报
#使用三轴传感器选择城市天气预报

from mpython import *
import urequests
import network
import ntptime
import music
import json


brightness=9

weather_serveraddr = "http://server.mindplus.top"

weather_appid = "31982666"

weather_appsecret = "E6MtBcxQ"

def weather_getWeather(_weather, _city):
  if weather_serveraddr=="http://www.tianqiapi.com":
    nowResult = urequests.get(weather_serveraddr+"/api/?appid="+weather_appid+"&appsecret="+weather_appsecret+"&version=v6&cityid="+_city)
    json=nowResult.json()
    nowResult.close()
    return json[_weather]
  else:
    nowResult = urequests.get(weather_serveraddr+"/api/weather/?appid="+weather_appid+"&appsecret="+weather_appsecret+"&version=v6&cityid="+_city)
    json=nowResult.json()
    nowResult.close()
    return json[_weather]


my_wifi = wifi()
my_wifi.connectWiFi("zh","zy1567")
while not (my_wifi.sta.isconnected()):
  pass
rgb[1] = (0*brightness//9, 102*brightness//9, 0*brightness//9)
rgb.write()
music.pitch(165, 50)
ntptime.settime(8, "ntp.ntsc.ac.cn")
while True:
  if (accelerometer.get_x() < -0.3):
    music.pitch(196, 50)
    oled.fill(0)
    oled.DispChar("安徽 合肥", 0, (1-1)*16, 1)
    oled.DispChar(weather_getWeather("wea", "101220101"), 0, (2-1)*16, 1)
    oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101220101"))), 0, (3-1)*16, 1)
    oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101220101"))), 0, (4-1)*16, 1)
    oled.show()
  if (accelerometer.get_x() > 0.3):
    music.pitch(262, 50)
    oled.fill(0)
    oled.DispChar("福建 福州", 0, (1-1)*16, 1)
    oled.DispChar(weather_getWeather("wea", "101230101"), 0, (2-1)*16, 1)
    oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101230101"))), 0, (3-1)*16, 1)
    oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101230101"))), 0, (4-1)*16, 1)
    oled.show()
  if (accelerometer.get_y() > 0.3):
    music.pitch(392, 50)
    oled.fill(0)
    oled.DispChar("上海", 0, (1-1)*16, 1)
    oled.DispChar(weather_getWeather("wea", "101020100"), 0, (2-1)*16, 1)
    oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101020100"))), 0, (3-1)*16, 1)
    oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101020100"))), 0, (4-1)*16, 1)
    oled.show()
  if (accelerometer.get_y() < -0.3):
    music.pitch(659, 50)
    oled.fill(0)
    oled.DispChar("北京", 0, (1-1)*16, 1)
    oled.DispChar(weather_getWeather("wea", "101010100"), 0, (2-1)*16, 1)
    oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101010100"))), 0, (3-1)*16, 1)
    oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101010100"))), 0, (4-1)*16, 1)
    oled.show()[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 12:58:52

7、按下AB键查询今明二天的天气和生活指数


[mw_shl_code=python,false]#MicroPython动手做(33)——物联网之天气预报
#按下AB键查询今明二天的天气和生活指数

from mpython import *
import network
import json
import urequests
import time
import music

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")

def on_button_a_down(_):
    time.sleep_ms(10)
    if button_a.value() == 1: return
    music.play('G5:1')
    oled.fill(0)
    oled.DispChar((''.join([str(x) for x in [w1["results"][0]["location"]["name"], "今天", w1["results"][0]["daily"][0]["text_day"], "", w1["results"][0]["daily"][0]["low"], "  - ", w1["results"][0]["daily"][0]["high"], " 度", w1["results"][0]["daily"][0]["high"]]])), 0, 0, 1)
    oled.DispChar((str("穿衣指数 : ") + str(w2["results"][0]["suggestion"]["dressing"]["brief"])), 0, 16, 1)
    oled.DispChar((str("运动指数 : ") + str(w2["results"][0]["suggestion"]["sport"]["brief"])), 0, 32, 1)
    oled.DispChar((str("紫外线指数 : ") + str(w2["results"][0]["suggestion"]["uv"]["brief"])), 0, 48, 1)
    oled.show()

def on_button_b_down(_):
    time.sleep_ms(10)
    if button_b.value() == 1: return
    music.play('B5:1')
    oled.fill(0)
    oled.DispChar((''.join([str(x) for x in [w1["results"][0]["location"]["name"], "明天", w1["results"][0]["daily"][1]["text_day"], "  ", w1["results"][0]["daily"][1]["low"], "  - ", w1["results"][0]["daily"][1]["high"], " 度", w1["results"][0]["daily"][1]["high"]]])), 0, 0, 1)
    oled.DispChar((str("穿衣指数 : ") + str(w2["results"][0]["suggestion"]["dressing"]["brief"])), 0, 16, 1)
    oled.DispChar((str("感冒指数 : ") + str(w2["results"][0]["suggestion"]["flu"]["brief"])), 0, 32, 1)
    oled.DispChar((str("旅游指数 : ") + str(w2["results"][0]["suggestion"]["travel"]["brief"])), 0, 48, 1)
    oled.show()

def get_seni_weather(_url, _location):
    _url = _url + "&location=" + _location.replace(" ", "%20")
    response = urequests.get(_url)
    json = response.json()
    response.close()
    return json

button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)

button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)


w1 = get_seni_weather("https://api.seniverse.com/v3/weather/daily.json?key=SSY9pi-U4QH-ZDrf", "ip")
w2 = get_seni_weather("https://api.seniverse.com/v3/life/suggestion.json?key=SSY9pi-U4QH-ZDrf", "ip")
rgb[1] = (int(0), int(102), int(0))
rgb.write()
time.sleep_ms(1)
music.play('E5:1')
oled.fill(0)
oled.DispChar("按下AB键查询天气预报", 0, 16, 1)
oled.show()[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-19 19:11:05

MicroPython动手做(33)——物联网之天气预报图2


天气预报
是应用大气变化的规律,根据当前及近期的天气形势,对某一地未来一定时期内的天气状况进行预测。它是根据对卫星云图和天气图的分析,结合有关气象资料、地形和季节特点、群众经验等综合研究后作出的。如我国中央气象台的卫星云图,就是我国制造的“风云一号”气象卫星摄取的。利用卫星云图照片进行分析,能提高天气预报的准确率。天气预报就时效的长短通常分为三种:短期天气预报(2~3天)、中期天气预报(4~9天),长期天气预报(10~15天以上),中央电视台每天播放的主要是短期天气预报。

天气预报的主要内容是一个地区或城市未来一段时期内的阴晴雨雪、最高最低气温、风向和风力及特殊的灾害性天气。就中国而言,气象台准确预报寒潮、台风、暴雨等自然灾害出现的位置和强度,就可以直接为工农业生产和群众生活服务。天气预报是根据气象观测资料,应用天气学、动力气象学、统计学的原理和方法,对某区域或某地点未来一定时段的天气状况作出定性或定量的预测。它是大气科学研究的一个重要目标。对人们生活有重要意义。


MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-19 19:23:29

MicroPython动手做(33)——物联网之天气预报图1

气象术语
1.时间的划分:天气预报中所说的白天,指当地标准时间8点至20点,其中17点至20点叫做傍晚;20点以后到第二天的8点叫做夜间。
2.天气状况(阴晴的划分):晴是指全天内天空中云量低于3成(即30%);多云是天空中有4-7成的中、低云或6-10成的高云时的天空状况;少云是天空中有1-3成的中、低云或4-5成的高云时的天空状况;阴是天空阴暗,密布云层,或天空虽有云隙而仍感到阴暗(总云量8成以上),偶尔从云缝中可见到微弱阳光的天气现象。
雾:悬浮在贴近地面的大气中的大量微细水滴(或冰晶)的可见集合体。雾和云的区别仅仅在于是否接触地面。雾使地面的水平能见度显著降低。按国际气象组织规定,使能见度降低到1公里以下的称为雾。
云量和云高:云量是指云遮蔽天空视野的成数;云高是指云底距离测站地面的垂直距离。
3.气温:天气预报中所说的气温,指在野外空气流通、不受太阳直射下测得的空气温度(一般在百叶箱内测定)。最高气温是一日内气温的最高值,一般出现在14-15时,最低气温一般出现在早晨5-6时。
4.降水:降水分降雨、降雪、雨夹雪、冰雹。
降雨情况:气象部门一般指的是24小时内降雨的多少。对雨量的多少,一般分为零星小雨、小雨、阵雨、中雨、大雨、暴雨、大暴雨、特大暴雨8个级别。根据24小时降水量(毫米)的降雨等级为:小雨0.1~9.9,中雨10.0~24.9,大雨25.0~49.9,暴雨50.0~99.9。
冰雹:坚硬的球状、锥状或形状不规则的固态降水。
降雪按照降雪量分为小雪、中雪、大雪、暴雪、暴风雪等。其中暴雪是降雪强度较大的雪(下雪时水平能见度距离小于500m或24小时内降雪量大于15mm);暴风雪,又称雪暴,是大量的雪被强风卷着随风运行,并且不能判定当时是否有降雪,水平能见度小于1km的天气现象。
5.风:风是指空气的水平流动现象。用风向和风速表示:风向分十六个方位,是指风吹来的方向;风速用风级或多少米/秒表示,分用2分钟的平均情况表示的平均风速和瞬间情况代表的瞬时风速。
风的强度用风速表示,一般采用蒲风级或多少米/秒来衡量,分十三级:
静风:即0级风。
和风:即4级风。风速在5.5-7.9m/s之间的风。
微风:即3级风。
大风:即8级风。平均风速为17.2-20.7m/s的风。
狂风:即10级风。
暴风:即11级风。风速在28.5-32.6m/s之间的风。
飓风:即12级以上风。


MicroPython动手做(33)——物联网之天气预报图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-19 19:40:20

1、心知天气

是一家零售行业气象服务方案提供商,通过数据接口(API)、自然语言处理(NLP)、预警与推送(Trigger)、数据可视化(BI)等产品,向用户提供精细化天气数据与零售气象解决方案,帮助零售企业量化天气对于业务的影响。心知科技是一家自然大数据公司,致力于利用自然界大数据与人工智能等技术,帮助企业把控天气与环境变化带来的挑战和机遇。自2006年起,心知科技通过天气大数据和机器学习算法与垂直领域的需求结合,已在零售、物流等行业开发完成场景化的商业气象服务解决方案。


心知智能天气解决方案,是心知科技在2018年推出的,针对App与智能硬件推出的一站式天气信息解决方案。天气聊天机器人ChatBot与天气预警机器人WhenBot,作为心知天气的两个主要产品,分别覆盖了ToC的用户使用场景与ToB的业务应用场景。ChatBot基于NLP技术的自然语言查询API,支持通过自然语言文本查询天气信息,让智能硬件和APP开发者可以很方便的增加一个由心知天气海量,精细天气数据支撑的自然语言对话查天气功能。目前心知天气 ChatBot 活跃在数千万智能终端上,为小米、京东智能音箱提供了便捷的天气查询服务。


MicroPython动手做(33)——物联网之天气预报图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-19 19:51:39

2、心知天气官网与天气数据接口文档

心知天气官网:https://www.seniverse.com
天气数据接口文档:https://www.seniverse.com/docs

MicroPython动手做(33)——物联网之天气预报图1


MicroPython动手做(33)——物联网之天气预报图2

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-19 20:29:52

3、注册并登陆心知天气官网

天气数据 API:通过标准的 Restful API 接口,提供标准化的数据访问。无论是APP、智能硬件还是企业级系统都可以轻松接入心知的精细化天气数据。

添加免费版可以调用数据

国内 370 个主要城市

天气实况,包括天气现象文字、代码和气温 3 项数据
未来 3 天天气预报,包括白天天气现象文字及代码、晚间天气现象文字及代码、当天最高温度和最低温度、风向风速
6 项基本类生活指数,包括穿衣、紫外线强度、洗车、旅游、感冒、运动指数

MicroPython动手做(33)——物联网之天气预报图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 08:38:24

4、查看你的 API 密钥
当你在 心知天气 控制台 - 产品管理 中添加了 API 产品后,即可在产品详情中查看该 API 产品的密钥。
每组密钥由“公钥”(参数 uid)和“私钥”(参数 key)组成,例如:
公钥 PKwiV7auWJE3iBJ8d
私钥 SMEieQjde1C9eXnbE


心知天气支持两种 API 安全验证方式:
(1)“私钥” 直接请求方式
将 API 密钥中的“私钥”作为 API 请求中的 key 参数值: https://api.seniverse.com/v3/wea ... =zh-Hans&unit=c
说明 此方式较为方便,但请注意不要泄漏你的“私钥”。
(2)“公钥 + 私钥” 签名验证方式
“公钥 + 私钥” 验证方式更加安全。请求地址中只包含你的“公钥”以及用你的“私钥”制作的签名,因此不会在请求地址中泄露你的私钥。

MicroPython动手做(33)——物联网之天气预报图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 09:49:02

5、查询福建福州当天的天气情况


[mw_shl_code=python,false]#MicroPython动手做(33)——物联网之天气预报
#查询福建福州当天的天气情况

from mpython import *
import network
import time
import music
import json
import urequests

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")

def get_seni_weather(_url, _location):
    _url = _url + "&location=" + _location.replace(" ", "%20")
    response = urequests.get(_url)
    json = response.json()
    response.close()
    return json


rgb.fill((int(0), int(102), int(0)))
rgb.write()
time.sleep_ms(1)
music.play('D5:1')
w1 = get_seni_weather("https://api.seniverse.com/v3/weather/daily.json?key=SSY9pi-U4QH-ZDrf", "fuzhou")
oled.fill(0)
oled.DispChar((''.join([str(x) for x in [w1["results"][0]["location"]["name"], "                                 ", w1["results"][0]["daily"][0]["date"], "                          ", w1["results"][0]["daily"][0]["text_day"], "  风力", w1["results"][0]["daily"][0]["wind_scale"], "级                                  ", w1["results"][0]["daily"][0]["low"], "  - ", w1["results"][0]["daily"][0]["high"], " 度"]])), 0, 0, 1)
oled.show()[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 09:52:50

本帖最后由 驴友花雕 于 2020-6-20 10:04 编辑

使用前,导入mpython、json、urequests、Timer和天气图标seniverse模块(seniverse模块,将seniverse模块文件导入掌控板文件根目录):

from mpython import*

import json

import urequests

from seniverse import *

from machine import Timer

使用心知天气的免费天气API,您须先在心知天气官网注册一个账号,您将获得一个API密钥(key),API密钥(key)是用来验证API请求合法性的一个唯一字符串,通过API请求中的key参数传入:


API_KEY = 'yourkey'


添加天气实况和多日天气预报的请求地址(更多请求可参考心知天气官网提供的天气数据选项):


url_now="https://api.seniverse.com/v3/weather/now.json"           #获取天气实况的请求地址

url_daily="https://api.seniverse.com/v3/weather/daily.json"       #获取多日天气预报的请求地址


连接您的 WiFi 网络,需要设置您的WiFi名称和密码:


mywifi=wifi()

mywifi.connectWiFi('yourESSID','yourpassword')


注解


参数:unit 为温度单位, c 为摄氏度℃。start 为起始时间,如 -2 前天,-1 昨天,0 今天,1 明天。days 为天数,返回从start算起days天的结果。更多参数可参考心知天气官网。 https://www.seniverse.com/doc


对返回的所有结果有选择性的输出,元组可以使用下标索引来访问元组中的值:


today=dailyRsp['results'][0]['daily'][0]['date'][-5:]         #当前日期,显示“月-日”

todayHigh=dailyRsp['results'][0]['daily'][0]['high']          #最高温度

todaylow=dailyRsp['results'][0]['daily'][0]['low']            #最低温度


nowText=nowRsp['results'][0]['now']['text']                   #天气现象文字

nowTemper=nowRsp['results'][0]['now']['temperature']          #温度

todayIco=nowRsp['results'][0]['now']['code']                  #天气现象图标

city=nowRsp['results'][0]['location']['name']                 #地理位置


注解


元组的具体使用方法参考Python的元组。


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 09:57:01

mPython X 实验图形编程

MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 10:02:54

MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 11:43:02

6、当地天气预报及六项生活指数

[mw_shl_code=python,false]#MicroPython动手做(33)——物联网之天气预报
#当地天气预报及六项生活指数

from mpython import *
import network
import json
import urequests

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")

def get_seni_weather(_url, _location):
    _url = _url + "&location=" + _location.replace(" ", "%20")
    response = urequests.get(_url)
    json = response.json()
    response.close()
    return json


w1 = get_seni_weather("https://api.seniverse.com/v3/weather/daily.json?key=SSY9pi-U4QH-ZDrf", "ip")
w2 = get_seni_weather("https://api.seniverse.com/v3/life/suggestion.json?key=SSY9pi-U4QH-ZDrf", "ip")
oled.fill(0)
oled.DispChar((''.join([str(x) for x in [w1["results"][0]["location"]["name"], "   ", w1["results"][0]["daily"][0]["text_day"], "   ", w1["results"][0]["daily"][0]["low"], "  - ", w1["results"][0]["daily"][0]["high"], " 度"]])), 0, 0, 1)
oled.DispChar((str("穿衣指数 : ") + str(w2["results"][0]["suggestion"]["dressing"]["brief"])), 0, 16, 1)
oled.DispChar((str("运动指数 : ") + str(w2["results"][0]["suggestion"]["sport"]["brief"])), 0, 32, 1)
oled.DispChar((str("紫外线指数 : ") + str(w2["results"][0]["suggestion"]["uv"]["brief"])), 0, 48, 1)
oled.show()[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 11:46:58

mPython X 实验图形编程

MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 11:50:46

MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 13:09:23

mPython X 实验图形编程

MicroPython动手做(33)——物联网之天气预报图2

MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 13:21:57

MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 14:38:28

8、使用mindplus sever服务器获取天气预报
无需注册,不用密钥,不要设置,挺简单的一个办法

[mw_shl_code=python,false]#MicroPython动手做(33)——物联网之天气预报
#使用mindplus sever服务器获取天气预报

from mpython import *
import urequests
import network
import ntptime
import music
import json


brightness=9

weather_serveraddr = "http://server.mindplus.top"

weather_appid = "31982666"

weather_appsecret = "E6MtBcxQ"

def weather_getWeather(_weather, _city):
  if weather_serveraddr=="http://www.tianqiapi.com":
    nowResult = urequests.get(weather_serveraddr+"/api/?appid="+weather_appid+"&appsecret="+weather_appsecret+"&version=v6&cityid="+_city)
    json=nowResult.json()
    nowResult.close()
    return json[_weather]
  else:
    nowResult = urequests.get(weather_serveraddr+"/api/weather/?appid="+weather_appid+"&appsecret="+weather_appsecret+"&version=v6&cityid="+_city)
    json=nowResult.json()
    nowResult.close()
    return json[_weather]


my_wifi = wifi()
my_wifi.connectWiFi("zhz","zy156721")
while not (my_wifi.sta.isconnected()):
  pass
rgb[1] = (0*brightness//9, 102*brightness//9, 0*brightness//9)
rgb.write()
music.pitch(392, 50)
oled.fill(0)
oled.DispChar("福建 福州", 0, (1-1)*16, 1)
oled.show()
ntptime.settime(8, "ntp.ntsc.ac.cn")
oled.DispChar(weather_getWeather("wea", "101230101"), 0, (2-1)*16, 1)
oled.DispChar((str("最低温度:") + str(weather_getWeather("tem2", "101230101"))), 0, (3-1)*16, 1)
oled.DispChar((str("最高温度:") + str(weather_getWeather("tem1", "101230101"))), 0, (4-1)*16, 1)
oled.show()[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 14:42:42

MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-20 15:07:11

Mind+  实验图形编程

MicroPython动手做(33)——物联网之天气预报图1
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail