質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

3596閲覧

pythonプログラムが勝手に終了してしまいます

hirotaki

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/07/28 06:19

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/07/28 06:26

indentが付いていないからではないでしょうか。
hirotaki

2021/07/28 11:57

さっそくのご回答ありがとうございます。 もしよろしければ、教えてください。 プログラムのどの部分にindentが必要なのでしょうか。
hirotaki

2021/07/28 14:57

ご回答ありがとうございます。 貼り付けたときに、インデントが消えてしまったようです。 気がつきませんでした。申し訳ありません。
guest

回答1

0

時間が経つと落ちるのは、桁あふれとか、何かリソースが足りなくなっているのではないかと思います。

exceptで全てのエラーを掴まえて表示どこかに出力させてみてはいかがでしょうか。

投稿2021/07/28 10:59

TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hirotaki

2021/07/28 12:08

さっそくのご回答ありがとうございます。 except、調べてトライしてみます。
hirotaki

2021/08/05 08:17

無限ループの末尾に gc.collect(generation=2 ) を追記しました。 3日間走らせましたが、まだ順調に作動しています。 はっきりしたことは、分かりませんが やはり、リソース不足が原因だったように思います。
TakaiY

2021/08/05 09:49

ちなみに例外は発生していなかったのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問