树莓派测温湿度(树莓派DIY天气预报)
我的树莓派一般用来学习python,因为一直放在桌面上感觉非常枯燥,决定加一个屏幕用来显示天气情况。
闲话不多说,进入正题,先上一个成品图片
最底下是一个硬盘,中间是树莓派,有一个18B20传感器测量室温。
首先硬件的情况:树莓派使用的是4B1G版本(购买比较早,抢购的,130元抢购的,现在价格很高了,可以树莓派其他版本代替);硬盘为250g机械硬盘(因为4B支持usb启动,所以我一直都没用内存卡);树莓派外壳,已被积木包围,建议只购买散热片和风扇,直接使用积木作为外壳;积木直接大家去拼多多或者淘宝搜索微粒积木就可以,我这是买的8毫米500粒混色,不到五块钱,喜欢纯色的可以去买纯色。
屏幕采用的是淘晶驰串口屏2.2寸无触摸,咸鱼30元买的,需要下载软件开发,如有有需要这个UI的请留言。
程序话不多说,直接代码走起,其中天气部分为爬虫爬取(如有需要天气接口的请留言哦)
下面放代码:
GNU nano 3.2 1.txt 已更改
w#!/usr/bin/python3
# coding:utf-8
#采用爬虫模式
from apscheduler.schedulers.blocking import BlockingScheduler
import datetime
import serial
import time
import re
from urllib import request
# 打开串口
ser = serial.Serial("/dev/ttyAMA0", 9600)
ser.flushInput()
try:
url = 'https://tianqi.moji.com/today/china/shandong/weifang'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36','Referer':'https://tianqi.moji.com/forecast7/china/shandong',
'Host': 'tianqi.moji.com','sec-ch-ua': ' "\\Not;A\"Brand";v="99", "Google Chrome";v="85", "Chromium";v="85" ','sec-fetch-site':'cross-site'}
req = request.Request(url,headers=headers)
resp = request.urlopen(req)
#print(resp.read().decode('utf-8'))
s = resp.read().decode('utf-8')
ret = re.findall(r'<div\sclass="detail_time clearfix">.*?年(.*?) .*?\n(.*?)\n</div>.*?<div class="detail_wea clearfix">.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)</b>.*?<span>湿度 (.*?)%</span>.*?<em>(.*?) (.*?)级</em>.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)°</b>.*?<p><strong>日出 (.*?)</strong>.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)°</b>.*?<p><strong class="sun_down">日落 (.*?)</strong></p>.*?<b>(.*?)°</b>.*?<strong>(.*?)°</strong>.*?<span class="week">.*?<span class="week">周(.*?)</span>.*?<div class="$ b=['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']
d = dict(zip(b,ret[0]))
real='page0.t1.txt="' d['4'] '℃ ' d['6'] '%"'
ser.write(real.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
data='page0.t4.txt="' d['5'] '"'
ser.write(data.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
data1='page0.t5.txt="' d['7'] '"'
ser.write(data1.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
data2='page0.t6.txt="' d['8'] '级"'
ser.write(data2.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
except:
data=''
ser.write(data.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
data='page0.t0.txt="' time.strftime('%m月%d日') '"'
ser.write(data.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
if time.strftime('%u')=="0":
week='page0.g0.txt="今天是周末耶!"'
if time.strftime('%u')=="1":
week='page0.g0.txt="今天星期一,美好的一周又开始了!"'
if time.strftime('%u')=="2":
week='page0.g0.txt="今天星期二,仍然需要努力工作!"'
if time.strftime('%u')=="3":
week='page0.g0.txt="今天星期三,本周马上过半了!"'
if time.strftime('%u')=="4":
week='page0.g0.txt="今天星期四,还有两天就周末了!"'
if time.strftime('%u')=="5":
week='page0.g0.txt="今天星期五,还有一天就休息了!"'
if time.strftime('%u')=="6":
week='page0.g0.txt="今天星期六,明天就可以休息了!"'
ser.write(week.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
def aps_test():#每秒刷新
ti=time.strftime('%H:%M:%S')
begin='page0.t3.txt="' ti '"'
ser.write(begin.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
tim=time.strftime('%H:%M')
#print(tim)
if tim=="18:00":
begin='dims=0'
ser.write(begin.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
if tim=="08:00":
begin='dims=100'
ser.write(begin.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
def aps_test1():#每小时刷新
'''
try:
url = 'https://tianqi.moji.com/today/china/shandong/weifang'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36','Referer':'https://tianqi.moji.com/forecast7/china/shandong',
'Host': 'tianqi.moji.com','sec-ch-ua': ' "\\Not;A\"Brand";v="99", "Google Chrome";v="85", "Chromium";v="85" ','sec-fetch-site':'cross-site'}
req = request.Request(url,headers=headers)
resp = request.urlopen(req)
#print(resp.read().decode('utf-8'))
s = resp.read().decode('utf-8')
ret = re.findall(r'<div\sclass="detail_time clearfix">.*?年(.*?) .*?\n(.*?)\n</div>.*?<div class="detail_wea clearfix">.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)</b>.*?<span>湿度 (.*?)%</span>.*?<em>(.*?) (.*?)级</em>.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)°</b>.*?<p><strong>日出 (.*?)</strong>.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)°</b>.*?<p><strong class="sun_down">日落 (.*?)</strong></p>.*?<b>(.*?)°</b>.*?<strong>(.*?)°</strong>.*?<span class="week">.*?<span class="week">周(.*?)</span>.*?<div cla$ b=['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']
d = dict(zip(b,ret[0]))
real='page0.t1.txt="' d['4'] '℃' d['6'] '%"'
ser.write(real.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
data='page0.t4.txt="' d['5'] '"'
ser.write(data.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
data1='page0.t5.txt="' d['7'] '"'
ser.write(data1.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
data2='page0.t6.txt="' d['8'] '级"'
ser.write(data2.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
except:
real=''
ser.write(real.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
'''
data='page0.t0.txt="' time.strftime('%m月%d日') '"'
ser.write(data.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
if time.strftime('%u')=="0":
week='page0.g0.txt="今天是周末耶!"'
if time.strftime('%u')=="1":
week='page0.g0.txt="今天星期一,美好的一周又开始了!"'
if time.strftime('%u')=="2":
week='page0.g0.txt="今天星期二,仍然需要努力工作!"'
if time.strftime('%u')=="3":
week='page0.g0.txt="今天星期三,本周马上过半了!"'
if time.strftime('%u')=="4":
week='page0.g0.txt="今天星期四,还有两天就周末了!"'
if time.strftime('%u')=="5":
week='page0.g0.txt="今天星期五,还有一天就休息了!"'
if time.strftime('%u')=="6":
week='page0.g0.txt="今天星期六,明天就可以休息了!"'
ser.write(week.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
def aps_test2():#每2秒刷新一次
#打开温度传感器文件
tfile = open("/sys/bus/w1/devices/28-3c01f09664a0/w1_slave")
#读取文件所有内容
text = tfile.read()
#关闭文件
tfile.close()
#用换行符分割字符串成数组,并取第二行
secondline = text.split("\n")[1]
#用空格分割字符串成数组,并取最后一个,即t=23000
temperaturedata = secondline.split(" ")[9]
#取t=后面的数值,并转换为浮点型
temperature = float(temperaturedata[2:])
# 转换单位为摄氏度
temperature = (temperature / 1000)
#print(temperature)
ti=time.strftime('%H:%M:%S')
begin='page0.t2.txt="' str(temperature) '"'
ser.write(begin.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
begin='p1.pic=1'
ser.write(begin.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
time.sleep(1)
begin='p1.pic=2'
ser.write(begin.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
def aps_test3():#每天刷新一次,未使用
url = 'https://tianqi.moji.com/today/china/shandong/weifang'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36','Referer':'https://tianqi.moji.com/forecast7/china/shandong',
'Host': 'tianqi.moji.com','sec-ch-ua': ' "\\Not;A\"Brand";v="99", "Google Chrome";v="85", "Chromium";v="85" ','sec-fetch-site':'cross-site'}
req = request.Request(url,headers=headers)
resp = request.urlopen(req)
#print(resp.read().decode('utf-8'))
s = resp.read().decode('utf-8')
ret = re.findall(r'<div\sclass="detail_time clearfix">(.*?) .*?\n(.*?)\n</div>.*?<div class="detail_wea clearfix">.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)</b>.*?<span>湿度 (.*?)%</span>.*?<em>(.*?)级</em>.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)°</b>.*?<p><strong>日出 (.*?)</strong>.*?<h2>今天(.*?)</h2>.*?<em>(.*?)</em>.*?<b>(.*?)°</b>.*?<p><strong class="sun_down">日落 (.*?)</strong></p>.*?<b>(.*?)°</b>.*?<strong>(.*?)°</strong>.*?<span class="week">.*?<span class="week">周(.*?)</span>.*?<div class="tree clearf$ b=['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22']
d = dict(zip(b,ret[0]))
week='page0.g0.txt="天王盖地虎,今天星期' d['18'] '"'
ser.write(week.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
data='page0.t2.txt="' d['1'] '"'
ser.write(data.encode("GB2312"))
ser.write(bytes.fromhex('ff ff ff'))
scheduler = BlockingScheduler()
scheduler.add_job(func=aps_test, trigger='cron', second='*/1')#定时任务,每秒执行
scheduler.add_job(func=aps_test1, trigger='cron', minute=0)#定时任务,每小时的第零秒执行
scheduler.add_job(func=aps_test2, trigger='cron', second='*/5')#定时任务,每5秒执行
#scheduler.add_job(func=aps_test3, trigger='cron', hour=0)#定时任务,每小时的第零秒执行
scheduler.start()
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com