本来ならRaspberryPiを使いたいのだが入手困難な上、高額となってしまったため試行錯誤。
機能的には充分なOrangePi zero2にしてみた。お値段も手頃。
OSにはarmbianを選択。これとPX1122R-EVBをTX/RXで接続して基準局データを送信することができることを確認。
で、ケースをRaspberryPiと同じサイズにで作成すると上部に余ったスペースが出来た。
まぁケースを小くすることも考えたが、折角なのでOLEDの液晶とタクトスイッチをユニバーサル基板に半田付けして、と。
OLEDの液晶はSSD1306を用いたi2c接続で128×64の解像度。アマゾンでも買える。
まぁ、難儀しましたよ。Raspiと違って圧倒的に情報量が少ない。しかもOrangepi は種類が多くてサンプルがあってもzero2では動かないとか。
pythonのOPi.GPIOも結局まともに動作させられず、pythonからsubprocessを呼び出すなんて美しくない方法でタクトスイッチのON/OFFを取得せざるを得ず。
LCDにはIPアドレスと現在時刻。タクトスイッチの状態を表示。スイッチを5秒以上長押しでシャットダウンできるようにしてみた。
キモはWiringOPでのGPIOコマンドとタクトスイッチの状態を確定させるための10kΩプルダウン抵抗。
#!/usr/bin/env python
import subprocess
import datetime
import time
from oled.device import ssd1306
from oled.render import canvas
from PIL import ImageFont
import ipget
while True:
try:
target_ip = ipget.ipget()
ip = target_ip.ipaddr("eth0")
break;
except:
time.sleep(5)
device = ssd1306(port=3, address=0x3C) # rev.1 users set port=0
font = ImageFont.load_default()
flgPush = False #押されているか
pushStart =0 #押された時間
pushInt = 0
onStr="OFF"
flgShutdown = False
result = subprocess.run(
"/usr/local/bin/gpio mode 2 in",shell=True,
stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)
while True:
result = subprocess.run(
"/usr/local/bin/gpio read 2",shell=True,
stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)
val=result.stdout[0:1]
if val == "1" :
if flgPush : #既におされているか?
pushInt = time.time()-pushStart
else :
flgPush=True
pushStart = time.time()
pushInt = 0
onStr="ON"
else:
if flgPush :#既におされていて離した
flgPush=False
pushInt = time.time()-pushStart
onStr="OFF"
if pushInt > 5 :
flgShutdown = True
onStr="Shutdown..."
else :
flgPush=False
pushInt = 0
onStr="OFF"
with canvas(device) as draw:
font = ImageFont.load_default()
draw.text((0, 0), ip , font=font, fill=255)
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta,'JST')
now = datetime.datetime.now(JST)
d=now.date().strftime('%Y/%m/%d')
draw.text((0, 12),d , font=font, fill=255)
t=now.time().strftime('%X')
draw.text((0, 24),t , font=font, fill=255)
draw.text((0, 40),onStr , font=font, fill=255)
if not flgShutdown :
if pushInt>0:
draw.text((40,40),'{:.2f}'.format(pushInt),font=font,fill=255)
if flgShutdown :
break
time.sleep(0.3)
time.sleep(3)
with canvas(device) as draw:
draw.rectangle((0, 0, device.width-1, device.height-1), outline=0, fill=0)
print("shutdown")
result = subprocess.run(
"/usr/sbin/shutdown -h now",shell=True,
stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)