Arduino modul s proudovým senzorem ACS712 funguje na principu Hallova jevu, integrovaný obvod umístěný na modulu tedy generuje elektrické napětí na základě okolního elektrického a magnetického pole, které vytváří elektrický proud procházející svorkami. Nám pak stačí změřit zmíněné napětí z modulu s proudovým senzorem ACS712 pomocí Arduino analogového vstupu a přepočítat ho na proud za pomoci konstanty, kterou udává výrobce proudového senzoru. Samotný senzor ACS712 lze zakoupit ve dvou variantách pro měření různých velikostí proudu, jedná ±5A a ±20A. Tento článek je zaměřen na 5A variantu, ale při použití jiného typu modulu stačí v kódu u proměnné „konstanta“ použít příslušnou hodnotu uvedenou v komentáři. Další výhodou proudového senzoru ACS712 je možnost měřit proud v obou směrech, můžeme tedy dostat kladný i záporný výsledek. Při měření nulového proudu tím pádem dostaneme napětí rovné polovině napájecího napětí modulu, tedy Vcc/2.

Proudový senzor ACS712

Pro úspěšné propojení s Arduinem je potřeba na modulu s proudovým senzorem použít 3 propojovací piny. Připojíme VCC na +5V, OUT na A0 a GND na zem. Výstupní pin senzoru OUT můžeme samozřejmě připojit na jiný volný analogový vstup Arduino desky. Měřenou zátěž pak zapojíme mezi svorky na druhé straně modulu, jak můžete vidět na obrázku níže.

Schéma zapojení proudového senzoru ACS712

První ukázkový kód obsahuje měření stejnosměrného proudu (DC). Na začátku programu nastavíme číslo pinu pro analogový vstup a dále inicializujeme proměnnou s konstantou pro přepočet měřeného napětí na proud a nastavení offsetu na polovinu napájecího napětí. V podprogramu setup nastavíme komunikaci po sériové lince s rychlostí 9600 baud a zvolený analogový vstupní pin jako vstupní. V loop smyčce pak při každém průběhu vytvoříme proměnné pro měření a výpočty proudu a v další smyčce for provedeme za sebou 100 měření včetně přepočtu napětí na proud. Jednotlivých 100 výsledků měření zároveň ukládáme do proměnné „soucet“ a po dokončení měření vydělíme tuto proměnnou 100, aby jsme získali průměr z provedených 100 měření. Tento výsledek poté vytiskneme po sériové lince a po malé pauze se celý program opět opakuje.

// Proudový senzor ACS712 5A
// Měření stejnosměrného proudu

// číslo pinu připojeného analogového vstupu
const int analogIn = A0;

// konstanta pro přepočet naměřeného napětí na proud
// použijte 100 pro 20A verzi
int konstanta = 185;
// proměnná pro nastavení offsetu, polovina Vcc
int offset = 2500;

void setup(){ 
  // komunikace přes sériovou linku rychlostí 9600 baud
  Serial.begin(9600);  
  // inicializace analogového vstupu
  pinMode(analogIn, INPUT);
}

void loop(){
  // proměnné pro měření a výpočty proudu
  int analog= 0;
  double napeti = 0;
  double proud = 0;
  double soucet = 0;
  // provedení stovky měření pro ustálení výsledku
  for(int i=0;i<100;i++){
    // načtení hodnoty analogového vstupu
    analog = analogRead(analogIn);
    // přepočet napětí na proud dle informací od výrobce
    napeti = (analog * 5000.0) / 1023.0;
    proud = (napeti - offset) / konstanta;
    // uložení výsledku pro následné zprůměrování
    soucet += proud;
    delay(10);
  }
  // výpočet průměru ze stovky měření
  proud = (soucet/100);
  // výpis výsledku na 3 desetinná místa
  Serial.print("Proud: ");
  Serial.print(proud,3);
  Serial.println(" A");
  // vyčkej 1 s kvůli zbytečnému množství tisknutých znaků
  delay(1000);
}

