sensore di corrente ACS712

buonasera a tutti, scrivo dopo aver passato un fine settimana infruttuoso…
ho necessità di rilevare il passaggio di 220 v (o comunque di sapere se c’è ho non c’è tensione) in un determinato circuito, allo scopo ho comprato questo prodotto.

( versione 20A) e collegato sulla 220v
nello sketch ho inserito questa formula
.049 * analogRead(A0) -25 (valori calcolati grazie al datasheet.
e questo è il risultato, sia con la corrente che senza…
dove sbaglio?

schema.JPG

Dai una lettura qui --> http://www.lucadentella.it/2011/11/29/sensore-di-corrente-con-arduino/

gia visto, sto usando proprio quella formula (calcolata per il sensore da 20A) il problema è che il risultato su monitor seriale NON cambia ne con corrente ne senza..

Sicuro d'averlo collegato correttamente, ne ho uno simile, da 20A ed uno da 5 A e vanno entrambi....

lo collegato sul 220. a te che valori restituisce? cambia in base all'acceso/spento? mi viene il dubbio che funzioni solo in corrente continua, ma dovrebbe funzionare anche in alternata..

Devi metterlo in serie al carico, che sia DC o AC non ha importanza, la cosa importante è che i 5V siano collegati a VCC, GND con GND e l’out con un pin analogico di arduino, se non funziona così, fai una foto e vediamo di capire il problema…
Cosa vuol dire :
cambia in base all’acceso/spento?

I valori, son corretti, li ho comparati con un multimetro della fluke al posto di 180mA magari mi dice 181mA ma non sbaglia di molto anzi l’ho trovato davvero preciso, ben oltre le caratteristiche del datasheet.

chiedevo se i valori stampati nel monitor seriale cambiavano al passaggio o meno di corrente, mi pare di capire si di, a me purtroppo rimane sempre come da screenshot. nello specifico devo sapere se una luce è accesa o spenta, quindi la fase (220v) entra e esce nei morsetti a vite e i 3 piedini sono collegati a 5v GND e il pin analogico 0..

An, ok. Si deve cambiare per forza, fai una prova, alimenta il sensore con +5V applicagli un carico e misura tra gnd ed out a carico collegato e scollegato la tensione, se non varia vuol dire che il sensore non funziona.

Fra i commenti della pagina di lucadentella.it c'è scritto che lo sketch non funziona con la corrente alternata ma che va cambiato perché il valore cambia continuamente.

Devi prendere il massimo delle 1000 misure e quindi moltiplicarlo per 0.707 per avere il valore RMS.

Di solito nelle pagine web vanno letti anche i commenti. E' vero che andrebbe cambiato anche il testo del post.

V2

void setup() {
  Serial.begin(9600);
  delay(1000);
}

void loop() {
  float Ampere = ReadAmpere(A0, 30, false, 5, 2.5, 100); //pin, num letture, AC/DC, Vcc, Zero, sensibilità
  Serial.println(Ampere);  
}

float ReadAmpere(byte apin, unsigned int cycle, boolean current, float vcc, float zero, float sens) {
  float amp = 0;
  if (current == true)  {
    for(int i = 0; i < cycle; i++) {
      amp += analogRead(apin);
      delay(1);
    }
    amp /= cycle;  
  }
  else
  {
    for(int i = 0; i < cycle; i++) {
      amp = max(analogRead(apin), amp);
      delay(1);
    }
    amp /= 0.707106;  
  }
  amp = (vcc * amp/1023.0 - zero)/(sens/1000.0);
  return amp;
}

dopo cena la provo subito!! grazie

questo è il print del risultato SENZA passaggio di corrente, (interruttore spento).
non dovrebbe essere a 0?
dove sbaglio?

E’ anche probabile che abbia sbagliato io la formula. :sweat_smile:

Forse così è più chiaro:

void setup() {
  Serial.begin(9600);
  delay(1000);
}

void loop() {
  float Ampere = ReadAmpereAC(A0, 30, 5, 2.5, 100); //Pin analogico, Num letture, Tensione Vcc, Tensione riferimento zero, Sensibilità sensore mA/V
  Serial.println(Ampere);  
}

float ReadAmpereAC(byte apin, unsigned int cycle, float vcc, float zero, float sens) {
  float amp = 0;
  for(int i = 0; i < cycle; i++) {
    amp = max(analogRead(apin), amp);
    delay(1);
  }
  amp = (vcc * amp/1023.0 - zero)/(sens/1000.0);
  return amp/0.707106;
}

float ReadAmpereDC(byte apin, unsigned int cycle, float vcc, float zero, float sens) {
  float amp = 0;
  for(int i = 0; i < cycle; i++) {
    amp += analogRead(apin);
    delay(1);
  }
  amp /= cycle;  
  amp = (vcc * amp/1023.0 - zero)/(sens/1000.0);
  return amp;
}

tranquillo non preoccuparti, comunque indipendentemente dalla formula giusta ho sbagliata il valore dovrebbe variare al passaggio ho meno di corrente, cosa che non avviene e non capisco perchè.
nel sensore vcc e gnd sono collegati hai rispettivi pin 5v e GND sull’arduino, il pin out è collegato all’ingresso analogico 0 sempre su arduino mentre nei morsetti a vite è collegato (entra e esce) la fase a 220v, successivamente va alla lampada… =(
dubito che il sensore non funzioni, ne ho presi 2 e danno entrambi i soliti risultati…

void setup() {
  Serial.begin(9600);
  delay(1000);
}

void loop() {
  int Ampere = analogRead(A0);
  Serial.println(Ampere);
 delay(100);  
}

Se non funziona questo allora c'è un problema sulle letture analogiche.

Ti dovrebbe restituire circa 512 senza corrente.

oggi quando rientro a casa per pranzo provo cambiando anche il pin analogico e vediamo.. grazie per l'aiuto!

uff, anche cambiando pin analogico mi restituisce un valore che va da 509 a 514, sia con che senza passaggio di corrente.. non so più che pesci prendere..

E’ giusto.
Ti da 512 con uno scarto di +/- 2 su una scala di 1023 valori.
Quindi un errore del 1,6% circa.

Bisogna rivedere la formula.
Verifica sul datasheet la sensibilità del sensore e aumenta le letture a 100.

ma mi da 512(circa) sia con la luce spenta che con la luce accesa, non dovrebbe variare?

Con la luce accesa e il passaggio di corrente DEVE variare. Prova il sensore con un led, una resistenza e 5V.