前回までやっていたGLCDをライブラリ化して、gitHubを更新しました。
https://github.com/takishita2nd/GLCD
このGLCDライブラリを使ってGLCDに時刻、気温、湿度、天候情報を表示させたいと思います。
まず、温度、湿度を表示させるために、AM2320周りもライブラリ化しました。
import time
import smbus
i2c = smbus.SMBus(1)
address = 0x5c
def GetTemp():
loop = True
block = []
while loop:
try:
i2c.write_i2c_block_data(address, 0x00,[])
i2c.write_i2c_block_data(address, 0x03,[0x02, 0x02])
time.sleep(0.05)
block = i2c.read_i2c_block_data(address, 0, 4)
loop = False
except IOError:
pass
temp = block[2] << 8 | block[3]
return format(temp / 10)
def GetHum():
loop = True
block = []
while loop:
try:
i2c.write_i2c_block_data(address, 0x00,[])
i2c.write_i2c_block_data(address, 0x03,[0x00, 0x02])
time.sleep(0.05)
block = i2c.read_i2c_block_data(address, 0, 4)
loop = False
except IOError:
pass
hum = block[2] << 8 | block[3]
return format(hum / 10)
天候データはopenWeatherのWebAPIを利用します。
https://openweathermap.org
openWeatherにした理由は、今のGLCDが半角アスキー文字しか表示できないので、どうしても英語で表示させる必要があります。
なので、海外の英語のAPIを利用させて貰いました。
アクセス回数を絞れば無料で利用できます。
import json
import urllib.request
weather = ""
temp_min = 0
temp_max = 0
temp = 0
def RequestAPI():
global weather
global temp_max
global temp_min
global temp
url = 'http://api.openweathermap.org/data/2.5/weather?lat=XXX&lon=XXX&units=metric&appid=XXXXXXXX'
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as res:
body = json.load(res)
weather = body['weather'][0]['main']
temp_min = body['main']['temp_min']
temp_max = body['main']['temp_max']
temp = body['main']['temp']
def GetWeather():
return weather
def GetTemp():
return temp
def GetTempMin():
return temp_min
def GetTempMax():
return temp_max
個人情報を含んでいるので、クエリパラメータは書き換えてあります。
これらを使って、GLCDに表示させます。
import RPi.GPIO as GPIO
import time
import datetime
import calendar
import GLCD
import AM2320
import Weather
def __main__():
GLCD.PinsInit(20, 7, 8, 9, 18, 19, 10, 11, 12, 13, 14, 15, 16, 17)
GLCD.GLCDInit()
GLCD.GLCDDisplayClear()
roop = 10 * 60 * 60
try:
while True:
if roop >= 10 * 60 * 60:
Weather.RequestAPI()
weather = Weather.GetWeather()
temp = Weather.GetTemp()
roop = 0
GLCD.GLCDPuts(1, 0, "Date :")
GLCD.GLCDPuts(10, 8, datetime.datetime.now().strftime('%Y:%m:%d %A'))
GLCD.GLCDPuts(1, 16, "Weather :")
GLCD.GLCDPuts(10,24, weather)
GLCD.GLCDPuts(10,32, "Temp : " + format(temp) + 'C')
GLCD.GLCDPuts(1, 40, "Time : " + datetime.datetime.now().strftime('%H:%M:%S'))
GLCD.GLCDPuts(1, 48, "Humidity : " + AM2320.GetHum() + '%')
GLCD.GLCDPuts(1, 56, "Temperature : " + AM2320.GetTemp() + 'C')
roop += 1
time.sleep(0.1)
except KeyboardInterrupt:
GLCD.GLCDDisplayClear()
GPIO.cleanup()
__main__()
フーフーって聞こえているのは、AM2320に息を吹きかけています。
なんか良い感じだぞ。
配線の見た目をなんとかすれば、そのままインテリアとして使えるかもしれない。