Sensore di corrente con Arduino

by luca
125 comments

Il progetto che vi voglio presentare nasce da una esigenza: insieme ad un amico – Davide – sto da tempo realizzando un plastico ferroviario (Il Plastico di Davide e Luca): per dimensionare gli “alimentatori” (booster) che mandano corrente sui binari, ci serviva capire quanta corrente veniva utilizzata…

Il sensore

Per misurare la corrente, ho utilizzato l’integrato ACS712 di Allegro MicroSystems (qui il datasheet). Di tale integrato esistono 3 versioni a seconda della massima corrente misurabile (5-20-30A); per le nostre esigenze ho scelto il modello da 5A.

Il funzionamento del sensore è molto semplice: la tensione tra il PIN VIOUT e massa è direttamente proporzionale alla corrente tra i PIN IP+ e IP-. L’ACS712 richiede una tensione di alimentazione di 5V (VCC) e due condensatori per stabilizzare l’alimentazione e la lettura; sul datasheet è riportato lo schema tipico:

L’integrato è prodotto in package SOIC; SparkFun vende una comoda breakout board con l’ACS712 già saldato. Ho collegato tale board ad una millefori su cui ho saldato i due condensatori e i PIN per il collegamento con Arduino:

La misura

Come detto, la tensione di uscita è proporzionale alla corrente in ingresso. Il valore che lega queste due grandezze è la sensitivity (riportata sul datasheet) che – per il modello da 5A – ha un valore tipico di 185mV/A. Il sensore misura sia correnti positive che negative (range -5A…5A), per questo se la corrente in ingresso è 0, l’uscita avrà valore 2.5V.

Leggeremo il valore in uscita utilizzando uno degli ingressi analogici di Arduino e la funzione analogRead(). Tale funzione restituisce un valore tra 0 (0V in ingresso) e 1023 (5V in ingresso) ovvero 0,0049V per ogni incremento.

La formula per convertire i valori (units) della funzione analogRead() in Ampere è quindi:

Arduino

Lo sketch di Arduino è molto semplice: legge il valore presente sul PIN AN0, lo converte con la formula indicata sopra e lo invia al PC sulla porta seriale. Sul PC è in esecuzione il programma AnalogDemo che disegna il grafico dei valori letti e aggiorna un feed su Pachube.

L’integrato ACS712 restituisce una lettura istantanea; le prime prove hanno mostrato come tale lettura sia troppo soggetta a fluttuazioni, ecco perché lo sketch sotto riportato esegue una lettura di 1000 valori, ne calcola la media e ne invia il risultato al PC. La funzione analogRead() impiega circa 0.1ms per ogni lettura, volendo un campione al secondo introduciamo un ritardo di 1ms ad ogni lettura:

void setup() {
 
  Serial.begin(9600);
}
 
void loop() {
 
  float average = 0;
  for(int i = 0; i < 1000; i++) {
    average = average + (.0264 * analogRead(A0) -13.51) / 1000;
    delay(1);
  }
  Serial.println(average);  
}

Test

Per verificare l’affidabilità del sensore, ho utilizzato un caricabatterie controllato da microprocessore, inserendo il sensore tra l’uscita del caricabatterie e le batterie in carica:

In questo modo ho potuto verificare una stretta corrispondenza tra quanto indicato come corrente di uscita dal caricabatterie e quanto letto dal sensore.

In carrozza!

Il circuito è stato provato Sabato scorso sul plastico, qui potete leggere la prova su strada e vedere un breve filmato che lo mostra in azione durante un piccolo cortocircuito.

Note

Leggendo direttamente con Arduino il sensore, si ottiene una risoluzione di circa 0,026A (ovvero il valore restituito da analogRead() incrementa di una unità ogni 0.026A). Per aumentare tale risoluzione, è possibile aggiungere un amplificatore operazionale che estende il range di tensioni restituite; sempre SparkFun vende una breakout board con tale configurazione.

Related Posts

125 comments

Ampere! 29 novembre 2011 - 23:51

[…] Qui potete trovare l’intera descrizione del progetto, lo sketch per Arduino e il programma in esecuzione sul PC, mentre di seguito alcune fotografie durante il suo funzionamento: […]

Reply
hamvil 12 dicembre 2011 - 10:03

Hi, thanks for the very useful post. I do have a question: how do I choose the value for the two capacitors?

Reply
luca 12 dicembre 2011 - 11:31

Hello!
You can use the values (1nF for filtering and 100nF as bypass) suggested in the datasheet.

Reply
Patrick 21 marzo 2012 - 23:57

I tried your sketch, and have a .25A load (a lightbulb) and I am not seeing any current whatsoever.

I’m trying to measure current on 120V AC.

Reply
luca 22 marzo 2012 - 15:28

Hi Patrick,

are you using the same breakout board from SparkFun? Do you see anything on the serial terminal?

Reply
ardhitop 1 maggio 2012 - 09:53

i have use this sketch for AC power supply, but the value that shown in serial monitor is very fluctuate.

is this sketch for DC only or i can use this sketch for AC?

thanks

Reply
luca 1 maggio 2012 - 10:27

Hi!

ACS712 is suitable for DC and AC… it gives you only the “actual” measure: as you can see my sketch calculate a mean of 1000 samples… try to increment that number and let me know!

Reply
vinicius 6 giugno 2012 - 12:13

Please, could you help me about the ACS712?

I want to know about the low value that we can measure with ACS712. For example I need to measure a mobilep phone current, near to 20mA.
Is it possible?

Thanks

Reply
luca 6 giugno 2012 - 19:00

Hi!

