RasberryPi4でアナログ信号を計測しPythonでcsvに保存するソフト

RaspberryPiを使ってソーラーパネルの発電量を一定間隔で読み込み、プログラム終了後、発電量のデータをcsvファイルに保存するプログラムを作成してみました。

将来的には、オフグリッドで一番効率の良い方向にソーラーパネルをコントロールさせたいと考えています。

RaspberryPi4とソーラーパネルとADコンバータMCP3002の回路図については後日追加します。

~~~python
import wiringpi             # GPIOを制御するライブラリ
import time                 # タイマーのライブラリ
import datetime             # 現在日時を取得する
import pandas as pd
import csv
~~~

発電量と、発電量を測定した時間を保存するデータフレームを作ります。
1列目にTime、2列目にvoltというタイトルを付けます。

~~~python
list_df = pd.DataFrame( columns=['Time','volt'] )
~~~

~~~python

SPI_CH = 0                                    # MCP3002に接続したチャンネルを指定
READ_CH = 0                                   # RaspberryPi GPIOピンのアナログ入力チャンネルを指定
wiringpi.wiringPiSPISetup( SPI_CH, 1000000 )  # SPIの初期化
~~~

一定時間ごとにソーラーパワーの発電量をwhile文で一定間隔で読み込みます。
while文の前にtry:が入っているのは[CTRL+C]を押すとwhile文を抜けるようにするためです。

~~~python
try:
    while True:
        # MCP3002に送るデータを作成
        buffer = 0x6800 | ( 0x1800 * READ_CH )
        buffer = buffer.to_bytes( 2, byteorder='big' )
        # CH0の値を取得
        wiringpi.wiringPiSPIDataRW( SPI_CH, buffer )
        # 値が2バイトに分かれて送られるので、1つの値にまとめる
        ch0_value = ( buffer[0] * 256 + buffer[1] ) & 0x3ff
~~~

GPIOピンから読み込んだソーラーパネルの電圧は以下のようにvoltという変数に代入します。

~~~python
        volt = ch0_value * 3.3 / 1023
~~~

次にcsvファイルに保存するための現在の時間をdt_timeという変数に代入します。

~~~python
        ###現在日時を取得する
        dt_now = datetime.datetime.now()
        dt_time = "{0:%H:%M:%S}".format(dt_now)    
~~~

ちゃんと時間と電圧が読み込まれているか「time : XXX:XX:XX 電圧 : XXXV」という形でprintしてみます。

~~~python
        print ("Time :" , dt_time , " 電圧 :", volt , "V")
~~~

データフレーム(list_df)に時間(dt_time)と電圧(volt)を追加します。

~~~python
        tmp_se = pd.Series( [ dt_time, volt ], index=list_df.columns )
        list_df = list_df.append( tmp_se, ignore_index=True )   
~~~

データを取得する時間間隔を設定します。実際はwhile文を1回回した後一時停止させる時間を設定しています。


~~~python
        time.sleep(600)
~~~

while文をCTRL+Cを押すと停止させます。

~~~python
except KeyboardInterrupt:
    print ("Ctrl+Cで停止しました")
~~~

While文を抜けたら、データフレームに入力されたデータをcsvファイルに保存します。
まずはファイルネームを当日の日付（log_YYYYMMDD.csv)で保存するよう設定します。

~~~python
now = datetime.datetime.now()
filename = 'log_' + now.strftime('%Y%m%d') + '.csv'
list_df.to_csv(filename)
~~~


最後に、これまでのすべてを結合した一つにして表示します。


~~~python
# GPIOを制御するライブラリ
import wiringpi
# タイマーのライブラリ
import time
#現在日時を取得する
import datetime
import pandas as pd
import csv

#データフレームを作る
list_df = pd.DataFrame( columns=['Time','volt'] )

# MCP3002に接続したチャンネルを指定
SPI_CH = 0

# RaspberryPi GPIOピンのアナログ入力チャンネルを指定
READ_CH = 0

# SPIの初期化
wiringpi.wiringPiSPISetup( SPI_CH, 1000000 )

try:
    while True:
        # MCP3002に送るデータを作成
        buffer = 0x6800 | ( 0x1800 * READ_CH )
        buffer = buffer.to_bytes( 2, byteorder='big' )
        # CH0の値を取得
        wiringpi.wiringPiSPIDataRW( SPI_CH, buffer )
        # 値が2バイトに分かれて送られるので、1つの値にまとめる
        ch0_value = ( buffer[0] * 256 + buffer[1] ) & 0x3ff
        # 値を電圧に変換
        volt = ch0_value * 3.3 / 1023
        ###現在日時を取得する
        dt_now = datetime.datetime.now()
        dt_time = "{0:%H:%M:%S}".format(dt_now)    
        print ("Time :" , dt_time , " 電圧 :", volt , "V")

        #データフレームにデータを追加
        tmp_se = pd.Series( [ dt_time, volt ], index=list_df.columns )
        list_df = list_df.append( tmp_se, ignore_index=True )   
        # 10minごとにデータを取得する
        time.sleep(600)
    
except KeyboardInterrupt:
    print ("Ctrl+Cで停止しました")

#ファイルネームを現在日時にする
now = datetime.datetime.now()
filename = 'log_' + now.strftime('%Y%m%d') + '.csv'
list_df.to_csv(filename)
~~~