前回は回路を作りました。今回はプログラムを作って、電力を測定できるようにしたいと思います。
回路を組み立てた、前回の記事はこちらです。
BL0940の返答をデコードする
BL0940に対して0x58 0xAAを送信すると、測定結果をまとめて送り返してくれます。まずは、これらの値をデコードして、値が正しいかを確認してみます。
応答の値を実際の値に変換する式は、BL0940のアプリケーションノートに書いてあります。これらの式を使って、応答をデコードしてみました。
コンセントに接続して、負荷が無い時の結果をデコードしてみました。電流は0Aで、電圧が102.3Vとなっています。
コンセントの電圧を測定してみると102.3Vと、実測値と測定結果が合っています。
負荷をつないでみる
36Wの白熱電球
36Wの白熱電球をつないでみます。クランプメーターの測定結果は0.31Aです。
測定値は0.38Aとなりました。誤差+0.07Aで20%程度。
120V 200Wの白熱電球
続いて、子供が3年生の時に子供と一緒にニューヨークのMakerFairに出展した時に、大きなホームセンターで買ってきた120V 200Wの電球です。とてもいい思い出なので切れないで欲しい電球です。120V仕様なので100Vでは200Wまで消費せず、クランプメーターでは1.47Aでした。
測定結果は1.52A。誤差+0.07Aで3%程度。
ヒートガン弱
続いて、もっと電力を消費するヒートガンを弱で動作させます。クランプメーターの値は8.26A。
測定結果は8.21A。誤差-0.05Aで0.6%程度。
ヒートガン強
ヒートガンを強にしてみます。クランプメーターの値は12.74A。
測定結果は12.58A。誤差-0.16Aで1%程度。
だいたい±0.1Aの誤差で測定できることがわかりました。A単位での測定に使うには、結構いい性能なのではないでしょうか。
プログラムを作成
#include "BL0940.h" BL0940 bl0940; void setup() { Serial.begin(115200); bl0940.Reset(); bl0940.setFrequency(50); //50[Hz] bl0940.setUpdateRate(800); //400[ms] } void loop() { float voltage; bl0940.getVoltage( &voltage ); Serial.printf("%.2f [V]\n", voltage ); float current; bl0940.getCurrent( ¤t ); Serial.printf("%.2f [A]\n", current ); float activePower; bl0940.getActivePower( &activePower ); Serial.printf("%.2f [W]\n", activePower ); float activeEnergy; bl0940.getActiveEnergy( &activeEnergy ); Serial.printf("%.3f [kWh]\n", activeEnergy ); float powerFactor; bl0940.getPowerFactor( &powerFactor ); Serial.printf("%.1f [%%]\n", powerFactor ); float temperature; bl0940.getTemperature( &temperature ); Serial.printf("%.1f [deg C]\n", temperature ); Serial.println(""); delay(1000); }
これまでは、一括で測定結果を受信してデコードしていましたが、電圧や電流、電力などそれぞれの測定結果を取得できるようにプログラムを作り替えました。BL0940が取得した値を、シリアルモニターに出力します。
BL0940とESP32との接続は以下の通りです。
ボードとの配線は電源と送信、受信の4本です。BL0940のTxは、通信していない期間はハイインピーダンスになってしまい、電圧がほぼLowになります。このためスタートビットが正しく検出できず、通信エラーが頻発してしましました。通信しない間Hiの状態を保ために、ESP32のRxをプルアップする必要があります。
できたプログラムは☝️☝️☝️からダウンロードできます。CC0です。ご自由にお使いください。
setFrequency(50); は、コンセントの周波数を設定します。50[Hz]か60[Hz]です。
setUpdateRate(800); は、測定周期を設定します。400[ms]か800[ms]です。
getPowerFactorは力率が得られ、getTemperatureは、IC内部の温度が得られます。
そのほかは、BL0940.hのコメントをご覧ください。
getActiveEnergy()は、使い方が理解できませんでした。単位が[kWh]なので、積算電力を求めることができるのかと思ったのですが、そうではないようです。
ESP32で電力の測定ができるようになりました
ESP32とBL0940で、機器の消費電力を測定できるようになりました。
さて次回は、測定データをクラウド(Ambient)にアップロードして機器の消費電力を時系列でグラフ化してみたいと思います。
ここで紹介するキットはこちら👇👇👇で販売しています。
コメント