Of course you can… just add an OpAmp to increase ACS712 sensitivity, or buy this breakout from SparkFun:
http://www.sparkfun.com/products/8883

bye

Reply
oscarah 27 giugno 2012 - 13:25

Hello,

I think that this sketch can’t be used to sense AC. The ACS712 will output the measure, but as the incomming current is bipolar (sometimes +I and sometimes -I), the value will change up and down. If you make an average, the result will be always around 0A (or 2.5V). I’m lookiing for another solution… 🙂

Reply
vinicius 30 giugno 2012 - 18:33

hi luca, I’m from Brazil. Thansks for your help. The project works well!

I have just one more question, please!

Why we use (-13, 51)?

Thanks again I’m very happy!

Reply
luca 1 luglio 2012 - 12:20

Hi Vinicius!

On ACS712 datasheet you can find the “sensitivity” value, which is 185mV/A. Sensor’s output for 0A (= no current) is 2.5V, so if you need the current value, you have to substract 2.5/0,185 which is 13.51.
bye

Reply
vinicius 5 luglio 2012 - 21:13

Luca Hello!

Please check this software, maybe it’s good for you.

http://www.blueleafsoftware.com/Resources/EmbeddedSand/MegunoLink

Very easy to use and do not reset the Arduino every time you turn on or turn off the serial port.

Bye

Reply
PhilG 12 luglio 2012 - 02:03

Just to clarify, you’re working with a DC load not an AC load?

Doesn’t seem like this sketch would work for AC.

Reply
luca 13 luglio 2012 - 19:22

Yes: the sensor works also with AC load but you have to change the sketch…

Reply
Steve Pike 17 settembre 2012 - 19:59

Hi Luca,
This all makes sense except I can’t understand why it will give values below -5A and above +5A:

If you put the value 0 in your equation for units, you get -13.51 out. If the sensor can only sense between -5 and +5, how do we get all these values outside that range?

Thanks

Reply
luca 22 settembre 2012 - 14:34

Hi Steve,

Have a look to ACS712’s datasheet, page 7: you can find the chart “output voltage vs sensed current”. The output voltage never goes below 1.5V so Arduino’s read value will never be 0. That means you’re not using the complete range of Arduino’s ADC and that’s the reason why SparkFun added an opAmp.

bye

Reply
Sheldon 17 settembre 2012 - 23:12

Hey there,

Great tutorial. I have one question though. I am using the breakout from sparkfun:

https://www.sparkfun.com/products/8883

and I am having a problem working with the gain and vref pots.

I dont quite have a good understanding of this. Could you please explain this to me.

This is for my design project at my universtity which is due in a few days time.

Would really appreciate your advice. Thanks

sheldonreddy@gmail.com

Reply
luca 22 settembre 2012 - 14:41

Hi Sheldon,

SparkFun added an opAmp to their board to let you choose the output range of ACS712.
They suggest you this calibration method:
– connect the board to Arduino and read output value without any current flowing in the sensor… move Vref pot to choose the “offset” value (for example move it until you read 512)
– now use a known current value, let’s say you need to measure a max of 1A: use this value and move gain pot until you read 1023 (which is the maximum value Arduino’s ADC can read)
Now your sensor can read -1A – 1A with the maximum available resolution (1024 steps), each step is 1/512 = 0,002A

bye

Reply
Federico 15 ottobre 2012 - 20:55

Ciao Luca
Ho realizzato il progetto ma mi sono reso conto che la risoluzione di lettura della corrente non è sufficiente, quindi vorrei acquistare la breakout board con operazionale incluso per rilevare valori dell’ordine di pochi mA. Dal sito ufficiale leggo che per diminuire il rumore dovuto all’alto guadagno la larghezza di banda viene ridotta da 80 KHz a 34 Hz. Questo influisce sulla frequenza di acquisizione del dato? attualmente utilizzo 1000 rilevazioni al secondo mediate, come da tuo sketch, e non vorrei diminuire. Ti ringrazio per l’attenzione e per quanto ho trovato utile il tuo lavoro. Federico

Reply
luca 16 ottobre 2012 - 16:26

Ciao Federico,

sì, influisce: 34Hz significa che il chip non sarà in grado di “leggere” variazioni nell’intensità della corrente più rapide di 1/34 di secondo. Questo significa che campionare a 1KHz (= 1000 campioni al secondo) è inutile, puoi abbassarlo appunto a 30 circa, che comunque ritengo sufficienti visto che eseguirai una media tra tali campioni.
Fammi sapere come va!

Reply
Pixel 17 ottobre 2012 - 14:27

Ciao,
Luca complimenti per il blog ricco di spunti interessanti. Ho da poco acquistato l’ACS714 perché avrei in mente di monitorare la corrente assorbita in casa. La domanda è la seguente il criterio per determinare il valore corretto di corrente è lo stesso anche a 230 Volt in corrente alternata?

Reply
luca 18 ottobre 2012 - 09:06

Grazie Pixel! Sì, il sensore è pensato anche per corrente alternata e dal datasheet leggo che supporta tensioni > 230V.
Fammi sapere come va!

Reply
Pixel 18 ottobre 2012 - 16:06

Ciao,
grazie per la risposta… ho un dubbio relativo alla mirura del valore medio. In giro ho letto che la lettura della corrente in alternata deve essere effettuata facendo la media un pò diversamente. Tu hai qualche informazione aggiuntiva da darmi? Grazie

Reply
luca 19 ottobre 2012 - 07:48

Ciao! In effetti per la corrente alternata normalmente si utilizza il valore RMS, che devi calcolare prendendo il valore di picco e dividendolo per la radice di 2… preparerò un esempio di sketch!

