教大家如何在树莓派上自己动手做一个天气预报。此次教程需要大家有一定的python 基础,没有也没关系,文末我会放出我已写好的代码供大家下载。

首先在开始之前 需要申请高德地图API,去高德地图官网注册一下,然后创建一个天气应用(免费的),得到一个免费key。然后开始撸码了 (说一下,我用的是python 3)

 

1.下面给出调用高德地图API,获取天气数据的方法。将申请的key替换进url中,再将你的城市代码(网上可查,可以具体到区)替换下即可。

def GetWeatherInfo():
url = "http://restapi.amap.com/v3/weather/weatherInfo?key=xxxxxxxxxxxxx&city=420115&extensions=all" #将xxxxxx替换为你申请的key,city代码替换为你的城市代码
try:
html = requests.get(url)
data = json.loads(html.text)
# #将JSON编码的字符串转换回Python数据结构
# output result of json
# print(data)
return data
except:
return None

2.系统信息及配置

# coding = utf-8
import subprocess
import time
import os
#device :eth0,wlan0
def get_ip(device):
ip = subprocess.check_output("ip -4 addr show " + device + " | grep inet | awk '{print $2}' | cut -d/ -f1", shell = True).strip()
return ip
# Return % of CPU used by user as a character string
#def getCPUuse():
# return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))
def getCPUuse():
#calculate CPU with two short time, time2 - time1
time1 = os.popen('cat /proc/stat').readline().split()[1:5]
time.sleep(0.2)
time2 = os.popen('cat /proc/stat').readline().split()[1:5]
deltaUsed = int(time2[0])-int(time1[0])+int(time2[2])-int(time1[2])
deltaTotal = deltaUsed + int(time2[3])-int(time1[3])
cpuUsage = float(deltaUsed)/float(deltaTotal)*100
return cpuUsage def net_stat():
net = []
f = open("/proc/net/dev")
lines = f.readlines()
f.close()
for line in lines[2:]:
con = line.split()
"""
intf = {}
intf['interface'] = con[0].lstrip(":")
intf['ReceiveBytes'] = int(con[1])
intf['ReceivePackets'] = int(con[2])
intf['ReceiveErrs'] = int(con[3])
intf['ReceiveDrop'] = int(con[4])
intf['ReceiveFifo'] = int(con[5])
intf['ReceiveFrames'] = int(con[6])
intf['ReceiveCompressed'] = int(con[7])
intf['ReceiveMulticast'] = int(con[8])
intf['TransmitBytes'] = int(con[9])
intf['TransmitPackets'] = int(con[10])
intf['TransmitErrs'] = int(con[11])
intf['TransmitDrop'] = int(con[12])
intf['TransmitFifo'] = int(con[13])
intf['TransmitFrames'] = int(con[14])
intf['TransmitCompressed'] = int(con[15])
intf['TransmitMulticast'] = int(con[16])
"""
intf = dict(
zip(
( 'interface','ReceiveBytes','ReceivePackets',
'ReceiveErrs','ReceiveDrop','ReceiveFifo',
'ReceiveFrames','ReceiveCompressed','ReceiveMulticast',
'TransmitBytes','TransmitPackets','TransmitErrs',
'TransmitDrop', 'TransmitFifo','TransmitFrames',
'TransmitCompressed','TransmitMulticast' ),
( con[0].rstrip(":"),int(con[1]),int(con[2]),
int(con[3]),int(con[4]),int(con[5]),
int(con[6]),int(con[7]),int(con[8]),
int(con[9]),int(con[10]),int(con[11]),
int(con[12]),int(con[13]),int(con[14]),
int(con[15]),int(con[16]), )
)
) net.append(intf)
return net

3.主程序。执行文件

#encoding: utf-8
import pygame
import time
import weatherAPI
import SystemInfo
from datetime import datetime # 显示图片函数
def ShowPicture(picturepath,x0,y0):
background=pygame.image.load(picturepath)
background.convert_alpha()
window.blit(background,(x0,y0))
return
def ShowCircle():
pygame.draw.circle(window,pygame.Color(255,255,255),(width/2,height/2),radius,fill)
return
# 划线函数,起始坐标,终点坐标
def ShowLine(x0,y0,x1,y1):
pygame.draw.line(window,pygame.Color(255,255,255),(x0,y0),(x1,y1),fill)
return
Yellow=(255,255,0)
Red=(255,0,0)
LightBlue=(190,190,255)
Green=(0,255,0)
Black=(0,0,0)
White=(255,255,255)
# 画框函数
def ShowRec(x0,y0,x1,y1,color,fill):
pygame.draw.rect(window,color,(x0,y0,x1,y1),fill)
return
# 字符串显示函数
def ShowStr(mystring,x0,y0,size):
font=pygame.font.Font('gkai00mp.ttf',size,bold=1)
textSuface=font.render(mystring,1,pygame.Color(255,255,255))
window.blit(textSuface,(x0,y0))
return def ShowStr2(mystring,x0,y0,size):
font=pygame.font.Font('gkai00mp.ttf',size,bold=1)
textSuface=font.render(mystring,1,pygame.Color(255,255,0))
window.blit(textSuface,(x0,y0))
return
def ShowStr3(mystring,x0,y0,size):
font=pygame.font.Font('gkai00mp.ttf',size,bold=1)
textSuface=font.render(mystring,1,pygame.Color(0,255,0))
window.blit(textSuface,(x0,y0))
return
#背景参数设置
width=1280
height=800
fill=1
#初始化背景
pygame.init()
window=pygame.display.set_mode((width,height),pygame.FULLSCREEN)#全屏
# window=pygame.display.set_mode((width,height))#不全屏
window.fill(pygame.Color(0,0,0))
# back=pygame.image.load(r"/home/pi/ccj/c.jpg") #图片位置 loop=0
last_ip = ip = ''
updatingtime=""
Title_X=width
WeatherValidation=False
while True:
# window.blit(back,(0,0)) #对齐的坐标
window.fill(pygame.Color(0,0,0)) #背景色0为黑
# ShowPicture("a_3.gif",20,450)
#draw grids
#ShowStr(u"时间",10,20,80)
ShowRec(10,10,width-20,height-80,White,1) #画一个大框
ShowLine(10,height/5,width-10,height/5)
ShowLine(10,height/5*3,width-10,height/5*3)
ShowLine(width/2,height/5,width/2,height-70)
ShowLine(width/4,height/5*3,width/4,height-70)
ShowLine(width/4*3,height/5*3,width/4*3,height-70) #time show
mylocaltime=time.localtime()
myclock=time.strftime("%H:%M:%S",mylocaltime)#13:15:03 2017-04-21
ShowStr(myclock,0,0,180)
mydate=time.strftime("%Y-%m-%d",mylocaltime)#2017-04-21
ShowStr(mydate,810,5,90)
mytime=time.strftime("%A",mylocaltime)#Thursday
ShowStr(mytime,830,90,85) name = "自动化实验室欢迎您"
ShowStr2(name,width/2+10,height/5*2-140,52)
ip = SystemInfo.get_ip('wlan0')
# ip = SystemInfo.get_ip('eth0')
cpu_usage =SystemInfo.getCPUuse()
ShowStr(ip,width/2+100,height/5*2-90,48)
ShowStr("ip:",width/2+10,height/5*2-90,52) #netspeed show
NetInfoOld=SystemInfo.net_stat()
time.sleep(1)
NetInfoNew=SystemInfo.net_stat()
DownloadSpeed=(NetInfoNew[0]["ReceiveBytes"]-NetInfoOld[0]["ReceiveBytes"])/1048576 #last second total flow -current second total flow
UploadSpeed=(NetInfoNew[0]["TransmitBytes"]-NetInfoOld[0]["TransmitBytes"])/1048576
ShowRec(width/2+20,height/5*2-40,DownloadSpeed/10*600+20,48,Green,0)
ShowRec(width/2+20,height/5*2+10,UploadSpeed/10*600+20,48,LightBlue,0)
ShowStr("↓:"+str("%3.2f"%(DownloadSpeed))+"MB/s",width/2+20,height/5*2-40,48)
ShowStr("↑:"+str("%3.2f"%(UploadSpeed))+"MB/s",width/2+20,height/5*2+10,48) #cpu_usage show
ShowRec(width/2+20,height/5*2+60,cpu_usage/100*600+60,48,Yellow,0)
ShowStr("CPU usage:"+str("%2d"%cpu_usage)+"%",width/2+20,height/5*2+110,48) if loop % 60==0 :
future = datetime.strptime('2019-1-1 00:00:00','%Y-%m-%d %H:%M:%S')
#当前时间
now = datetime.now()
#求时间差
delta = future - now
hour = delta.seconds/60/60
minute = delta.seconds/60
seconds = delta.seconds - hour*60*60 - minute*60
# print_now=now.strftime('%Y-%m-%d %H:%M:%S')
# print("今天是:",print_now)
# print("距离 2019-02-01 \"work\" 还剩下:%d天"%delta.days)
# print(delta.days,hour, minute, seconds) ShowStr2("倒计时:%dH (%dMin)"%(hour,minute),width/4*2+width/32+20,height/5*3+height/30+235,45) # #########################本地信息获取完成#######################################
# print ("↓:"+str("%3.1f"%(DownloadSpeed))+"MB/s")
# print ("↑:"+str("%3.1f"%(UploadSpeed))+"MB/s") #print("CPU usage:"+str("%2d"%cpu_usage)+"%") # ########weather show####################################
if loop % 10800==0 : #update per 3 hours
jsonArr=weatherAPI.GetWeatherInfo()
if jsonArr!=None : #记录请求数据时间
updatingtime=time.strftime("%H:%M:%S",mylocaltime)
if jsonArr["status"]!="":
print (jsonArr["msg"])
WeatherValidation=False
else:
result=jsonArr["forecasts"][0]
WeatherValidation=True
#print (result["city"],result["weather"],result["temp"],result["temphigh"],result["templow"])
if WeatherValidation==True:
# AQI=result["aqi"]
# index=result["index"]
# index0=index[0]
# daily=result["daily"]
# day1=daily[1]#明天天气预报
# day2=daily[2]#明天天气预报
# day3=daily[3]#明天天气预报
# day4=daily[4]#明天天气预报
# ## #室外温湿度
# ShowPicture("pictures/"+result["img"]+".png",width/16,height/5+150)
ShowStr("武汉市",width/32,height/5+10,60)
ShowStr(result["city"],width/32,height/5+80,60)
ShowStr(result["casts"][0]["dayweather"],width/32-25,height/5*2+50,120)
ShowStr(result["casts"][0]["daytemp"]+"℃",width/4,height/5,160) ShowStr("气温最低:"+result["casts"][0]["nighttemp"] +"℃",width/4-10,height/5*2-20,48)
ShowStr("接下来转:"+result["casts"][0]["nightweather"],width/4-10,height/5*2+50,48)
# ShowStr("zhesgii",width/2+20,height/5+10,120)
ShowStr("风力:"+result["casts"][0]["daypower"]+"级",width/4-10,height/5*2+110,48)
# ## #空气质量
# ShowStr("PM2.5:",width/2+280,height/5+120,32)
# ShowStr(AQI["pm2_5"],width/2+400,height/5-20,200)
# ShowStr("空气质量:"+AQI["quality"],width/2+240,height/5*2-40,32)
ShowPicture("pictures/"+result["casts"][0]["dayweather"]+".png",width/32+60,height/5+145)
# if Title_X<=-100:
# Title_X=width
# else:
# Title_X=Title_X-40
# ShowStr(index0["detail"],Title_X,height-50,40)
# #未来几天天气预报
ShowStr("明天:"+result["casts"][1]["date"],width/32,height/5*3+height/30-10,30)
ShowStr(result["casts"][1]["dayweather"],width/32,height/5*3+height/30+30,50)
ShowStr(result["casts"][2]["daytemp"]+"℃",width/32,height/5*3+height/30+80,70)
ShowStr("气温Min:"+result["casts"][1]["nighttemp"] +"℃",width/32-10,height/5*3+height/30+140,45)
ShowStr("未来转:"+result["casts"][1]["nightweather"],width/32-10,height/5*3+height/30+180,45)
ShowPicture("pictures/"+result["casts"][1]["dayweather"]+".png",width/32+170,height/5*3+height/30+45)
# ShowPicture("pictures/"+day1["day"]["img"]+".png",width/32,height/5*3+height/10)
# ##
ShowStr("后天:"+result["casts"][2]["date"],width/4+width/32,height/5*3+height/30-10,30)
ShowStr(result["casts"][2]["dayweather"],width/4+width/32,height/5*3+height/30+30,50)
ShowStr(result["casts"][2]["daytemp"]+"℃",width/4+width/32,height/5*3+height/30+80,70)
ShowStr("气温Min:"+result["casts"][2]["nighttemp"] +"℃",width/4+width/32-10,height/5*3+height/30+140,45)
ShowStr("未来转:"+result["casts"][2]["nightweather"],width/4+width/32-10,height/5*3+height/30+180,45)
ShowPicture("pictures/"+result["casts"][2]["dayweather"]+".png",width/4+width/32+170,height/5*3+height/30+45)
# ShowStr(day2["day"]["weather"],width/4+width/32,height/5*3+height/5-40,100)
# ShowStr(day2["day"]["windpower"],width/4+width/32+70,height/5*3+height/10,64)
# ShowStr(day2["night"]["templow"]+"~"+day2["day"]["temphigh"]+"℃",width/4+width/32,height-130,64)
# ShowPicture("pictures/"+day2["day"]["img"]+".png",width/4+width/32,height/5*3+height/10)
# ##
ShowStr("大后天:"+result["casts"][3]["date"],width/4*2+width/32-25,height/5*3+height/30-10,30)
ShowStr(result["casts"][3]["dayweather"],width/4*2+width/32-25,height/5*3+height/30+30,50)
ShowStr(result["casts"][3]["daytemp"]+"℃",width/4*2+width/32-25,height/5*3+height/30+80,70)
ShowStr("气温Min:"+result["casts"][3]["nighttemp"] +"℃",width/4*2+width/32-25,height/5*3+height/30+140,45)
ShowStr("未来转:"+result["casts"][3]["nightweather"],width/4*2+width/32-25,height/5*3+height/30+180,45)
ShowPicture("pictures/"+result["casts"][3]["dayweather"]+".png",width/4*2+width/32-25+170,height/5*3+height/30+45)
# ShowStr(day3["day"]["weather"],width/4*2+width/32,height/5*3+height/5-40,100)
# ShowStr(day3["day"]["windpower"],width/4*2+width/32+70,height/5*3+height/10,64)
# ShowStr(day3["night"]["templow"]+"~"+day2["day"]["temphigh"]+"℃",width/4*2+width/32,height-130,64)
# ShowPicture("pictures/"+day3["day"]["img"]+".png",width/4*2+width/32,height/5*3+height/10)
# ## ShowPicture("pictures/cj.png",width/4*3+width/32,height/5*3+height/30-15)
# ShowStr(day4["day"]["weather"],width/4*3+width/32,height/5*3+height/5-40,100)
# ShowStr(day4["day"]["windpower"],width/4*3+width/32+70,height/5*3+height/10,64)
# ShowStr(day4["night"]["templow"]+"~"+day2["day"]["temphigh"]+"℃",width/4*3+width/32,height-130,64)
# ShowPicture("pictures/"+day4["day"]["img"]+".png",width/4*3+width/32,height/5*3+height/10)
# #记录请求数据时间
ShowStr3("Last update:"+updatingtime,width/4*3+15,height/5*3,30)
ShowStr2("这里是滚动字幕显示区,加循环可实现动态效果",width/32-25,height/5*3+height/30+235,45)
#update pygame.display.update() loop +=1
#全屏
#for event in pygame.event.get():
# if event.type==pygame.KEYDOWN:
# running=False
pygame.quit()

