電流センサ+Arduinoでコンセントの電流を測ってみた

スイッチサイエンスで売られている電流センサ ACS714 を使って、コンセントの電流を計測するモノを作りました。家電をON/OFFをモニターするとか、波形みたりもできます。

±5Aまでのと±30Aまで測れるのがあるけど、使ったのは5Aの方。

写真のようにコンセントと電源ケーブルの間にいれると、流れている電流が電圧値に変換されて出力される。


この写真はMacBook ProのACアダプタを繋いだところだけど、スイッチング電源なためか変な波形。半田ごてとか単純なものを繋げば、もうちょっと綺麗なsin波になります。


交流電流なので、出てくる電圧は2.5Vを中心にした交流波形(±5Aのだと185mV/A)になります。

アナログ回路で検波&整流しても良いのだけど、そのままArduinoに入力してデジタル処理した方が簡単だろうということで、下記のようなスケッチを書いてみました。Arduinoとセンサの接続は、アナログ3ピン←OUT、5V→Vcc、GND–GNDという感じ。

const int sensorPin = A3;    // pin that the sensor is attached to
const int hz = 50;           // frequency of signal
const int filter = 4;        // get average of several samples to reduce noize

// Current sensor (ACS714 5A)
int get_mA() {
  int max = 0, min = 32767, cnt = 0;
  unsigned long start = millis();
  do {
    int val = 0;
    for (int i = 0; i < filter; i++)
      val += analogRead(sensorPin);
    if (max < val) max = val;
    if (min > val) min = val;
    cnt++;
  } while (millis() - start <= 1100/hz); //10%+ for ensure p2p is acquired
  int mA = long((max-min))*9333/1000/filter;
  return mA;
}

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print(get_mA());
  Serial.println(" mA");
  delay(500);
}

出力は以下のような感じになります。

1324 mA
1325 mA
1312 mA
...

スケッチでやってる計算は、あくまで簡易的なもので、peak-to-peakの電圧値を求めて実効値に変換してるだけ*1。変換式は

 { \( V_{\rm max}-V_{\rm min} \) \over 2 \sqrt{2} } \times {5000 {\rm mV} \over 1024} \times {1000 \over 185 {\rm mV/A}} \simeq 9.33\( V_{\rm max}-V_{\rm min} \) \; { \rm [mA] }

という感じです。

ただノイズが多めで何も繋いでなくても0にならないのだった(30mAくらいの数値が出る)。小さい値は無視する必要がありそう。

*1:頑張って積分してもいいんだけど。。