省錢黨注意了!用樹莓派打造智能時鐘

引言

最近更換了生活地點,發現家裡少了個鐘錶,為了弘揚艱苦奮鬥、能省就省的革命精神,利用家裡廢棄的七英寸顯示器,開發了一個智能時鐘,功能包括顯示當前的時間、當天的天氣與室內的溫溼度。

一、本文所需材料

1.1 本文所需的硬件

● DHT11溫溼度傳感器

● 顯示器

省錢黨注意了!用樹莓派打造智能時鐘

七英寸顯示器

如果沒有上述顯示器也可以使用電視等顯示器。

● 樹莓派

1.2 本文所需的軟件

●Python3環境

●RPi.GPIO庫

●Adafruit DHT11庫

二、樹莓派實現方法

2.1 硬件接線方法

省錢黨注意了!用樹莓派打造智能時鐘

DHT11傳感器接線方法

我們採用Board的樹莓派引腳編號方法,分別將DHT11傳感器的正極接到1號引腳,負極接到9號引腳,輸出接到7號引腳。

2.2 程序代碼說明

#!/usr/bin/env python
# encoding: utf-8

說明:#!/usr/bin/envpython表示調用系統環境變量中Python解釋器,# encoding: utf-8表示採用utf-8的格式對代碼進行編碼。

import turtle
from datetime import *
import string
import socket
from xml.dom.minidom import *
import time
import Adafruit_DHT
import RPi.GPIO as gpio
import fcntl
import struct
from urllib.parse import quote
import urllib.request

說明:加入程序所需的python包

def get_weather():
page_url =
"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=北京"
url_quote =quote(page_url, safe=string.printable)
page = urllib.request.urlopen(url_quote)

lines = page.readlines()
page.close()
document = ""
for line in lines :
document = document +line.decode('utf-8')
dom = parseString(document)
strings = dom.getElementsByTagName("string")
weather_info = strings[10].childNodes[0].data
return weather_info[0:33]

說明:get_weather()函數功能是從互聯網獲取北京當天的天氣信息,並保存在weather_info字符串中,由於所獲取的天氣信息過多,這裡僅僅選取部分信息作為函數的返回值。

def print_weather_info():
printer = turtle.Turtle()
printer.penup()
printer.pencolor('white')
weather_info = get_weather()
printer.backward(90)
printer.write(weather_info, align="center", font=("Courier", 14,"bold"))
printer.forward(90)
return None

說明:print_weather_info()函數功能是單獨顯示天氣信息。由於我們獲取天氣信息的網站規定每天免費查詢的次數是有限的,同時後續時間信息的顯示需要不斷的更新數據,因此本程序採用單獨顯示天氣信息的方法。

def get_ipaddr(name):
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915, struct.pack('256s', name[:15].encode('utf-8')))[20:24])

說明:get_ipaddr()函數功能是獲取指定網卡的ip地址,即函數的參數可以是wlan0、eth0或lo等。

 def get_time(t):
second = t.second + t.microsecond * 0.000001
minute = t.minute +second / 60.0
hour = t.hour +minute / 60.0
return "%d點%d分%d秒" % (hour, minute,second)

說明:get_time()函數功能是獲取當前時刻,並以幾點幾分幾秒的字符串形式進行返回。函數的參數是函數datetime.today()函數的返回值。

def get_week(t):
week = ["星期一", "星期二", "星期三","星期四", "星期五", "星期六", "星期日"]
return week[t.weekday()]

說明:get_week()函數功能是獲取當前時間的星期信息。函數的參數是函數datetime.today()函數的返回值。

def get_date(t):
y = t.year
m = t.month
d = t.day
return "%s年%d月%d日" % (y, m, d)

說明:get_date()函數功能是獲取當前時間的年月日信息。函數的參數是函數datetime.today()函數的返回值。

 def sensor():
gpio.setmode(gpio.BCM)

sensor = Adafruit_DHT.DHT11
pin_sensor = 4
gpio.setup(pin_sensor,gpio.IN)
humidity, temperature =Adafruit_DHT.read_retry(sensor, pin_sensor)
return "室內溫度:{0:0.1f}*C 室內溼度:{1:0.1f}%".format(temperature,humidity)

說明:sensor()函數功能是獲取DHT11溫溼度傳感器測量信息,並以字符串的形式返回測量結果。

 def screen_printer():
printer = turtle.Turtle()
printer.hideturtle()
printer.pencolor('white')
printer.penup()
t = datetime.today()
printer.forward(60)
printer.write(get_date(t),
align="center", font=("Courier", 14,"bold"))
printer.backward(60)
printer.forward(30)
printer.write(get_week(t),
align="center", font=("Courier", 14,"bold"))
printer.backward(30)
printer.write(get_time(t),
align="center", font=("Courier", 14,"bold"))
printer.backward(30)
printer.write(get_ipaddr('wlan0'), align="center", font=("Courier",14, "bold"))
printer.backward(30)
printer.write(sensor(),
align="center", font=("Courier", 14, "bold"))
printer.clear()
return None

說明:screen_printer()函數功能是顯示時間與溫溼度傳感器信息。

 def perform():
while(1):
screen_printer()
time.sleep(1)
return None

說明:perform()函數的功能是更新當前屏幕所顯示的信息。

def setup():
turtle.mode("logo")
turtle.tracer(False)
turtle.hideturtle()
turtle.bgcolor('black')
return None

說明:setup()函數的功能是設置屏幕顯示配置,包括屏幕朝向與屏幕背景顏色等。

def main():
setup()
print_weather_info()
perform()
turtle.mainloop()
return None

說明:main()函數功能是規定了上述函數的執行流程。

if __name__ == "__main__":
main()

2.3 實現效果

將上述代碼保存為smart_clock.py文件,並在終端輸入sudo python3 smart_clock.py命令運行上述代碼,可看到如圖6所示界面。注意,這裡需要使用python3命令來運行,否則會出現python2與python3不兼容的問題。

省錢黨注意了!用樹莓派打造智能時鐘


分享到:


相關文章: