前提・実現したいこと
python3で換気扇のタイマーを作りました。
市販品のタイマーには、秒単位で1日に20回以上のオンオフができるものが見つからなかったので、ラズパイで作ってみようと思いました。
出来上がって2〜3回デバッグを行って、ほぼ思い通りの動きを確認しました。
コマンドラインから実行すると、指定した時刻通りに、換気扇のオンオフを
実行してくれました。
構成:
ラズパイゼロWH、SD8GB
GPIOをリレーモジュール(DC5V)に接続しています
言語:python3
パソコンからVNCを経由してプログラム&実行しています。
以上のような機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージは出ないのですが、プログラムが勝手に終了してしまいます。
再度実行したら正常に動作するのです、やはり、1〜2日経つと終了してしまいます。
該当のソースコード
言語:PYTHON3.9(64bit)
ソースコード
import readchar
import datetime
GPIOモジュールとtimeモジュールをimport
import RPi.GPIO as GPIO
import time
GPIO番号指定をBCM(GPIO番号)に設定
GPIO.setmode(GPIO.BCM)
GPIOの初期化(LED)
GPIO.setup(18, GPIO.OUT) # 5V DC Relay
開始・停止用タイムテーブル チェック済みフラグ
on_time_table = []
off_time_table = []
check_flag_on = []
check_flag_off = []
initial_value = (99, 99, 99)
initial_value = ( 0, 0, 0)
t_num = 24
タイムテーブル初期化
for num in range(t_num):
on_time_table.append(initial_value)
off_time_table.append(initial_value)
check_flag_on.append(0)
check_flag_off.append(0)
ON 時間(ON時, ON分, ON秒)
on_time_table[0] = ( 0, 0, 0)
on_time_table[1] = ( 1, 0, 0)
on_time_table[2] = ( 2, 0, 0)
on_time_table[3] = ( 3, 0, 0)
on_time_table[4] = ( 4, 0, 0)
on_time_table[5] = ( 5, 0, 0)
on_time_table[6] = ( 6, 0, 0)
on_time_table[7] = ( 7, 0, 0)
on_time_table[8] = ( 8, 0, 0)
on_time_table[9] = ( 9, 0, 0)
on_time_table[10] = (10, 0, 0)
on_time_table[11] = (11, 0, 0)
on_time_table[12] = (12, 0, 0)
on_time_table[13] = (13, 0, 0)
on_time_table[14] = (14, 0, 0)
on_time_table[15] = (15, 0, 0)
on_time_table[16] = (16, 0, 0)
on_time_table[17] = (17, 0, 0)
on_time_table[18] = (18, 0, 0)
on_time_table[19] = (19, 0, 0)
on_time_table[20] = (20, 0, 0)
on_time_table[21] = (21, 0, 0)
on_time_table[22] = (22, 0, 0)
on_time_table[23] = (23, 0, 0)
ON_OFF 時間(OFF時, OFF分, OFF秒)
off_time_table[0] = ( 0, 1, 0)
off_time_table[1] = ( 1, 1, 0)
off_time_table[2] = ( 2, 1, 0)
off_time_table[3] = ( 3, 1, 0)
off_time_table[4] = ( 4, 1, 0)
off_time_table[5] = ( 5, 1, 0)
off_time_table[6] = ( 6, 1, 0)
off_time_table[7] = ( 7, 1, 0)
off_time_table[8] = ( 8, 1, 0)
off_time_table[9] = ( 9, 1, 0)
off_time_table[10] = (10, 1, 0)
off_time_table[11] = (11, 1, 0)
off_time_table[12] = (12, 1, 0)
off_time_table[13] = (13, 1, 0)
off_time_table[14] = (14, 1, 0)
off_time_table[15] = (15, 1, 0)
off_time_table[16] = (16, 1, 0)
off_time_table[17] = (17, 1, 0)
off_time_table[18] = (18, 1, 0)
off_time_table[19] = (19, 1, 0)
off_time_table[20] = (20, 1, 0)
off_time_table[21] = (21, 1, 0)
off_time_table[22] = (22, 1, 0)
off_time_table[23] = (23, 1, 0)
today = datetime.date.today()
i = -1
try:
while True:
i += 1
todaydetail = datetime.datetime.today() now_time = (todaydetail.year, todaydetail.month, todaydetail.day, todaydetail.hour, todaydetail.minute, todaydetail.second) this_day = todaydetail.day on_hour = on_time_table[i][0] on_minute = on_time_table[i][1] on_second = on_time_table[i][2] on_time = (todaydetail.year, todaydetail.month, todaydetail.day, on_hour, on_minute, on_second) off_hour = off_time_table[i][0] off_minute = off_time_table[i][1] off_second = off_time_table[i][2] off_time = (todaydetail.year, todaydetail.month, todaydetail.day, off_hour, off_minute, off_second) print(now_time, on_time, off_time) if check_flag_on[i] == 0 and now_time >= on_time: # リレーをONさせる GPIO.output(18, 1) check_flag_on[i] = 1 if check_flag_off[i] == 0 and now_time >= off_time: # リレーをOFFさせる GPIO.output(18, 0) check_flag_off[i] = 1 if i >= t_num - 1: i = -1 todaydetail = datetime.datetime.today() if this_day != todaydetail.day: for j in range(t_num): check_flag_on[j] = 0 check_flag_off[j] = 0
except KeyboardInterrupt:
# Ctrl-C を捕まえた!
# print('interrupted!')
# なにか特別な後片付けが必要ならここに書く
GPIO.cleanup()
exit(0)
break
試したこと
・ソースコードの再確認
・ラズパイをzeroから4Bに替えて確認しましたが結果は同じでした。
・VNC接続を切り離しても、結果は同じでした。
・ほとんどの場合、リレー出力オフの状態で、プログラムが終了していましたが、1回だけオン状態のままてで終了していました。
・リレーのオンオフ時のノイズで誤動作するのかとも考えました。
・何回実行しても約1日くらいで停止してしまうので、構成システムの
影響も考えました。
・ソースコードに原因があると思うのですが、経験が浅いのもので、解決方法が思い浮かびません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。