LoginSignup
0
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-08

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)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1