Reply
Pixel 19 ottobre 2012 - 20:08

Mitico….
terrò d’occhio il blog…

Grazie e Saluti

Reply
AceTK 27 ottobre 2012 - 13:45

Hi when I use the sensor i get:

2.35v = 0A
2.36 = 0.06A
2.37 = 0.1A 511 512 514 517
2.39v = 0.2A 515 522
2.41v = 0.3A
2.42v = 0.4A
2.44v = 0.5A
2.46v = 0.6A
2.48v = 0.7A

The values in the 500’s being the raw analog pin readings that seem to jump around. This sensor is the 5A version and i thought it was supposed to be 2.5v to 5v ie 512 to 1023 0 – 5A. At present it seems really restricted and notchy due to its wavering inaccuracy. Is this broken? Kind Thanks

Reply
luca 28 ottobre 2012 - 11:52

Hi!

your sensor has a sensitivity of 185mV/A, so at its maximum (5A) you should read an output voltage of 3,425V: take a look at its datasheet, you can find a chart that plots A/Vout. With 0A you should read 2.5V, your value (2.35) seems to low; did you use the correct capacitors?

Reply
paul 28 ottobre 2012 - 05:10

ciao luca, i’m using acs712 30A with your sketch (11.54Vdc and 12Vdc 10W globe as a test) without editing your sketch I get a reading of 0.30 which seems to low, i’m calculating 0.83, but when i edit the sketch to change sensitivity to 66mV/A i get 10.03A
where am i going wrong?

Reply
gianfranco 3 dicembre 2012 - 16:02

Salve luca,

sarebbe possibile utilizzare secondo te l’ACS 712 per rilevare la corrente in uscita al differenziale di casa tramite arduino? O è piu consigliato un dispositivo meno invasivo, quale ad esempio una pinza amperometrica, sempre pilotata con arduino? Ovviamente preferirei la scelta piu economica…e piu efficiente, dato che vorrei usare il sistema per monitorare l’uso di corrente in casa ed evitare che scatti il contatore, magari sfruttando un avviso acustico (sempre pilotato da arduino).

Grazie mille in anticipo

Reply
luca 6 dicembre 2012 - 15:39

Ciao Gianfranco,

io sarei, viste anche le tensioni e correnti in gioco, per un sensore ad effetto Hall, tipo:

http://www.seeedstudio.com/depot/-p-519.html?cPath=144_154

fammi sapere come va!

Reply
paul 20 febbraio 2013 - 15:42

What is the range of values displayed in the serial monitor of arduino?

Reply
luca 20 febbraio 2013 - 16:02

Hi Paul,

it depends on the sensor you’re using… ACS712 is rated -5/+5A

Reply
paul 20 febbraio 2013 - 17:18

My serial port value is not varying with the load current.It is remaining a constant value.I think it is not the problem of my circuit.I had checked the circuit several times.Can you suggest a solution for this ?

Reply
luca 20 febbraio 2013 - 17:20

Paul: try reading the “raw” output value of the sensor with a multimeter: if it does change it could be a problem of the analog pin of your Arduino

Reply
paul 20 febbraio 2013 - 17:47

i had tried that.But the multimter value is not changing.It remains constant.What may be the problem?

Reply
luca 21 febbraio 2013 - 16:10

post a schematics of your sensor… how are you changing the current in it? which value do you read on your multimeter?

Reply
himanshu amrutiya 27 febbraio 2013 - 10:04

excellent work….keep it up friend…thankyou…:)

Reply
hatuari 9 marzo 2013 - 02:47

i have a 5a model of acs712 sensor. i had tried use the equation(above) to find current value. if the adc value is 1024, result is 13.49a. but result should be 5a for 1024. where do i make mistake can you suggest anything about this situation?

Reply
luca 9 marzo 2013 - 10:12

Hello! With 5A, the ACS712 sensor won’t output 5V (look at its datasheet, pag.7), but a value near 3.5V that analogRead() reads 711.

Reply
Nikita 2 aprile 2013 - 18:36

Hello luca,
Thank you for this very helpful post.
I’d like to measure AC current, but I can not find a sketch in internert and do not get it myself.
Can you or anyone else please give me such a sketch.

Reply
luca 8 aprile 2013 - 20:01

Hi Nikita,

the sensor measures the “actual” current, so for AC you need to decide which “value” do you want to measure.
You usually want the RMS value, that – assuming your wave is a true sine – is 0.707 times the peak value… so you need to write a sketch that measures several values, find the maximum (= peak) and calculates the RMS value.

Reply
Andre Luiz 7 aprile 2013 - 01:34

Hello, very good design.

I did the same thing in my project that only the current sensor captures a peak current and then back to 0, I do not know what’s going on, I think he gets the current instant. Do you think my sensor may be the problem? he is not the SparkFun.

Reply
luca 8 aprile 2013 - 20:06

Hi Andre, is the current in your project alternate?

Reply
Andre Luiz 21 aprile 2013 - 19:52

Hello Luca,

I am want to measure the current of a fan, I used the same example but its current returns is zero, to measure AC is different?

Reply
luca 26 aprile 2013 - 14:07

Hi Andre,

AC current rapidly changes, so you have to decide “which” value you want to measure. Usually, they choose the RMS value, which is the maximum value / sqrt(2). I’m going to write a tutorial about it, so stay tuned!

Reply
Pier 7 maggio 2013 - 14:55

Ciao,
ti scrivo perchè c’è qualcosa che non mi torna molto.

Tu scrivi questa formula:
A = 0,026 * units – 13,51

