これは自分のためのメモです。
この備忘録を見られて真似されても結構ですが、動作の保証は出来かねます。
また、真似られたことで不測の不具合が発生しましても、私は一切の責任を負いません。
Waveshafe 1.3inch OLED HAT wiki
wikiに倣い、config.txtを修正する。 # Uncomment some or all of these to enable the optional hardware interfaces dtparam=i2c_arm=on ← コメントアウトを外す #dtparam=i2s=on dtparam=spi=on ← コメントアウトを外す check whether SPI is occupied. If the terminal outputs /dev/spidev0.1 and /dev/spidev0.1, SPI is not occupied. $ls /dev/spi* ライブラリーのインストール BMC2835関係のみ必要。(wikiにあるWiringPiは不要) ここで最新を確認する。 2023年9月22日時点で バージョン1.73 #Open the Raspberry Pi terminal and run the following command wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.73.tar.gz tar zxvf bcm2835-1.73.tar.gz cd bcm2835-1.73/ sudo ./configure && sudo make && sudo make check && sudo make install # For more information, please refer to the official website: http://www.airspayce.com/mikem/bcm2835/ Pythonのライブラリーをpipインストールする #python3 sudo apt-get update sudo apt-get install python3-pip sudo pip3 install RPi.GPIO sudo apt-get install python3-smbus sudo pip3 install spidev waveshare提供のサンプルプログラムをダウンロード sudo apt-get install p7zip-full wget https://files.waveshare.com/upload/5/53/1.3inch-OLED-HAT-Code.7z 7zr x 1.3inch-OLED-HAT-Code.7z -r -o. sudo chmod 777 -R RaspberryPi サンプルプログラムの実行 cd RaspberryPi/python3/ sudo python3 main.py sudo python3 key_demo.py
IPアドレスとCPU温度を表示させる。
sudo pip3 install ipget
test.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import SH1106
import time
import config
import traceback
import ipget
from PIL import Image,ImageDraw,ImageFont
tempfile='/sys/class/thermal/thermal_zone0/temp'
def getTemp():
with open(tempfile, 'r') as f:
rdata = f.readline()
t = float(rdata)/ 1000.0
return t
target_ip = ipget.ipget()
print(target_ip.ipaddr("wlan0"))
wlan_ip = target_ip.ipaddr("wlan0")
t = getTemp()
cputemp = 'cputemp=%.2f C' % (t)
try:
disp = SH1106.SH1106()
print("\r\r1.3inch OLED")
# Initialize library.
disp.Init()
# Clear display.
disp.clear()
# Create blank image for drawing.
image1 = Image.new('1', (disp.width, disp.height), "WHITE")
draw = ImageDraw.Draw(image1)
font = ImageFont.truetype('Font.ttf', 20)
font10 = ImageFont.truetype('Font.ttf',13)
# print ("***draw line")
# draw.line([(0,0),(127,0)], fill = 0)
# draw.line([(0,0),(0,63)], fill = 0)
# draw.line([(0,63),(127,63)], fill = 0)
# draw.line([(127,0),(127,63)], fill = 0)
# print ("***draw rectangle")
print ("***draw text")
# draw.text((30,0), 'Waveshare ', font = font10, fill = 0)
draw.text((0,0), wlan_ip, font = font10, fill = 0)
draw.text((0,20), cputemp, font = font10, fill = 0)
# draw.text((28,20), u'あいうえ ', font = font, fill = 0)
# image1=image1.rotate(180)
disp.ShowImage(disp.getbuffer(image1))
time.sleep(2)
print ("***draw image")
# Himage2 = Image.new('1', (disp.width, disp.height), 255) # 255: clear the frame
# bmp = Image.open('pic.bmp')
# Himage2.paste(bmp, (0,5))
# # Himage2=Himage2.rotate(180)
# disp.ShowImage(disp.getbuffer(Himage2))
except IOError as e:
print(e)
except KeyboardInterrupt:
print("ctrl + c:")
epdconfig.module_exit()
exit()
1分毎にに自動更新で表示するようにcrontab -eで編集する
@reboot sleep 20 ; sudo /usr/bin/touch /tmp/amedas ; sudo /usr/bin/chmod 660 /tmp/amedas ; cd /home/pi ; /usr/bin/sudo /usr/bin/python3 amedas.py @reboot sleep 30 ; cd /home/pi/RaspberryPi/python3 ; /usr/bin/sudo /usr/bin/python3 test.py */10 * * * * cd /home/pi ; /usr/bin/sudo /usr/bin/python3 amedas.py */1 * * * * cd /home/pi/RaspberryPi/python3 ; /usr/bin/sudo /usr/bin/python3 test.py
load averageも表示されてみる
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import SH1106
import time
import config
import traceback
import ipget
from PIL import Image,ImageDraw,ImageFont
tempfile='/sys/class/thermal/thermal_zone0/temp'
loadfile='/proc/loadavg'
def getTemp():
with open(tempfile, 'r') as f:
rdata = f.readline()
t = float(rdata)/ 1000.0
return t
def getCpuload():
with open(loadfile, 'r') as la:
rdata = la.readline()
la = rdata
return la
target_ip = ipget.ipget()
wlan_ip = target_ip.ipaddr("wlan0")
t = getTemp()
cputemp = 'cputemp=%.2f C' % (t)
la = getCpuload()
la_list = la.split()
cpuload = 'loadave=' + la_list[0] + ' ' + la_list[1] + ' ' + la_list[2]
try:
disp = SH1106.SH1106()
print("\r\r1.3inch OLED")
# Initialize library.
disp.Init()
# Clear display.
disp.clear()
# Create blank image for drawing.
image1 = Image.new('1', (disp.width, disp.height), "WHITE")
draw = ImageDraw.Draw(image1)
font = ImageFont.truetype('Font.ttf', 20)
font10 = ImageFont.truetype('Font.ttf',10)
print ("***draw text")
draw.text((0,0), wlan_ip, font = font10, fill = 0)
draw.text((0,15), cputemp, font = font10, fill = 0)
draw.text((0,30), cpuload, font = font10, fill = 0)
disp.ShowImage(disp.getbuffer(image1))
time.sleep(2)
except IOError as e:
print(e)
except KeyboardInterrupt:
print("ctrl + c:")
epdconfig.module_exit()
exit()
何故かハマり、先人のお知恵で解決
sudo apt-get install libatlas3-base
アメダスの津地域情報を採取する。
名張では気温情報が無くてハマった。
$sudo touch /var/log/amedas
$sudo chmod 666 /var/log/amedas
$ cat amedas.py
#!/usr/bin/env python3
import sys
import requests
from datetime import datetime, timedelta
def get_code(name, name_type='enName'):
area = requests.get("https://www.jma.go.jp/bosai/amedas/const/amedastable.json").json()
for code in area:
if area[code][name_type] == name:
return code
else:
return None
def get_json(datetime_str, code):
return requests.get(f"https://www.jma.go.jp/bosai/amedas/data/map/{datetime_str}.json").json()[code]
def get_data(code, datetime_str=None):
if not datetime_str:
datetime_str = datetime.now().strftime('%Y%m%d%H0000')
try:
data = get_json(datetime_str, code)
except Exception:
# try to get previous data
datetime_str = (datetime.now() - timedelta(hours=1)).strftime('%Y%m%d%H0000')
data = get_json(datetime_str, code)
else:
data = get_json(datetime_str, code)
return data
if __name__ == '__main__':
try:
conf = {'area': 'Tsu', 'log': '/tmp/amedas'}
if len(sys.argv) > 1:
with open(sys.argv[1]) as f:
for line in f.readlines():
key_value = line.rstrip().split('#')[0].split('=')
if len(key_value) != 2:
continue
conf[key_value[0]] = key_value[1]
code = conf.get('code', get_code(conf['area']))
print (code)
# code = 53151
# print (code)
data = get_data(code)
print (data)
with open(conf['log'], 'w') as f:
f.write(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {data['temp'][0]} {data['humidity'][0]}")
except KeyboardInterrupt:
pass
$ cat RaspberryPi/python3/test.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import SH1106
import time
import config
import traceback
import ipget
from PIL import Image,ImageDraw,ImageFont
tempfile='/sys/class/thermal/thermal_zone0/temp'
loadfile='/proc/loadavg'
amedasfile='/tmp/amedas'
def getTemp():
with open(tempfile, 'r') as f:
rdata = f.readline()
t = float(rdata)/ 1000.0
return t
def getCpuload():
with open(loadfile, 'r') as la:
rdata = la.readline()
la = rdata
return la
def getAmedas():
with open(amedasfile, 'r') as la:
rdata = la.readline()
la = rdata
return la
target_ip = ipget.ipget()
wlan_ip = target_ip.ipaddr("wlan0")
t = getTemp()
cputemp = 'cputemp %.2f C' % (t)
la = getCpuload()
la_list = la.split()
cpuload = 'loadave ' + la_list[0] + ' ' + la_list[1] + ' ' + la_list[2]
la = getAmedas()
ame_list = la.split()
amedas = 'Mie Tsu ' + ame_list[2] + 'C ' + ame_list[3] + '%'
try:
disp = SH1106.SH1106()
print("\r\r1.3inch OLED")
# Initialize library.
disp.Init()
# Clear display.
disp.clear()
# Create blank image for drawing.
image1 = Image.new('1', (disp.width, disp.height), "WHITE")
draw = ImageDraw.Draw(image1)
font = ImageFont.truetype('Font.ttf', 20)
font10 = ImageFont.truetype('Font.ttf',10)
print ("***draw text")
draw.text((0,0), wlan_ip, font = font10, fill = 0)
draw.text((0,15), cputemp, font = font10, fill = 0)
draw.text((0,30), cpuload, font = font10, fill = 0)
draw.text((0,45), amedas, font = font10, fill = 0)
disp.ShowImage(disp.getbuffer(image1))
time.sleep(2)
except IOError as e:
print(e)
except KeyboardInterrupt:
print("ctrl + c:")
epdconfig.module_exit()
exit()








