RaspberryPiを使ってソーラーパネルの発電量を一定間隔で読み込み、プログラム終了後、発電量のデータをcsvファイルに保存するプログラムを作成してみました。
将来的には、オフグリッドで一番効率の良い方向にソーラーパネルをコントロールさせたいと考えています。
RaspberryPi4とソーラーパネルとADコンバータMCP3002の回路図については後日追加します。
import wiringpi # GPIOを制御するライブラリ
import time # タイマーのライブラリ
import datetime # 現在日時を取得する
import pandas as pd
import csv
発電量と、発電量を測定した時間を保存するデータフレームを作ります。
1列目にTime、2列目にvoltというタイトルを付けます。
list_df = pd.DataFrame( columns=['Time','volt'] )
SPI_CH = 0 # MCP3002に接続したチャンネルを指定
READ_CH = 0 # RaspberryPi GPIOピンのアナログ入力チャンネルを指定
wiringpi.wiringPiSPISetup( SPI_CH, 1000000 ) # SPIの初期化
一定時間ごとにソーラーパワーの発電量をwhile文で一定間隔で読み込みます。
while文の前にtry:が入っているのは[CTRL+C]を押すとwhile文を抜けるようにするためです。
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という変数に代入します。
volt = ch0_value * 3.3 / 1023
次にcsvファイルに保存するための現在の時間をdt_timeという変数に代入します。
###現在日時を取得する
dt_now = datetime.datetime.now()
dt_time = "{0:%H:%M:%S}".format(dt_now)
ちゃんと時間と電圧が読み込まれているか「time : XXX:XX:XX 電圧 : XXXV」という形でprintしてみます。
print ("Time :" , dt_time , " 電圧 :", volt , "V")
データフレーム(list_df)に時間(dt_time)と電圧(volt)を追加します。
tmp_se = pd.Series( [ dt_time, volt ], index=list_df.columns )
list_df = list_df.append( tmp_se, ignore_index=True )
データを取得する時間間隔を設定します。実際はwhile文を1回回した後一時停止させる時間を設定しています。
time.sleep(600)
while文をCTRL+Cを押すと停止させます。
except KeyboardInterrupt:
print ("Ctrl+Cで停止しました")
While文を抜けたら、データフレームに入力されたデータをcsvファイルに保存します。
まずはファイルネームを当日の日付(log_YYYYMMDD.csv)で保存するよう設定します。
now = datetime.datetime.now()
filename = 'log_' + now.strftime('%Y%m%d') + '.csv'
list_df.to_csv(filename)
最後に、これまでのすべてを結合した一つにして表示します。
# 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)