2016年03月31日

Raspberry Piで電流計・電力計を作る

amp2週間ほど前に思いついたRaspberry Piで自宅の電力計を作ろう作戦、海外出張から帰ると注文してた部材が届いていたので早速組み立て開始。すると意外とあっさり成功しました。あっけなさすぎてやりがいが今ひとつです。まずは物理的なところですが、分電盤の単相三線ブレーカにクランプセンサーを取り付けます。今回はお手軽にCTT-10-CLS-CV50を使いました。1個3000円で2個6000円です。このセンサーは変換器内蔵なのでCV50だと電流50Aの時に5Vを出力します。15Aだと1.5Vというわけ。単純なクランプセンサーのみだと交流の場合積算して力率考えて・・・とややこしいですし、自分で電流変換器作るのもパーツがたくさん必要になっちゃうのでこの変換器内蔵センサーはとっても便利です。そしてこの出力をA/Dコンバータに入力してあげます。実際には3線式なので2個のセンサーの合算値が実際の電流値、消費電力量になります。

そして2個のセンサーの出力をA/Dコンバータに入れるわけですが、たまたま手元にあったICはMCP3008です。これは8ch入力ですが今回センサーは2個なのでMCP3002とかでもOK。1個200円くらいです。そしてこのA/Dコンバータに電源を供給しますが、供給電圧がデジタル変換の基準になります。夫婦2人のうちはブレーカーが30A契約なのでセンサーに30A流れると3V出力になり、基本的にはそれ以上の電圧にはならないはず。というわけでこのICにはRaspberry Piの3.3V出力を供給しました。3.3V給電の場合、3.3V入力の時のA/Dコンバータ出力値は10ビットのMAX値=1024となります。もし30A流れているとセンサー電圧は3Vとなり、A/Dコンバータの出力は1024/3.3*3=930となります。実際にはRaspberry Piの3.3Vに誤差があると結果もずれますのでそこは後で校正することにして、とりあえずはA/Dコンバータの出力を保管するようにします。ネットワーク屋大得意のRRDを使います。データは5秒毎に取ることにして一応10年分のデータが保管できるようにします。そこで書いたPythonコードがこれです。タブは消えてるので補完して読んで下さい。

#!/usr/bin/env python
import spidev
import time
import subprocess
if __name__ ==("__main__"):
adc=spidev.SpiDev()
adc.open(0,0)
for i in range(11):
buf = adc.xfer2([1,((8)<<4),0])
a1 = ((buf[1]&3)<<8)+buf[2]
buf = adc.xfer2([1,((9)<<4),0])
a2 = ((buf[1]&3)<<8)+buf[2]
cmd = "/usr/bin/rrdtool update /home/meter/amp.rrd N:"+str(a1)+":"+str(a2)
subprocess.call( cmd, shell=True )
time.sleep(5)
adc.close()

このコードを毎分cronで実行し、5秒ごとに2つのセンサからのデータを取得してRRDに格納します。そして取得したデータをPNG出力します。グラフ作成は慣れているPerlで書きました。横軸のスケールを変えつつ複数グラフを出力するコードになっています。電源2系統の電流値を積み上げグラフにし、見た目にもちょっと気を使って線と塗りつぶしを両方使っています。

#!/usr/bin/perl
$rrdtool = "/usr/bin/rrdtool";
$rrdfile = "/home/meter/amp.rrd";
$pngfile = "/var/www/png/";
$graphoption = "--font \"DEFAULT:7:/home/meter/MEIRYO.TTC\" -E";
$graphoption = "$graphoption --lower-limit 0 -T 1 -g --units-exponent 0";
$height = 150;
@width = ( 800, 800, 800, 800, 800 );
@timescale = ( 5, 60, 600, 3600, 86400 );
@xgrid = ( "--x-grid MINUTE:2:MINUTE:10:MINUTE:10:0:%R",
"--x-grid MINUTE:15:HOUR:1:HOUR:1:0:%H時",
"--x-grid HOUR:2:HOUR:12:HOUR:12:0:%a%H時",
"--x-grid HOUR:12:DAY:1:DAY:1:86400:%e%a" );
($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);
$tmax = 1;
if ( ( $min % 10 ) == 0 ) {
$tmax ++;
if ( $min == 0 ) {
$tmax ++;
if ( $hour == 0 ) {
$tmax ++;
if ( $mday == 1 ) {
$tmax ++;
}
}
}
}
for ( $t = 0 ; $t < $tmax ; $t ++ ) {
$pngfilename = "$pngfile$timescale[$t].png";
$timewidth = $width[$t] * $timescale[$t];
$rrdcmd = "$rrdtool graph $pngfilename $graphoption";
$rrdcmd = "$rrdcmd $xgrid[$t] --rigid";
$rrdcmd = "$rrdcmd -h $height -w $width[$t] --end now --start end-$timewidth\s";
$rrdcmd = "$rrdcmd DEF:LL1=$rrdfile:L1:LAST CDEF:LA1=LL1,3.223,*";
$rrdcmd = "$rrdcmd DEF:LL2=$rrdfile:L2:LAST CDEF:LA2=LL2,3.223,*";
$rrdcmd = "$rrdcmd AREA:LA1#A0FFA0 STACK:LA2#A0A0FF";
$rrdcmd = "$rrdcmd LINE1:LA1#00AF00 STACK:LA2#0000FF";
`$rrdcmd`;
}

タイムスケールの違うグラフを5個描くスクリプトです。ちなみにグラフの単位はわかりやすいW(ワット)にしました。あとはHTMLファイルを作ってグラフを表示し、自動更新もかけるようHTMLヘッダに記述します。結局必要なモジュールはrrdtoolとapache2くらいでしょうか。そうそう、crontabで自動実行の設定もします。毎分実行です。

* * * * * /usr/bin/sudo /usr/bin/python /home/meter/amp.py
* * * * * /home/meter/amp.pl

あとはRaspberry Piを分電盤の中に放り込みます。小さいので壁の穴と分電盤の周囲の隙間に収まってしまいます。電源は空きブレーカからとりました。ここは電気工事士の資格が必要かもしれません(当然私は持っていますが)。分電盤のカバーを外して空きブレーカからVVFケーブル出してコンセントプラグをつけて、USBアダプタつないでRaspberry Piに給電します。Raspberry PiにはUSB WiFiをつなげておけば、あとは半永久的に動いてくれます。つないだブレーカーがRaspberry Piの電源スイッチになりますので万一ハングアップしても再起動がとても簡単。ブレーカーを落としてまた上げればOK。良いシステムですね。分電盤のカバーを閉めると、外からは全く見えずいい感じです!ちなみにカバーを閉める際に漏電遮断器のスイッチに触ってしまい、間違えて家全体が停電しました。嫁が「食洗機が止まった〜!どこまで進んでたかわかんない〜!」と騒いでましたが、まぁ大きな問題ではありません。うちはガス暖房ということもありそんなに冬は消費電力大きくないのですが、夏とかにどうなるか楽しみですね。約1時間ほどでできた工作(材料費は2万以下)ですが、なかなか良いRaspberry Piの使い方ではないかと思います。

kenjiz at 23:23│Comments(0)TrackBack(0)IT 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