Il sensore riesce a leggere tra -5A e 5A.
units varia tra 0 e 1023.
quindi in linea di principio quando esce 1023 dovrei avere 5A.

Per cui faccio questa prova sostituendo a units il valore 1023 nella tua formula è il risultato ottenuto è: 13,088A differente da quei 5A che mi aspettavo.

C’è qualcosa che non torna oppure è tutto giusto?

Se è tutto giusto avendo il sensore da 20A questa formula è corretta?
A= (0.0049 * units – 2,5)/0,1

Reply
luca 7 maggio 2013 - 18:45

Ciao Pier

l’errore nel tuo assunto è che l’uscita del sensore, per 5A, sia 1023 ovvero 5V. In realtà se guardi il grafico sul datasheet, vedrai che la sensibilità del sensore è 185mV/A, centrata a 2.5V. Quindi con 5A di corrente avrai una tensione in uscita di 3,425 e una lettura dell’ADC di Arduino di 712.

Reply
Pier 8 maggio 2013 - 14:15

e quindi per il sensore da 20A sapendo che la sensibilità è 100mV/A è giusta?

A= (0.0049 * units – 2,5)/0,1

Reply
luca 13 maggio 2013 - 09:49

yes!

Reply
Andre Luiz 11 maggio 2013 - 04:19

Hello Luca,

I bind AC load sensor and the connecting pin to pin Vout analog Arduino, the value read at the input A0 would be the current through the sensor. Am I right or wrong? When I put a load sensor my AC does not alter the value of output (it works as if current = 0).

For load DC the sensor works correctly.

Reply
luca 13 maggio 2013 - 09:39

Hi Andre

with AC loads, the output of the sensor should rapidly change following the voltage. Which value do you get from your A0 pin? Try reading it many times…

Reply
Federico 13 maggio 2013 - 18:00

Ciao Luca
ho seguito il tuo consiglio e acquistato la breakout board di sparkfun con stadio amplificatore, però non riesco ad effettuare una misurazione stabile.
Il mio obiettivo è quello di misurare affidabilmente valori di corrente nell’ordine dei pochi mA, con una risoluzione massima di 1mA, meglio se 0.5mA. Credi che sia un traguardo raggiungibile? Ho seguito le istruzioni per la calibrazione del sensore utilizzando i tuoi valori di riferimento (0A e Vref a circa 512bit – 1A 1023bit). I problemi sorti sono due:
– Una volta terminata la calibrazione il valore calcolato con la tua formula, senza alcuna corrente nel sensore risultava di circa mezzo Ampere. Utilizzando il sensore amplificato devo utilizzare una formula diversa da quella espressa sopra?
– La lettura dei valori risulta sempre molto instabile, infatti i 512 bit di calibrazione non sono stati molto accurati. Questa fluttuazione è normale?
Ti ringrazio in anticipo, e complimenti per il tuo impegno in questo blog e nell’aiutare la comunità.

Reply
luca 14 maggio 2013 - 08:44

Ciao Federico,

purtroppo no, non è raggiungibile a causa delle caratteristiche fisiche del sensore (guarda le FAQ del produttore). Utilizzando cmq il modulo amplificato (a cui dedicherò un prossimo articolo) la formula va adattata in base ai settaggi del potenziometro.

Reply
Federico 14 maggio 2013 - 13:52

Grazie Luca
purtroppo per le mie esigenze dovrò optare per uno strumento decisamente più costoso, ma apprezzo molto la tua dedizione.
Continuerò a seguire il tuo blog, in attesa del prossimo progetto 😉

Reply
mado 18 maggio 2013 - 12:40

if my load is a resistor and i connect this sensor in parallel in as much its small internal resistance most of the current of the source will pass in this sensor and it will be maximum and that mean it won’t be the real load current when i remove the sensor

Reply
luca 19 maggio 2013 - 20:07

Hi!

This sensor must be connected in series with your load.

Reply
Massimo 30 maggio 2013 - 22:09

Ciao Luca,
ti scrivo perché ho comprato quattro di questi sensori: 1 da 5A f.s, 1 da 20A f.s, 1 da 30A f.s, e 1 da 50A f.s., con la convinzione che bastasse collegarli ad un voltmetro da qualche Volts fondo scala per poter leggere una corrente senza bisogno di utilizzare un amperometro dotato shunt. Ho costruito degli alimentatori e dei caricabatteria, e volevo misurare la corrente erogata con un amperometro che non avesse shunt. Di qui la scelta dei sensori. Ebbene mi sono sbagliato in pieno, dopo aver provato i sensori ho dovuto constatare che questi circuiti si limitano generare una tensione su un piedino d’uscita che decresce con l’aumentare della corrente che scorre al suo interno e, con un voltmetro, si misura soltanto una tensione variabile ma che non ha nulla a che vedere con un valore di corrente.
Ora, ti chiederei la cortesia di fornirmi il tuo parere per sapere se è possibile interfacciarli con dell’elettronica ed utilizzarli abbinati ad uno strumentino digitale da pannello, oppure devo buttarli in un cassetto.
Naturalmente non mi riferisco ad Arduino, perché non so neppure cosa sia.
Spero di poter leggere una tua gradita risposta.
Grazie e cordialità.

Reply
luca 8 giugno 2013 - 12:32

Ciao Massimo

i sensori restituiscono in uscita una tensione che è “linearmente proporzionale” alla corrente che li attraversa (guarda il grafico sul datasheet). Per poter calcolare la corrente una volta letta la tensione devi però effettuare qualche “calcolo”, usando la formula A = (V – 2,5) / 0.185, quindi ad esempio se leggi 3V, la corrente che attraversa il sensore sarà circa 2.7A.

