ESP32でACS712を使って電流を計測する

投稿者: | 11月 27, 2022

AliExpressでACS712モジュールを買ってみたので使ってみました。5A、20A、30Aのすべてのモジュールを買ってみました。商品の取り扱いは終わっていますが、秋月にデータシートが残ってました。

この素子はホール素子を使用していて5Vを入力すると、2.5Vあたりを中心として電流に対して比例的に出力電圧が変化します。データシート(自鯖ミラー)参照

そこで2点のanalogRead()の値と入力した電流値から、analogRead()と電流値の一次式が求められます。それをプログラムにしたのが下のやつです。

const int inpin = 4; //測定ピン

const bool kousei = 1; //1で校正、0で通常使用
const float inI1 = 0; //校正に使用した電流[A]
const float ESP32ValueI1 = 2840;//校正に使用した電流のESP32での表示値
const float inI2 = 1; //校正に使用した電流2[A]
const float ESP32ValueI2 = 3062;//校正に使用した電流2のESP32での表示値

//電流[A]=katamuki*ESP32読み取り値+seppenn を計算する
float katamuki = (inI2 - inI1) / (ESP32ValueI2 - ESP32ValueI1);
float seppenn = inI1 - (katamuki * ESP32ValueI1); //測定可能な最小電流

int count = 0;
float current = 0;

void setup() {
  Serial.begin(115200);
  Serial.println();
  if (kousei){
    Serial.println("kousei mode");
    katamuki = 1;
    seppenn = 0;
  }
  else{
    Serial.print("kousei:");
    Serial.print("I[A]=");
    Serial.print(katamuki);
    Serial.print("*ESP32Value+");
    Serial.println(seppenn);
    Serial.print("minCurrent:");
    Serial.print(seppenn);
    Serial.println("A");
  }
  delay(5000);
}

void loop() {
  float pinrawV = analogRead(inpin); //inpinの値を読み込む
  current = katamuki * pinrawV + seppenn + current; //電流の計算&平均値計算のための加算
  count++;
  if(count == 100){ //100回計測したら平均値を出す
    current = current / 100; //平均値を算出
    Serial.println(current); //電流値を出力
    count = 0;
    current = 0;
  }
  delay(10);
}

使い方

0. 配線
GPIO4とOUT、VCCと5V、GNDとGNDを接続します。

1. 校正モードでの書き込み
kousei = 1;の状態で書き込む

2. 校正
校正モードで2つの値の電流(I1、I2)を流して、それぞれの出力値(ESP32ValueI1、ESP32ValueI2)をプログラムに入力する。

3. 通常モードで書き込み
kousei =0;の状態で書き込む

こんな感じで使えます。ちなみに5Aのものを使用しています。

ちなみに使用しているGPIO4は無線を有効にすると、使えなくなるので気をつけてください。

終わりに

そこそこの精度が出ました。20mAくらいの誤差ないに収まっているように感じます。いい感じの負荷がなく、5Ω5Wのセメント抵抗しかないので3A、5Aで測れていないですが…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)