お天気時計の作成(その5:自動起動)

Raspberry pi zero 2Wを入手したので備忘録として書きます。

 

Raspberry pi zeroの電源を入れた時にお天気時計のメインプログラムを自動で実行できるようにしたいと思います。

 

自動起動方法は色々ありますが、「/etc/rc.local」にpython3プログラムの実行スクリプトを追加する方法が簡単ですが上手くできなかったので、cronを使用してみました。

 

cronを使用した自動起動

まず、PATHの設定状態を確認します。後で使用します。


$echo $PATH

そのあと


$crontab -e

と打ちます。

 

初回起動時は,どのエディタで起動するか聞かれるので、1番の「nano」を選びました。

すると,テキストエディタnanoでファイルが開きます. 

 

最後の行に以下を追加します。

PATH=の後は先ほど確認したPATHを張り付けてください。パスの指定をしないとpythonの実行ができませんでした。


LANG=ja_JP.UTF-8
PATH = /home/tomtomst/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

@reboot cd /home/tomtomst/Documents/python ; python3 ./weather_clock_main.py > /home/tomtomst/Desktop/exec-error.log 2>&1

@rebootは、リブート時の動作を指定するもので、

まず、cdコマンドでプログラムの実行フォルダ「/home/tomtomst/Documents/python」へ移動して、プログラム「weather_clock_main.py」をpython3で実行しています。実行時のエラーは「>」を使用してデスクトップへエラーログを出力するようにしました。

 

リブートしてみてください。

自動でプログラムが起動し、LCDへお天気時計が表示するようになりました。

 

wifi接続チェックの追加

リブート時は問題ありませんでしたが、シャットダウンして電源をoffした後だと起動しない場合がありました。
エラーログを見たところwifi通信ができていない状態のようでした。

20秒程度waitを入れたところ起動できるようになりましたが、

連続動作確認中に何回かwifiの状態が悪くプログラムが停止していたことがあったので、wifiの状態をチェックするようにプログラムを変更しました。

下記の関数を作成し、「check_wifi.py」の名前でlibフォルダへ格納しました。


# WiFi Check
import subprocess

def check_wifi():
    try:
        subprocess.check_output(['ping', '-c', '1', 'www.google.com'])
        return True
    except subprocess.CalledProcessError:
        return False

 

メインプログラムは下記のプログラムを追加し、起動時は、1秒間隔でwifi状態をチェックし、通信可能になるまで待つようにしました。


    while True:
        if check_wifi():
            print('Wi-Fi is available.')
            break
        else:
            print('Wi-Fi is not available.')
        
        time.sleep(1)

1時間毎のお天気表示時は下記のように10秒間チェックをして通信できない場合はお天気情報の取得を諦めるようにしました。


        #天気予報表示
        if now_M_S == "00:00":            
            print(time_n)
            i = 0
            while (i < 10):
                if check_wifi():
                    print('Wi-Fi is available.')
                    #お天気を取得
                    cor,weather,weather_url = weather_get()
                    #お天気をLCDへ表示
                    weather_disp(cor,weather,weather_url)
                    break
                else:
                    print('Wi-Fi is not available.')        
                time.sleep(1)