Reply
Alessio 14 giugno 2013 - 14:51

Ciao Luca,
ho letto questo tuo scritto svariato tempo fa quando ho cominciato a pensare al mio progettino per monitorare tra l’altro i consumi elettrici di casa. Già allora lessi che la tua formula andava bene per la corrente continua ma che bisognava fare altri calcoli per la AC. Da quel che ho letto nei vari reply non è ancora esplicitato come dovrebbe essere il calcolo secondo te quindi, col tuo permesso, incollo qui il metodo che ho sviluppato io e che è attualmente operativo sul mio arduino con risultati accettabili.

*********************************************
float watt0; // Potenza letta dal sensore su A0

void loop(){

watt0 = rilevaConsumo(sensorPin0); // Rilevazione dal Sensore A0

}

// Lettura dei dati dei Sensori ACS712 20A
// Le letture istantanee del sensore da parte di Arduino forniscono quello che ho chiamato il numero di Step.
// Dallo Step posso ricavare Volt e Ampère (basandomi sui dati del Datasheet) ma dovendo leggere un valore Alternato (corrente Alternata)
// è inutile che faccio calcoli per determinare una grandezza istantanea che non mi serve.
// Per calcolare il Consumo ( P = V * I * cosFi) ho bisogno di ricavare dalle letture il Valore Efficace della Corrente.
// Anziché calcolare la corrente istantanea ad ogni lettura e poi estrarne il valore efficace ho calcolato il valore efficace delle letture
// e con quello ho poi calcolato il Valore Efficace della Corrente.
// Ovviamente il calcolo prevede una certa approssimazione poiché la tensione non è quasi mai esattamente 220V e dopo
// un po di test ho adottato un cosFi di 0,9

float rilevaConsumo(const uint8_t sensore){
// float lettura;
float totLetture;
// double rmsLetture;
// float ampere;
for(int i = 0; i < 1000; i++) { // 1000 letture sono un campione più che sufficiente di letture.
// lettura = analogRead(sensore) – 511;
// rmsLetture = rmsLetture + sq(lettura); // Sommatoria del quadrato delle letture.
totLetture = totLetture + sq(((float)analogRead(sensore)) – 511); // Sommatoria del quadrato delle letture.
delay(1);
}
// float risultato = 220 * ((float)((double)sqrt(totLetture/1000)) * .048828) * .9;
// Serial.println(risultato);
// rmsLetture = sqrt(totLetture/1000); // Valore Efficace delle Letture (Radice Quadrata della Media del Quadrato delle Letture)
// ampere = rmsLetture * .048828;
// return 220 * ampere * .9;
return 220 * ((float)((double)sqrt(totLetture/1000)) * .048828) * .9;
}
*********************************************

Gradirei un tuo parere ;0)

Reply
luca 17 giugno 2013 - 21:16

Ciao Alessio!

direi che è ottimo: grazie per averlo condiviso!

Reply
Carlos Araujo 21 giugno 2013 - 06:07

i already desing a sketch for ac , it works, im working to make it better its some one need help, just ask me at araujo.inl@gmail.com

Reply
MEHDI SAADATMAND 10 settembre 2013 - 05:55

HI
I AM INTERESTED ARDUINO.
I TRY ACS712 CONNECT TO 220 VOLTS FOR MEASURE CURRENT WATER PUMP 1 PHASE ,1 HP, BUT I AM SELF CONTAINED . I LIKE KNOW CALCULATE FORMULA CURRENT FOR ARDUINO FOR ACS712 FOR AC CURRENT .
PLEASE HELP ME.
TANK YOU

Reply
luca 10 settembre 2013 - 08:13

Hi Mehdi,

for AC current, you usually want the “RMS” value, which is the peak value / sqrt(2)

Reply
israel 12 settembre 2013 - 15:03

very nice design.
but i would like know what is the use of the samples

Reply
luca 17 settembre 2013 - 09:08

Hi Israel, you need to grab many samples if the waveform is variable (like the AC) to find the max or average value

Reply
Bennie 20 settembre 2013 - 09:21

Hi Luca,

Thank you for a very good page. I have a ACS712-20A (sensitivity is 100mV/A) connected to a PIC16F818. Al circuit connections are correct. A powersupply is connected to the ACS712 through a 10R 10W resistor. I always get a reading which is about .06 too low. Formula used is (reading – 511) * 49. Any help please ?
Thank you.

Reply
MEHDI 24 settembre 2013 - 07:22

Hi, luca,
thank you for your page. i think sensor need current more than 1 amp.
i think circuit should be current more than 1 A.
FOR EXAMPLE : ADAPTER OUTPUT 2 A ,9 V —
IS IT CORRECT ?

Reply
luca 24 settembre 2013 - 12:40

Hi Mehdi,

the sensor I used can measure up to 5A but the ACS family has also ICs for 10-20A

Reply
Zaighum 8 ottobre 2013 - 12:46

Hi luca
Just for making sure , will this ic work at 220V AC .
Thanks for advice .

Reply
luca 8 ottobre 2013 - 13:00

Yes, it works fine!

Reply
MEHDI 12 ottobre 2013 - 08:02

HI
I AM TRY FOR ACS712 GET CURRENT BUT I CAN NOT IT .
FOR EXAMPLE :LIGHTING DC -12 VOLTS , I =3.2 A MESSURE MOLTIMETR.
BUT WHEN CONNECT TO ARDUINO SERIAL ——–>NUMBER RESULT 0.02 mA .
I CONFIUSE .
PLEASE HELP ME.

Reply
ewe 22 ottobre 2013 - 18:10