Pokud potřebujete měřit střídavý proud (AC), je zde uveden také druhý ukázkový kód. Jeho začátek je podobný s předchozím příkladem. V loop funkci pak využíváme námi vytvořenou měřící funkci zmerVpp, která s využitím funkce while (opakování smyčky do splnění podmínek – rozdíl mezi uloženým časem a aktuálním 1 vteřina) vždy najde maximální a minimální hodnotu napětí a vrátí její rozdíl. Při tisknutí výsledku si můžete všimnout, že proměnné jsou označeny jako RMS (Root Mean Square), což v češtině znamená efektivní hodnota proudu.

// Proudový senzor ACS712 5A
// Měření střídavého proudu

// číslo pinu připojeného analogového vstupu
const int analogIn = A0;

// konstanta pro přepočet naměřeného napětí na proud
// použijte 100 pro 20A verzi
int konstanta = 185;

void setup(){ 
  // komunikace přes sériovou linku rychlostí 9600 baud
  Serial.begin(9600);  
  // inicializace analogového vstupu
  pinMode(analogIn, INPUT);
}

void loop(){
  // proměnné pro výpočty proudu
  double napeti = 0;
  double napetiRMS = 0;
  double proudRMS = 0;
  napeti = zmerVpp();
  // přepočet napětí na proud
  napetiRMS = (napeti/2.0) *0.707; 
  proudRMS = (napetiRMS * 1000)/konstanta;
  // výpis výsledku na 3 desetinná místa
  Serial.print("Proud: ");
  Serial.print(proudRMS,3);
  Serial.println(" A");
}

float zmerVpp()
{
  // proměnné pro měření
  float vysl;
  int napAng;
  int maximum = 0;
  int minimum = 1023;

  unsigned long mezicas = millis();
  // opakování měření po dobu 1 vteřiny
  while((millis()-mezicas) < 1000)
  {
    // načtení hodnoty analogového vstupu
    napAng = analogRead(analogIn);
    // hledání maxima
    if (napAng > maximum) 
    {
      maximum = napAng;
    }
    // hledání minima
    if (napAng < minimum) 
    {
      minimum = napAng;
    }
  }
  // přepočet hodnoty analogového vstupu na napětí
  vysl = ((maximum - minimum) * 5.0)/1023.0;
  return vysl;
 }

Po nahrání programu do Arduino desky si můžeme otevřít Sériový monitor a sledovat změřený proud mezi svorkami.

Jako výsledek dostaneme podobný výpis:

Proud: 0.955 A
Proud: 0.950 A
Proud: 0.942 A
Proud: 1.288 A
Proud: 1.279 A

Rád bych zde upozornil, že použitý proudový senzor ACS712 nelze využívat jako přesný ampérmetr, protože při malých proudech do cca 300 mA není jeho měření moc přesné kvůli okolnímu elektromagnetickému rušení. A druhá poznámka je k uvedeným konstantám, kdy sám výrobce je označuje jako orientační. Pokud byste tedy chtěli senzorem měřit přesnější hodnoty, doporučuji srovnat jeho výstup s jiným měřícím přístrojem lepší přesnosti na několika různých hodnotách proudu a příslušně upravit měřící konstantu. Já osobně jsem zjistil, že můj testovaný modul ve variantě 5A a v měřeném rozsahu 1-3 A udával nejlepší výsledky s konstantou 125.

 

Seznam použitých komponent:

http://dratek.cz/arduino/1072-arduino-5a-proudovy-senzor-acs712-1438011598.html

http://dratek.cz/arduino/1222-arduino-proudovy-senzor-20a-modul-acs712-1458245452.html

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino/844-arduino-nepajive-pole.html

http://dratek.cz/arduino-kabelaz-propoje-rozsireni/1063-arduino-vodice-samec-samec-40-kusu.html

FB tw

Další podobné články