最初に、参考にしたサイトを掲載しておきます。
PZEM-004T v3.0 はアマゾンや Aliexpress で検索するとたくさん出てきます。今回はアマゾンで買いました。1週間ほどで到着です。何も気にせず買ったので、USBシリアルなしを買ってしまったようです。USBケーブル付きがあればそれを買うほうが楽です。
仕方がないので、ポケコンのファイル転送で使っていた FTDI の USB シリアルケーブルに犠牲になってもらうことにしました。使用する線は 5V, GND, TX, RX の4本です。USBシリアルを使うのは Raspberry Pi の USB ポートで使用するためです。マイコン基板と接続する場合は、マイコンの 5V, GND, TX, RX を直結するだけです。
USBシリアルの TX RX と基板の TX RX はクロスで結線しましょう。これ間違えると通信できません。
プラケースの蓋を外して、XH コネクタのポストを外して
USB シリアルの線を半田付け。スクリューターミナルNとLの所にコンセントからの電線を差し込んでネジ止めします。ハードの準備は以上です。
Raspberry Pi 側のプログラムは python で動かします。PZEM-004T v3.0 からデータを取得して、ambient にデータ送信するようにしています。
#!/usr/bin/env python3
import datetime
import time
import serial
import ambient
import requests
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
# sudo pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
# sudo pip3 install modbus-tk
if __name__ == "__main__":
# Connect to the slave
serial = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
bytesize=8,
parity='N',
stopbits=1,
xonxoff=0
)
master = modbus_rtu.RtuMaster(serial)
master.set_timeout(2.0)
master.set_verbose(True)
am = ambient.Ambient(チャネル番号, ' ライトキー ')
while True:
try:
data = master.execute(1, cst.READ_INPUT_REGISTERS, 0, 10)
result = am.send({'d1': data[0] / 10.0, 'd2': data[7] / 10.0})
print(datetime.datetime.now(),
'voltage=',
data[0] / 10.0,
'freq=',
data[7] / 10.0,
'send status=',
result.status_code)
time.sleep(60)
except KeyboardInterrupt:
print('exiting pzem script')
except requests.exceptions.RequestException as e:
print('request failed: ', e)
USBシリアルのポート名。/dev/ttyUSB0 のところは syslog を見て確認。
am = ambient.Ambient(チャネル番号, ‘Writeキー’)
ambient のデータ送信は、ご自身のグラフを作成するところで、チャネル番号、ライトキー、リードキーが発行されるので、そのチャネル番号、ライトキーを入れたら送信できます。
プログラムの起動は、raspberry pi 起動後手動でしています。
tmux or screen コマンドを起動する
上記 python プログラムを走らせる
tmux or screen から抜ける。
です。tmux や screen でプログラムを動かしておけば、teraterm とかが切れても動き続けますので良いです。
ambient に投げたデータは公開にしていますので、下記 URL からご覧いただけます。
自宅の商用電圧と周波数 -Ambient (ambidata.io)
上のプログラムには記載省略していますが周波数は 0.1Hz 単位なので、実際にグラフを出してみると見にくい感じになりました。2022年9月5日から 周波数データの3回平均したものも追加で表示するようにしました。
2023年2月3日 上記 ambient へのデータ投入は終わりました。理由は0.1Hz の分解では全く意味なしというところでした。周波数カウンタ作ったほうが良いと思いましたので、改めてやり直そうと思った次第です。