@MEHDI Wrong formula i would guess… Maybe you should write less caps but more content – this would make helpful guesses more likely 😉

Reply
Awais 3 dicembre 2013 - 20:28

Sir the same code can work for acs714?

Reply
luca 4 dicembre 2013 - 08:51

Hi! Yes, it has the same sensitivity (185mV).

Reply
Davide 7 dicembre 2013 - 11:50

Ciao Luca, qualche post fa Alessio aveva postato lo sketch per la misura della potenza istantanea approssimata.
Potresti ripostarla in maniera più semplificata e completa?
Grazie

Reply
Alessio 31 dicembre 2013 - 14:20

Ciao Davide,
quale è la parte che ti risulta più ostica?
Di quello che ho incollato la maggior parte è commentata. In realtà solo poche righe (quelle non commentate) sono il risultato finale.
Se posso esserti d’aiuto, son qui.

Alessio ;0)

Reply
Faisal Candrasyah 13 gennaio 2014 - 07:00

Can you give me another great tutorial on how measuing AC current with the acs712? Thanks

Reply
Davide 30 gennaio 2014 - 23:56

Ciao Alessio, ho provato il tuo sketch e mi restituisce una serie di errori in fase di compilazione.
L’ho riscritto in questo modo, soltanto per riverale la corrente, viene compilato ma il risultato non è soddisfaciente, è una specie di contatore in avanti.
Inoltre potresti spiegarmi il significato del comando ‘sq’ ?
Io ho scritto questo:
#include
LiquidCrystal lcd(12, 11, 53, 51, 49, 47);

float Sensore = 0;
float totLetture;
float Corrente = 0;

void setup() { ; }

void loop() {

for(int i = 0; i < 1000; i++)
{
Sensore = analogRead(A2) -511;
totLetture = totLetture + sq(Sensore);
Corrente = (sqrt(totLetture/1000)) * 0.07398;
delay(1);
}

lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(Corrente);

}

Reply
Alessio 13 febbraio 2014 - 10:23

Ciao Davide,
sugli errori di compilazione non so cosa dirti, di tutto quello che ho postato sopra in realtà le righe utili non commentate dovrebbero essere solo queste:

float rilevaConsumo(const uint8_t sensore){
float totLetture;
for(int i = 0; i < 1000; i++) { // 1000 letture sono un campione più che sufficiente di letture.
totLetture = totLetture + sq(((float)analogRead(sensore)) – 511); // Sommatoria del quadrato delle letture.
delay(1);
}
return 220 * ((float)((double)sqrt(totLetture/1000)) * .048828) * .9;
}

se chiami questo metodo passandogli l'identificativo del pin a cui è collegato il sensore dovrebbe restituirti la potenza assorbita in quel momento.

Il Valore Efficace di una grandezza sinusoidale è dato dalla Radice Quadrata della Media del Quadrato delle Letture.
Il comando sq() eleva al quadrato il valore messo tra parentesi. Quindi con questo comando eseguo il quadrato delle letture che poi sommo nel totLetture e poi ne estraggo la media facendo totLetture/1000.
Quindi alla fine del for(), dopo che ho totalizzato 1000 letture faccio il conto finale ovvero la radice quadrata ( sqrt() ) della media del quadrato delle letture ( totLetture/1000 )
Il comando sqrt() fa la radice quadrata del valore messo tra parentesi. Quindi sqrt(totLetture/1000) mi da praticamente il Valore Efficace delle letture eseguite che moltiplicato per .048828 (per il sensore da 20A) o .07398 nel tuo caso, si ottiene il Valore Efficace della Corrente.

In pratica se prendi il mio metodo e cambi il return con:
return ((double)sqrt(totLetture/1000)) * .048828;
dovrebbe restituirti il Valore Efficace della Corrente.

Per quel che riguarda il tuo sketch riscritto, non l'ho provato ma ad occhio direi che il problema del "contatore in avanti" è dovuto al fatto che non azzeri il totLetture prima di entrare nel for(). Questo comporta che totLetture è in continuo incremento (fino al limite del contenibile da un float, dopodiché dovrebbe ripartire da zero).
Comunque, basta che prima del for() metti un totLetture = 0;
Inoltre il calcolo della Corrente (Corrente = (sqrt(totLetture/1000)) * 0.07398;) è inutile all'interno del for(). Mettilo fuori, dopo il for().

Fammi sapere.

Alessio.

Reply
Alessio 13 febbraio 2014 - 10:26

P.S.: Recentemente, a causa in un cortocircuito in casa, m’è esploso uno degli ACS712…. e l’altro ha smesso di funzionare :0/
Passerò a qualcosa di Non Invasivo.

Reply
Davide 16 febbraio 2014 - 16:11

Ciao Alessio, in effetti con quelle modifiche è tutto ok, non azzeravo TotLetture. grazie.

Reply
Edward 20 aprile 2014 - 00:12

I am testing your code as shown, but getting a strange result. For 1A current (with Fluke dvm in series for ref), the Arduino displays 0.733A.
Any guidance appreciated.

Reply
luca 27 aprile 2014 - 12:36

Hi Edward, are you measuring AC or DC?

Reply
Mehmet 28 maggio 2014 - 14:27

Hey luca,

I have ACS712 +-5A sensor board.

Is it possible to measure 220V AC by connecting multimeter on its pins? I get constant value all time which is 1,46V even when on load.

Reply
luca 28 maggio 2014 - 20:34

Hi Mehmet

of course if everything is ok you should be able to read a voltage that depends to the load you apply… but the output voltage is AC too, are you reading AC voltages with your multimeter?

