PythonとRaspberry Piで部品の状態をファイルに記憶させる(その1)

0
946

プログラムを終了した時に、その設定状態を保存しておきたい場合に役立つ情報です。

設定が保存されていれば次回プログラムを起動する時に、その情報を元に設定が復元できます。これはPythonのファイルに対する書き込みと読み込みの機能を使って実現をしていきます。

今回のプログラムは「関数」を使って作業を行います。
この関数はプログラムの複数の箇所で呼び出せる便利な機能です。

今回利用する部品

< 必要なツール >

  •  ブレットボードキット
    • ブレットボード
    • ジャンパー線(オスーメス)
    • ジャンパー線(オスーオス)

< 必要な部品 >

  • LED(赤・黄・緑)×各1
  • NPNトランジスタ(2SC1815) ×3
  • 抵抗 100Ω×3
  • 抵抗 22kΩ×3
  • スイッチ×1

スイッチで保存する

今回はLEDの点灯状態を保存していく様に設定を行います。
今回の動作は、スイッチを押した時にLEDの点灯状態を指定したファイルへ書き込みプログラムを終了させます。

終了させた後に次に起動する時に、その保存されたファイルを読み込み元の状態へ復元させます。LEDの点灯は、自動で、赤色・黄色・緑色に切り替わるようにしておきます。

配線図は前回のラズパイとLEDを繋いでPythonでコントロールする(応用編)で紹介したものと同じものにスイッチを追加したものです。

では今回作成する回路図を以下に表示します。

配線図

回路図

最後に保存するためのPythonのコード

[code]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from gpiozero import LED, Button
from time import sleep

LED_R_PIN = 17
LED_Y_PIN = 27
LED_G_PIN = 22
BUTTON_PIN = 13
WAIT_TIME = 3
FILE_NAME = ‘led_status.txt’

def status_to_str(led_list):
status = ‘[‘ [
for led in led_list:
if led.is_active:
status += ‘1,’
else:
status += ‘0,’
status += ‘]’ [
return status

def status_update(led_list, status):
if status is None:
return
status_list = eval(status)
for index, led_status in enumerate(status_list):
if led_status == 1:
led_list[index].on()
else:
led_list[index].off()

def next_led(led_list):
current_index = 0
for index, led in enumerate(led_list):
if led.is_active:
current_index = index
next_index = current_index + 1
if next_index == 3:
next_index = 0
led_list[current_index].off()
led_list[next_index].on()
sleep(WAIT_TIME)

def main():
led_list = [
LED(LED_G_PIN),
LED(LED_Y_PIN),
LED(LED_R_PIN)
]
button = Button(BUTTON_PIN)

# LEDの状態をファイルからロード
mode = ‘rt’
with open(FILE_NAME, mode) as file_obj:
s = file_obj.read()
print(‘Load’)
status_update(led_list, s)
sleep(WAIT_TIME)
saved = False
while not saved:
next_led(led_list)
if button.is_pressed:
# LEDの状態をファイルへセーブ
s = status_to_str(led_list)
mode = ‘wt’
with open(FILE_NAME, mode) as file_obj:
file_obj.write(s)
print(‘Save’)
saved = True

main()
[/code]

※ウィンドウの関係上2枚のスクリーンショットになっています。

コードの解説

●6行目~11行目
定数の準備しています。
6行目~8行目はLEDの定数。
9行目はスイッチの定数。
10行目はLEDの点灯時間の定数。
11行目は書き込み用のファイルの定数。

●14行目~22行目
保存用の文字列を準備する関数

●25行目~33行目
読み込みした文字列をLEDへ反映させる関数

●36行目~46行目
現在点灯しているLEDを一度消灯し、次のLEDを点灯させる関数

●49行目~74行目
プログラムのメイン処理の部分の関数。
起動時にデータをロードし、LEDのを順番に点灯する処理を操りスイッチが押されたら終了するという内容になります。

●77行目
ここからこのプログラムの実際の処理が始まります。

次回は、このプログラムのファイル操作前後の処理について説明を行いたいと思います。

今回使用したものは、こちら↓から購入できます。

Raspberry Pi 4B 電子工作学習キット

RaspberryPi4B-4G SD電子工作学習キット

Raspberry Piでプログラミングを学んだり電子工作をするのに必要な基本的なものがセットになっているので便利です。