ベランダ発電 発電量の可視化をしてみた
ベランダに設置している太陽光パネル2枚の発電量を確認したくなって、試行錯誤した結果を簡単に紹介します。
いきなり成果物の紹介
長々とシステム構成とか機器紹介とかしてもつかみとしては面白くなさそうなので「こんなのできた」をまず紹介。こんなグラフができました。ドン!
下記のリンク先のサイトでリアルタイムで見れます。(AmbientというIoTデータ可視化サービスを利用しました)
発電量積み上げグラフ
2つのパネルの発電量を積み上げて表示しています。(単位はmW)
この日は曇りで時折晴れ間がでるという天気でした。急に晴れると一気に発電量が上がって2パネル合計で120Wを超えています。80Wと40WのパネルなのでMAXで発電できることはまず期待できないのですが、瞬間値でみるとMAXを超えたりするみたいですね。
電圧+電流グラフ
2つのパネルの電圧と電流をグラフにしてます。
見分けづらいですが、ピンクの線が 40Wパネルの電圧、赤の線が80Wパネルの電圧です。
接続しているポータブル電源のMPPT機能の差だと思いますが、ピンクの線(Anker)は電圧が激しく上下しているのに対して、赤の線(Jackery)は比較的フラットに推移しています。
推測するにAnkerは積極的に電圧を変更して最大で発電できるポイントを検索し続ける傾向があり、Jackeryは多少の電流変動でも電圧を変更せず発電量を平準化しているように見えます。このあたりはMPPTの調整する思想のちがいっぽいですね。
発電効率がAnkerの方が良いかというとそこはデータを集めて平均を取るなどしないと結論は出ないのですが、どちらも変わらないように見えます。Ankerは瞬間的に高い電力を取り出そうとしますが、電圧を上げると電流が下がり思ったほど電力が取り出せていないようです。
Ankerのポータブル電源のLCDで確認できる太陽光パネルの発電量は10Wを表示した次には2Wを表示するとかブレが大きいです。Jackeryのポータブル電源では測定値では瞬間的に10Wを記録していても5WのLCD表示のまま変化しないなどとなることも確認できます。
つまり、Ankerのポータブル電源では瞬間最大値を表示しやすく、Jackeryのポータブル電源では平均値に近い値が表示されると言えそうです。
ユーザーからすると瞬間的に高い値が確認できる方が性能が良いように見えがちなので、ユーザーへの「ウケ」が良さそうな作りをしているのがAnkerなのかもと推測しています。
1時間ごとの発電量グラフ
1 時間ごとの発電量を平均化したグラフです。2枚のパネルの発電量を積み上げてグラフにしてます。
すごく天気がいいと2つのパネルの合計で1時間平均で100W近い値が確認できました。2パネル合計で120Wh発電できる仕様ですが、その7割ぐらい性能が発揮できれば十分と思っていたところ、98Wh 発電できているので 81%の性能が実測でだせたのはなかなかです。
1日ごとの発電量推移グラフ
1日のトータルの発電量を確認するためのグラフです。朝から順々に増えていって夜に最大値になり、翌朝0からまた始まります。
上記グラフをご覧の通り、すごく天気の良い日は 2パネル合計で 500Wh を超えます。
天気が悪いと 50Wh にも届きません。ばらつきがすごく大きいです。
一般的に 100Wの太陽光パネルでは平均して 200Wh/1日 ぐらいが期待できるそうです。このシステムでは120Wの太陽光パネルなので 240Wh/1日 が期待値となるようですが、本当にそうなのかは1年ぐらいデータをとってみないとわからないですね。
今のところ言えるのはすごく天気がいいとポータブル電源の容量MAXまで余裕で充電できるけれども、天気が悪いとほとんど発電できない。日中に外出していて無駄なく発電した電気をすべてポータブル電源に貯めたいなら、太陽光パネルの5倍程度の容量のポータブル電源が最大で必要と思われます。
けれども、そんなに大きなポータブル電源を用意しても天気が悪い日が続くとあっという間にポータブル電源の中身が空っぽになってしまう。高いお金をかけてポータブル電源を用意しても無駄なく貯めて無駄なく使うのはなかなか難しそうですね。
システム構成
簡単にシステムを紹介して終わりにします。
念の為、注意事項を
全部自分で買ったものです
製品をオススメする意図はありません
買い始めると沼なので気をつけましょう
太陽光発電で購入した機器の元は取れません(20年ぐらい使えばとれるかもしれないけど現実的ではない)
40Wパネルシステム
太陽光パネル: FlexSolar Portable 40W USB&DC Solar Phone Charger
ポータブル電源: Anker 522 Portable Power Station (320Wh)
80Wパネルシステム
太陽光パネル: Jackery SolarSaga 80 (JS-80A)
ポータブル電源: Jackery ポータブル電源300 Plus
電力モニタシステム
コンピュータ: Raspberry Pi 3
測定チップ: INA260
ベランダに設置した太陽光パネルからケーブルをエアコン穴を通して室内にもってきて、ポータブル電源に接続する手前でINA260のチップを挟んで測定しています。
上記のサイトを参考にさせていただいて、作りました。
(参考どころか中身もよくわからずほとんどそのまま利用させてもらっています)
ありがとうございます。
作成したプログラムは以下
ラズパイが起動したらこのプログラムが自動で起動するようにデーモンとして登録して使ってます。INA260は 0x40 と 0x43 の二つのアドレスで一つのラズパイに接続してます。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import csv
from datetime import datetime
import signal
import time
import board
import adafruit_ina260
import ambient
# ambientサイトへデータを送信するためのキーを登録
ambi1 = ambient.Ambient(xxxx1, "xxxxxxxxxxxxxxx1")
ambi2 = ambient.Ambient(xxxx2, "xxxxxxxxxxxxxxx2")
REC_START_HOUR = 5
REC_END_HOUR = 17
# CSVファイルからWの値の合計を計算する関数
def calculate_w_total(csv_filename):
w1_total = 0.0 # Wの合計を初期化
w2_total = 0.0
try:
with open(csv_filename, mode='r', newline='') as file:
reader = csv.reader(file)
#header = next(reader) # ヘッダー行をスキップ
for row in reader:
if len(row) >= 5:
w1_value = float(row[4]) # Wの値を浮動小数点数に変換
w1_total += w1_value # Wの値を合計に追加
w2_value = float(row[7]) # Wの値を浮動小数点数に変換
w2_total += w2_value # Wの値を合計に追加
# 1秒間隔のデータを1時間データにして Wh 単位としてリターンする
return w1_total/3600000, w2_total/3600000
except FileNotFoundError:
print(f"ファイル '{csv_filename}' が見つかりませんでした。")
return None
except Exception as e:
print(f"エラーが発生しました: {e}")
return None
# メインタスク関数
def task(arg1, arg2):
# 電流・電圧・電力の取得
cur1 = ina260a.current
vol1 = ina260a.voltage
po1 = ina260a.power
cur2 = ina260b.current
vol2 = ina260b.voltage
po2 = ina260b.power
global po1d
global po2d
po1d.append(po1)
po2d.append(po2)
# 日時の取得
_now = datetime.now()
today = _now.strftime("%Y-%m-%d")
nowtime = _now.strftime("%H:%M:%S")
file_end = _now.strftime("%Y%m%d")
print ('日付 %s 時刻 %s 電流 %.2f/%.2f mA 電圧 %.2f/%.2f V 電力 %.2f/%.2f mW' % (today,nowtime,cur1,cur2,vol1,vol2,po1,po2))
if REC_START_HOUR <= _now.hour <= REC_END_HOUR:
with open('/home/admin/work/power/power2_%s.csv' % (file_end),'a') as f:
writer = csv.writer(f)
writer.writerow([today,nowtime,cur1,vol1,po1,cur2,vol2,po2])
if _now.second == 0:
input_csv_filename = '/home/admin/work/power/power2_%s.csv' % file_end
total_w1, total_w2 = calculate_w_total(input_csv_filename)
total_all = total_w1 + total_w2
if len(po1d) > 0 and len(po2d) > 0 and _now.minute == 59:
po1a = sum(po1d) / len(po1d)
po2a = sum(po2d) / len(po2d)
po_all = po1a + po2a
po1d = []
po2d = []
print(total_w1, total_w2, total_all, po1a, po2a, po_all)
r = ambi1.send({"d1": total_w1, "d2": total_w2, "d3": total_all, "d4": po1a, "d5": po2a, "d6": po_all})
print(total_w1, total_w2, total_all)
r = ambi2.send({"d1": cur1, "d2": vol1, "d3": po1, "d4": total_w1, "d5": total_w2, "d6": cur2, "d7": vol2, "d8": po2})
else:
print('記録時間外')
i2c = board.I2C()
ina260a = adafruit_ina260.INA260(i2c)
ina260b = adafruit_ina260.INA260(i2c,address=0x43)
po1d = []
po2d = []
signal.signal(signal.SIGALRM, task)
signal.setitimer(signal.ITIMER_REAL, 0.1, 1) # コマンドラインでCtrl+Cで止められるように
while True:
time.sleep(1)
作成にあたってよくわからない部分は ChatGPTに聞いてみたんですが、的確に回答してくるし、ちゃんと動くコードまで書いてくれるのですごいことがよく分かりました。
プログラム作成するのに詳しい人に聞いたり、google で検索たりするより、ChatGPTに聞いた方が早いし正確って時代になっちゃったんですね。すごいなぁ。
おわりに
久しぶりにハンダゴテ出してきて電子工作して面白かったです。
気が向いたらシステムの詳細などを紹介してみようと思います。
ポータブル電源や太陽光パネルの特性やら癖がいろいろあって測定してみててとっても面白いですね。なんだかいろんな太陽光パネルやポータブル電源を試してみたくなりますが、買いまくってると大変なことになっちゃうのでとりあえず機材増やすのはこのぐらいでしばらくやめとこうと思います。(本当に我慢できるのかは。。。。)
それではまた。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?