Reply
Syazwan 11 giugno 2014 - 08:04

Hai Luca..
I would like to ask about ACS712. Can this sensor measure current that connected to solar panel with voltage output grater that 20 V DC? My input would be a solar panel and i would like to measure voltage and current it draw using arduino..

Hope to hear from you Luca

Reply
luca 16 giugno 2014 - 08:23

Hi, yes it works!

Reply
Herner 11 agosto 2014 - 01:22

Luca.

I am just about to buy this board for a project I am working on but I am not clear where to hook to the arduino and the instructions I found online were much more complicated then how you have it cleanly hooked up.

It looks like it can easily connect right to the board can you tell me what pins you are hooked to on the Arduino?

Thanks so much and I am sorry for the newb question.

Reply
Tomás 27 agosto 2014 - 02:25

Have you made the tutorial for AC current mesurement?

Reply
Mauro 21 settembre 2014 - 19:24

Luca,
ho eseguito il test seguendo le tue indicazione (caso vuole che ho anche il TRITON vista la passione per il modellismo) e tutto fila liscio.
Lo scopo dell’acquisto del sensore è però quella di tenere sotto controllo il consumo di alcuni elettrodomestici; in particolare ho eseguito un test con un ventilatore tipo scaldo bagno da 2200W max e qui sorgono i problemi; dal sensore rilevo assorbimenti vicini allo 0.0A e questo mi suona strano.
Dove può essere il problema?
ciao grazie in aticipo
Mauro

Reply
luca 22 settembre 2014 - 12:57