公众号回复 “树莓派天气”  即可下载我为大家打包好的文件。下载好文件以后,解压文件会得到如下文件:1,天气图标文件夹pictures,2,字体文件gkai00mp.ttf,3,系统配置文件SystemInfo.py,4,获取天气数据文件weatherAPI.py,5,主程序pyMain.py 。将这些文件放在同一文件夹下,复制拷贝到树莓派上,为文件夹赋予权限,命令sudo chmod 777 文件夹名。最后终端执行命令运行主程序(sudo python3 pyMain.py)。此时应该就可以看到预报的画面。能看懂代码的人可自行修改 具体显示的背景、颜色、大小、布局、位置 、显示字体大小等。

关注一下,更多精彩,不容错过!

在树莓派上用 python 做一个炫酷的天气预报的更多相关文章

  1. canvas的进阶 - 学习利用canvas做一个炫酷的倒计时功能

    先给大家贴一张图片,因为我不会上传视频( ̄□ ̄||) ,请大家谅解了~  如果有知道怎么上传视频的大神还请指点指点 ^_^ ~ 然后看一下代码: html部分 :  <!DOCTYPE html ...

  2. 用Python做一个知乎沙雕问题总结

    用Python做一个知乎沙雕问题总结 松鼠爱吃饼干2020-04-01 13:40 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以 ...

  3. 使用python做一个IRC在线下载器

    使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...

  4. 百度前端技术学院2018笔记 之 利用 CSS animation 制作一个炫酷的 Slider

    前言 题目地址 利用 CSS animation 制作一个炫酷的 Slider 思路整理 首先页面包含三种东西 一个是type为radio的input其实就是单选框 二是每个单选框对应的label 三 ...

  5. 一个炫酷的Actionbar效果

    今天在网上看到一个炫酷的Actionbar效果,一个老外做的DEMO,目前很多流行的app已经加入了这个效果. 当用户初始进入该界面的时候,为一个透明的 ActiionBar ,这样利用充分的空间显示 ...

  6. 2019基于Hexo快速搭建个人博客,打造一个炫酷博客(1)-奥怪的小栈

    本文转载于:奥怪的小栈 这篇文章告诉你如何在2019快速上手搭建一个像我一样的博客:基于HEXO+Github搭建.并完成SEO优化,打造一个炫酷博客. 本站基于HEXO+Github搭建.所以你需要 ...

  7. 教你用canvas打造一个炫酷的碎片切图效果

    前言 今天分享一个炫酷的碎片式切图效果,这个其实在自己的之前的博客上有实现过,本人觉得这个效果还是挺炫酷的,这次还是用我们的canvas来实现,代码量不多,但有些地方还是需要花点时间去理解的,需要点数 ...

  8. 一个炫酷的flash网站模板

    这是一个炫酷的flash欧美网站模板,它包括首页,公司简介,留言等五个页面,界面转换非常的炫酷!他还有时间.全屏.背景音乐开关的功能!有兴趣的朋友可以看看!贴几张网站图片给大家看看! 下载后直接找到s ...

  9. Android一个炫酷的树状图组织架构图开源控件实现过程

    Android一个炫酷的树状图组织架构图开源控件 文章目录 [1 简介] [2 效果展示] [3 使用步骤] [4 实现基本布局流程] [5 实现自由放缩及拖动] [6 实现添加删除及节点动画] [7 ...

随机推荐

  1. SQL Server ->> FIRST_VALUE和LAST_VALUE函数

    两个都是SQL SERVER 2012引入的函数.用于返回在以分组和排序后取得最后一行的某个字段的值.很简单两个函数.ORDER BY字句是必须的,PARITION BY则是可选. 似乎没什么好说的. ...

  2. redis集群搭建与管理

    集群简介: Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令 ...

  3. Javascript 删除tr 元素

    Javascript 删除tr 元素   function delete1(obj){ var tr=obj.parentNode.parentNode; var tbody=tr.parentNod ...

  4. Can't create new folder in windows7

    First, please use System File Checker tool to troubleshoot(诊断) this issue. If the issue persists, im ...

  5. Oracle 时段负载情况

    ALTER session SET nls_date_format='yyyy-mm-dd hh24:mi:ss'; SELECT *  FROM ( SELECT A.INSTANCE_NUMBER ...

  6. 【pbrt】在c++程序中使用pbrt进行渲染

    近段时间做一个关于水面的动画.由于我用c++实现水面动画的,然而使用c++我自己的渲染系统渲染结果被同学说是可视化不叫渲染,所以我决定修改一下…… 恰好进来在学习pbrt,所以索性就蛋疼了考虑直接用p ...

  7. HBuilde H5开发,关于JSON的Storage存储

    今天踩坑了,在这里记一下. 我想做一个列表,开始是一个一个复制粘贴,然后发现这样太不灵活了,如果我有更多内容要填难道还要再一个一个复制吗? 所以我想到直接用JS动态生成最好,我的思路是这样的: //首 ...

  8. [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构

    在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVFormatContext  AVFormatContext是一个贯穿始终的数据结构,很多函 ...

  9. BZOJ2333:[SCOI2011]棘手的操作(Splay)

    Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: ...

  10. Codeforces Round #533 (Div. 2) B. Zuhair and Strings 【模拟】

    传送门:http://codeforces.com/contest/1105/problem/B B. Zuhair and Strings time limit per test 1 second ...