2023年10月20日金曜日

デジタルワットメーターをArduinoに繋いでみた。

 PZEM-051っていうDCのデジタルワットメータを解析している人がいて、Arduinoでデータを取り込めるらしいのでやってみた。PZEM-021でも良かったんだけど、PZEM-021だとシャント抵抗内蔵で20Aまで。PZEM-051だと50Aか100Aのシャント抵抗が外付けっぽい。

KT-D1384っていうそっくりなやつがあったんだけど、結局中身はPZEM-051だった。中華製なので出荷時期によって変わったりするかもしれないから注意なんだろうけど…

PZEM-051の裏面の蓋を開けてみるとこの基板はPZEM-051(v5.0)だった。PEACEFAIRっていうメーカー、一応PCに出力できるタイプのワットメータもAC、DC問わずにランナップされているけど液晶付きのやつをよく解析されてる気がする。
このモデルの場合はTM1621BっていうLCDコントローラとMCUの間のSPI通信を解析して実現しているっぽい。

GithubにはPower Meter LoggerとしてArduinoのスケッチも公開してくれているので、ありがたく利用させていただくことに。LoggerってなってるけどESP32のシリアルコンソールから流しているだけっぽい。

PZEM-051はテストパッドが出ているので、T1をCS_PIN、T2をCLK_PIN、T3をDATA_PINに接続すれば良い。間に保護用の抵抗入れたほうが良いかな?
回路を見るとVDDっていうテストパッドに3.3Vが来ているし、それでLEDのバックライトをつけたりしているので低消費電力な3.3Vマイコンなら電源もいただけるのではないかなということでAttiny1614で試してみることに。スケッチのサイズが4kbを超えるのでAttiny402は厳しそうだったので…
void loop() {
  static unsigned int updateRate = 200;//データ出力頻度
  static unsigned long lastUpdate = 0;
  if (lastUpdate + updateRate <= millis()) //updateRate[ms]周期で実行
  {
    lastUpdate = millis();//次の実行のために現在時間格納
    Serial.print(get_voltage());
    Serial.print(" V\t");
    Serial.print(get_current());
    Serial.print(" A\t");
    Serial.print(get_power());
    Serial.print(" W\t");
    Serial.print(get_energy());
    Serial.println(" Wh");
  }
  if (Serial.available() > 0) { // シリアルバッファチェック
    char in = Serial.read();
    if (in == 't') {
      unsigned int input = Serial.parseInt();
      if (input >= 50) {
        updateRate = input; //データ出力頻度変更
      }
    }
  }
}
そんでもってloopのところだけ上のように変更した。電圧、電流、電力、電力量をタブ区切りで出力できるようにして、出力頻度を変更できるようにした。
シリアルでt1000って送ると1秒間隔でデータが送られてくるような感じ。

ロギングしたいのであればこれにOpenLogを接続しても良いし、ESP32を接続してWiFi対応にしても面白いかも。ESP32は電力を食うので別なDCコンバータとかから電源を用意しないといけないかもしれないけど。
ちなみにRS485のModbus対応とかだったらLCDはついていないけどPZEM-017というのが存在するみたい。ただし200msぐらいでしか通信できないみたいなので、RS-232CとかでデータストリームするぐらいだったらPZEM-051を改造したほうがデータ更新頻度は高そう。


0 件のコメント:

コメントを投稿