Ciao Mauro, il problema potrebbe essere relativo al fatto che stai misurando una corrente alternata quindi a media zero… la corrente in tal caso deve essere RMS (http://it.wikipedia.org/wiki/Corrente_alternata)

Reply
giuseppe 22 gennaio 2015 - 14:14

Voglio misurare la corrente assorbita da un circuito (al momento utilizzo una resistenza 2.1 K come circuito)
Il circuito viene alimentato mediante un trasformatore che fornisce 7.7 Vcc
Il valore in uscita dall’ACS712 viene acquisito dallADS1115 (adc a 16 bit)
il valore restituito a circuito aperto, non alimentato, è 2444.45 mv
alimento il circuito con il trasformatore è ottengo 2410/2411. Dopodiché inverto la polarità è ottengo 2373/2374 mv

Ai capi della resistenza la tensione di alimentazione è di +/- 7.3 Vcc

domande:
1 poiché il valore a riposo non è 2500 mv dovrei calcolare il valore medio a riposo ed utilizzarlo come punto di riferimento ?
2 con l’acs712 posso misurare correnti di segno opposto ?
3 i valori di corrente misurata non dovrebbero essere più o meno uguali ma opposti ?
4 che valori di corrente mi devo aspettare ?

grazie.

Reply
mario 1 aprile 2015 - 08:31

Ciao Luca, vorrei realizzare un esperimento per dei ragazzi delle scuole medie, in pratica vorrei misurare la potenza in uscita da un pannello solare con Arduino e trasformarla in una versione visiva con una barra LED che si accendono in proporzione alla potenza in uscita dal pannello. Lo scopo è far capire loro che il pannello deve essere orientato correttamente come un girasole…. Riesci a darmi una mano?

Reply
luca 1 aprile 2015 - 21:28

Ciao Mario! Bel progetto! Il pannello solare esce a 12V CC? Striscia di 10 LED?

Reply
mario 3 aprile 2015 - 10:35

Ciao Luca, grazie della risposta. Il pannello esve a 17V CC alla massima potenza e si barra 10 led.

Reply
Manu 3 aprile 2015 - 12:21

Ciao Luca, Complimenti per la tua preparazione.
Vorrei chiederti gentilmente se potessi farmi un pccolo schema con i relativi componenti da usare riguardo questo.
Vorrei avere un ritorno “reale” dello stato della lampadina in un pin arduino, cioè , se la corrente passa la lampadina è integra ed accesa. ovviamente convertendo il circuito in 5v per i pin di Arduino.
te ne sarei grato 🙂
Grazie .

Reply
luca 7 aprile 2015 - 17:58

Ciao Manu! Se la lampadina è in corrente alternata (ad esempio una comune lampadina a 220V) la soluzione più semplice e non invasiva è usare una “pinza amperometrica” (es venduto da Seeedstudio) attorno al filo e leggere il suo output da Arduino (come spiegato sempre nella wiki di Seeeds).

Reply
kudo 24 aprile 2015 - 05:48

hy luca,
in my project i used arduino , xbee and acs712_05.
i will monitoring current in arduino and xbee. the specifications and arduino xbee consumes a current of 40 mA. so that current flows at – + 80 mA. but I use a current sensor with programming that you can provide 150 mA. whether there are any of my measurements ??

Reply
luca 24 aprile 2015 - 09:07

Hi! Unfortunately the sensitivity of the sensor itself is not enough to measure a such small current… you need a different module (give a look to the one that Sparkfun sells, it has an OpAmp to increase the sensitivity)

Reply
kudo 24 aprile 2015 - 09:59

but when I measure current 40mA same audio only using avometer. sedangkat when using xbee results are much different from the current sensor reads 150mA while using avometer of 75mA.

Reply
Kamil 19 maggio 2015 - 13:36

Luca,
does your solution work on arduino due or just on uno?

Reply
luca 20 maggio 2015 - 07:57

Hi! It should work but I don’t own a Due to test the sketch…

Reply
federico.disante 8 luglio 2015 - 10:04

Ciao Luca.

Devo realizzare un piccolo sistema di condizionamento per un segnale di corrente. Si tratta di una corrente che alimenta un motore AC a 220V (una pompa) il cui assorbimento nominale è di circa 250mA. Devo generare un paio di segnali (TTL) che indichi se la pompa è accesa o sotto sforzo. Ho stimato una corrente di sovraccarico di 500mA. Avevo pensato ad una ACS712, ma viste le correnti in gioco non credo sia idoneo (rischio di usarlo al limite della sua sensibilità!).

Ti ringrazio!
Federico

Reply
luca 9 luglio 2015 - 17:11

Ciao Federico, puoi usare il MAX712 con un opamp esterno come nella breakout board di Sparkfun oppure altri sensori pensati proprio per low currents, esempio questo.

Reply
Hossein 11 agosto 2015 - 13:13

hi luca
Do you test your approach by DSP(F2812)?
How i test your approach in my project (measurment current PMSM motor) with DSP(F2812)?

Thank you.

Reply
luca 12 agosto 2015 - 13:16

Hi! No, I simply used an analog pin and did all the maths in Arduino… sorry but I can’t help with TI DSPs

Reply
Francesco 3 ottobre 2015 - 13:29

Ciao Luca, complimenti per gli articoli molto chiari, mi sono letto tutto il sito 😀
Avrei una domanda, ho questo sensore ma nella versione a 30A, se il zero point è 2,5v e per ogni Ampere ho 0,66mv per 5V dovrei avere 30A di carico ma calcolando la formula mi risultano solo 3,7A. Potresti aiutarmi?

Reply
luca 6 ottobre 2015 - 08:01

Ciao Francesco, questi sensori non raggiungono il “fondo scala” (5V) per il valore massimo di corrente ma appunto hanno un incremento di 66mV per ogni A, quindi al massimo avrai 2.5V (zero point) + 30A * 66mV/A = 4,48V.

Reply
jane 29 gennaio 2016 - 09:49

hi luca ,
i am using acs712 20A current sensor,when i measure the output voltage is 2.30 using multimeter.
i am not getting same value in serial monitor.this is my code

[…]

ouput from serial monitor is

sensor value is 730
voltage is 3.58
current is 5.773

Reply
luca 31 gennaio 2016 - 13:29

Hi! Are you measuring with your multimeter the voltage drop between the analog pin and ground? It’s very strange a such different value (2.3V vs 3.58V), the analog pin is usually very accurate! Try measuring the current with your multimeter, which value do you read?

Reply
Emanuele 9 aprile 2016 - 08:27

Grazie, mi è stato molto utile! 🙂

Reply
aqeel 16 maggio 2016 - 20:11

Sir i want to use controller instead of arduino to measure A.C current, what changing i have required to get correct answer.Kindly inform me.

Reply
luca 17 maggio 2016 - 11:19

Hi! The sensor measures the instantaneous current… if AC, you need a “way” to calculate it… I usually log some measurements and compute their RMS value (https://en.wikipedia.org/wiki/Root_mean_square)

Reply
Leium Glasgow 7 luglio 2016 - 23:43

Luca – thanks for a nice chat on the acs712. I would like to know if you have done the write up on using the chip on AC current. I am battling with a part of my project to protect a AC motor from over current.

Reply
luca 25 luglio 2016 - 09:22

Hi! The sensor works fine with AC, you just need to decide “which” (RMS, max…) value of current you’re interested on.

Reply
Dinesh Vinayak Katkar 8 aprile 2017 - 21:59

Hi Mr. Luca,

Please help for measuring AC load ,
i want to measure AC load upto 20A and I’m not getting design for this AC..

Reply
luca 10 aprile 2017 - 08:53

Hi Dinesh: the sensor returns the “actual” current value… for AC you have to decide “which” value you want (RMS, max…) and do some maths on the samples you get from the sensor.

Reply
matteo 23 aprile 2017 - 16:08

Buongiorno Luca, è possibile usare ACS712 per misurare la corrente erogata da una batteria LiPo? Ho connesso l’uscita della batteria direttamente ai pin di ingresso di ACS e poi ho connesso il sensore a 5V-A0-GND come da tua spiegazione. E’ corretto procedere in questo modo?
Grazie e complimenti per il sito.

Reply
Davide 30 giugno 2017 - 12:53

Ciao, secondo me c’è un errore… possibile che il “/1000” vada fuori dal ciclo for? se no così divide per 1000 ad ogni incremento di i

Reply
luca 30 giugno 2017 - 15:36

ciao, per evitare di tenermi tutti i valori, calcolo una moving average ad ogni campionamento

Reply
Daniele 28 gennaio 2018 - 09:04

Ciao, avrei bisogno di realizzare qualcosa che accenda un Led se c’è passaggio di corrente (12v). Posso utilizzare questo sensore? Posso evitare do usare arduino e sfruttare solo questo? Quale versione devo usare? Grazie

Reply
luca 29 gennaio 2018 - 10:22

ciao Daniele, il sensore dipende da quanta corrente passa… questo sensore non è in grado di pilotare direttamente un led, devi cmq aggiungerci qualche “logica” (arduino…)

Reply
Sandro 21 febbraio 2018 - 09:42

Ciao Luca,
ottimo articolo complimenti. Una curiosità:leggevo che questi sensori Hall a riposo misurano 2,5v, poi il valore cresce o decresce a seconda del verso della corrente. Vale lo stesso anche per la corrente AC?

Reply
luca 26 febbraio 2018 - 14:38

Ciao Sandro, sì questi sensori funzionano egualmente con la corrente AC

Reply

Rispondi a giuseppe Cancel Reply

5 × due =