Monitoraggio corrente AC con il sensore ACS712

Buongiorno,
dopo aver cercato nel forum ho trovato una discussione che affronta già la questione in oggetto:

Nella discussione viene affrontato l’argomento che avrei voluto affrontare con voi, in italiano.
Questo è il codice che un utente ha postato. Sembra essere la soluzione alla richiesta fatta.

const int currentPin = 3;
const unsigned long sampleTime = 100000UL;                           // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
const unsigned long numSamples = 250UL;                               // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
const unsigned long sampleInterval = sampleTime/numSamples;  // the sampling interval, must be longer than then ADC conversion time
const int adc_zero = 510;                                                     // relative digital zero of the arudino input from ACS712 (could make this a variable and auto-adjust it)

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

void loop()
{
 unsigned long currentAcc = 0;
 unsigned int count = 0;
 unsigned long prevMicros = micros() - sampleInterval ;
 while (count < numSamples)
 {
   if (micros() - prevMicros >= sampleInterval)
   {
     int adc_raw = analogRead(currentPin) - adc_zero;
     currentAcc += (unsigned long)(adc_raw * adc_raw);
     ++count;
     prevMicros += sampleInterval;
   }
 }
 
 float rms = sqrt((float)currentAcc/(float)numSamples) * (75.7576 / 1024.0);
 Serial.println(rms);
}

Si parla praticamente dello stesso sensore, quello in mio possesso ha una sensitivity di 100 mV/A, contro i 66 mV/A del sensore riportato nel codice, il mio misura correnti fino a 20A.

Mi è sembrato di capire che l’utente proponga di fare un elevato numero di misurazioni e di mediarle tramite una media quadratica.

Purtroppo, complice il mio sgangherato inglese e le mie scarse conoscenze elettroniche non riesco a capire la logica che muove il codice, i suggerimenti che vengono proposti, e i commenti al codice stesso non mi sono di aiuto. Avrei bisogno di capire, passo passo, quel codice che sembra fare al caso mio.

Ho tentato alcune misurazioni in casa e Arduino mi restituisce un valore di 339/340 (presumo sia 339/340 sui 1024 disponibili) sia se misuro un piccolo circuito in cui passa corrente AC 220V (corrente di casa), sia se misuro quella di un trasformatore da 12V. Io mi sarei aspettato che, in assenza di carichi, il valore letto da Arduino fosse intorno al 512.
Dove sbaglio?

Esiste poi un altro problema che giustamente viene sollevato: la misurazione della corrente alternata è viziata dal fatto che ogni misurazione cade in punti diversi dell’onda, quindi mi viene da pensare che si dovrebbero in qualche modo misurare i soli “picchi”, ma non capisco se nel codice questo viene fatto o meno (non sembrerebbe o sbaglio?)

Ho fatto tante domande, forse troppe. Apprezzerò ogni contributo!

pier

Se il tuo obiettivo è quello di monitorare il consumo elettrico (potenza), la sola misura delle corrente non basta.

Infatti, sarebbe necessario monitorare anche la tensione (solo in teoria è 220V anzi 230V) e lo sfasamento tra tensione e corrente.

La potenza è P = V * I * cos(φ) ove φ è l'angolo di sfasamento tra tensione e corrente e cos(φ) varia tra 0 ed 1.

Nella pratica, devi calcolare il valore efficace di V ed I usando il metodo RMS (Root Mean Square) e calcolare la distanza temporale tra i due picchi di tensione e corrente.

la misura cade in punti randomici della curva, e non potrebbe essere altrimenti visto che parliamo di misurare un assorbimento di corrente che puo' variare in qualsiasi istante, pero' se vedi vengono fatte 250 misure e poi su di esse si calcola una media.

Poi su questo valore mediato applica anche l'RMS. Ma come gia' detto da cyberhs ricorda che stai solo misurando la corrente, per arrivare alla potenza, se questo e' il tuo obiettivo, c'e' altro da misurare e poi aggiungere al calcolo.

Ci sono librerie che fanno questo di mestiere, probabilmente ti smeplificano la vita. In genere vengono forniti anche gli schemi per il condizionamento dei segnali e istruzioni per la calibrazione

Altra strada e' comprare sensori appositi che ti danno in uscita un semplice segnale da leggere con analogread. Piu' costosi, ma ti evitano codice e lasciano il micro libero di fare altro (campionare una/due onde sinusoidali e calcolare l'RMS non e' uno scherzo per un avr 8bit)