最近ESP-NOWを使って独自のホームネットワークを検討用に作っており、ヌルい独自仕様で推し
進めているので「ホームネットワークで何が出来るか?」の準備が主な作業になっています。
主な作業とは言っても、コレといった指標は持っていないのでイロンナ機器を作り倒す感じです。
そういった状況ではありますが家庭用コンセントで流れる電流値を測定するユニットを検討しました。
これに時間あたりの積算機能を付けたら簡易な電力計が作れますが、電流計で終わらせときます。
#ESP8266環境で必要なリソース
I2Cが使えるESP8266機 (ESP-01Sでも良いですね。
ACクランプ SCT013-XXX
ADコンバータ ADS1115 (差動入力で利用します
AdafruitのADS1115関係のソースファイル(Adafrutがお勧めな訳じゃないですが・・・
#配線
ESP8266とADS1115はI2CのSCL/SDAをVcc/GND繋いでください。
ADS1115のA2/A3とSCT013の配線を繋いで下さい。
あとは電源を繋ぐだけです
#機能
関数getRMSでサンプルあたりのRMS値を求めます。
サンプル数を増やすと測定に時間を要しますが、安定した値になる様です。
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1115 ADS0;
float ADCmultiplier; // ADS1115のADCの1bitあたりの電圧値(Gain設定で変化)
// SCT013でRMSを求める処理 : SCT013の仕様に合わせて1V辺り?A測定できるか設定する
const float SCT013CURRENT = 50; // SCT013-050 (50A-1V仕様)
float getRMS( int samples=100 ){
float sum = 0;
for( int cnt=0 ; cnt<samples ; cnt++ ){
float voltage = ADS0.readADC_Differential_2_3() * ADCmultiplier;
sum += sq( voltage * SCT013CURRENT / 1000.0 );
}
return sqrt(sum / samples);
}
//
void setup(void){
Serial.begin(115200);
Wire.begin();
// ADS1115の設定(SCT013で100A程測定できる程度の電圧は想定してGAIN設定する事
ADS0.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
ADCmultiplier = 0.0625f; // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
if (!ADS0.begin()) { Serial.println("Failed to initialize ADS0."); while (1); }
ADS0.setDataRate( RATE_ADS1115_860SPS ); // 860Sample per Second(チップ性能)
}
void loop(void){
int sta = millis();
float rms = getRMS( 300 );
int tim = millis()-sta;
Serial.printf("%0.2fA , %dmSec \n", rms , tim );
}
あとがき
クランプ式の電流計は今更って感じがしますが、簡単な作り方が見つからずにイロイロ調べた末に
差動入力ADCにST013を直結するだけの回路と上記のソースで上手く動きそうだったので紹介しました。
実際にはエアコンの消費電力を測定する事を考えており、電源ON~電源OFF迄の累積消費電力を
(Wh)でGoogleSpreadSheetに時間ごとに報告できないかと考えています。