前回は、センサーとラズパイの接続まで紹介した。
ここからはやっと、コードを使って電圧・電流を読み取っていこうとおもう。
この辺が参考になるかなぁと思って、まずは上のサイトの通りに接続して電圧表示までしてみた。Muを起動して、Python3で
1 2 3 4 5 6 7 |
import smbus i2c = smbus.SMBus(1) word = i2c.read_word_data(0x41, 0x02) & 0xFFFF result = ( (word << 8) & 0xFF00 ) + (word >> 8) volt = result * 1.25 / 1000 print volt |
たぶん、Python2で書かれたコードなのでprintをカッコでくくって変更しただけで動作した。正しい電圧をかえしている様子。しかし、電流値がわからない。計算が必要かぁ。もう、ビット演算とか覚えてないし、何をしているのかよくわからない。リファレンスを読んでみると
このあたりがヒントになりそうだけど、この後の説明がよくわかんない。というか、まじめに読んでたんだけど、だんだん「これ読むならライブラリ探したほうがはやくね?」と手抜き悪魔のささやきが・・・w
やっぱりというか・・・次の瞬間、リファレンスを読むのをやめて、上の2サイトを読んでました。上の方のサイトを読むと、adafruit-circuitpython-ina260のパッケージをPython3にインストールして以下のテストコードを動かすと書いてある。おそらくPython3のみの対応となっているみたいだが、そっちのほうが好都合~。
言われた通り、PyPIによるインストールを指示通りに進める(理解してないw)
1 |
sudo pip3 install adafruit-circuitpython-ina260 |
↑コマンドを叩いて(叩いてすらないコピペw)インストールできた。とくにエラーもなく進み下のコードをPythonエディッタに入れて実行してみる
1 2 3 4 5 6 7 8 9 |
import time import board import adafruit_ina260 i2c = board.I2C() ina260 = adafruit_ina260.INA260(i2c) while True: print("Current: %.2f Voltage: %.2f Power:%.2f" %(ina260.current, ina260.voltage, ina260.power)) time.sleep(1) |
電流、電圧、電力が表示された。手抜きで申し訳ないけどライブラリってほんと便利(感謝)。これに手を加えて、csvに記録できるように書いたコードがこれ。CSVの処理とか文字列フォーマット処理は調べた。他言語でも似たような処理なのでささっと書いた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# -*- coding: utf-8 -*- import csv from datetime import datetime import signal import time import board import adafruit_ina260 REC_START_HOUR = 8 REC_END_HOUR = 18 def task(arg1, arg2): # 電流・電圧・電力の取得 cur = ina260.current vol = ina260.voltage po = ina260.power # 日時の取得 _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 mA 電圧 %.2f V 電力 %.2f mW' % (today,nowtime,cur,vol,po)) if REC_START_HOUR&lt;= _now.hour &lt; REC_END_HOUR: with open('/home/pi/Desktop/power/power_%s.csv' % (file_end),'a') as f: writer = csv.writer(f) writer.writerow([today,nowtime,cur,vol,po]) else: print('記録時間外') i2c = board.I2C() ina260 = adafruit_ina260.INA260(i2c) signal.signal(signal.SIGALRM, task) signal.setitimer(signal.ITIMER_REAL, 0.1, 1) # コマンドラインでCtrl+Cで止められるように while True: time.sleep(1) |
雑なコードで申し訳ない。日毎にCSVファイルを作り、8時~18時までの計測値を一秒ごとに記録するスクリプト。お弁当箱に入れて、ずっとZeroで動かしているけど特に問題なく動いてる様子。
で、取得したデータをエクセルで処理した結果がこれ。一日中晴天時の計測結果で良好に取れている様子。モバイルバッテリー側で充電を制御しているし、流れた電流がすべて充電で蓄えられているわけではないけど、目に見えるようになったのは、とても分かりやすい。データをためて色々見ていきたいと思う。