Giu 052016
 

A quanto pare il monitoraggio energetico interessa a molti a giudicare dalle richieste di aiuto che ho ricevuto. Sinora abbiamo visto come utilizzare le pinze amperometriche per monitorizzare il consumo energetico in maniera non invasiva sia con Arduino UNO che DUE, ma ci siamo sempre limitati ad una piccola grande approssimazione, ossia abbiamo valutato la corrente assorbita senza tenere conto della tensione reale istantanea, sinora approssimata a 220-230V. Oggi infrangiamo questo ultimo ostacolo e andiamo a vedere come calcolare la tensione di rete.

Il trasformatore

Ovviamente Arduino, indipendentemente da quale abbiamo, non è in grado di leggere direttamente la tensione a 230V, infatti a seconda delle versioni a nostra disposizione, saremo in grado di leggere tensioni da 0 a 3.3 o 5V. Quindi il nostro scopo è trasformare una tensione alternata 230V in una nuova tensione alternata in grado di soddisfare il range di lettura della nostra scheda. Il dispositivo in grado di fare ciò è il classico trasformatore. Probabilmente tutti i lettori di questo blog sanno e ricordano cos’è un trasformatore, basti comunque ricordare che è formato da un nucleo di materiale ferroso attorno a cui sono disposti due avvolgimenti di rame il cui rapporto di spire fra questi due avvolgimenti determina il fattore di trasformazione. Giusto per capirci, se all’avvolgimento primario dove arriva la 230V ci fossero 100 spire e al secondario ci fossero 15spire, essendo 100/15=6.67 avremmo che la tensione in uscita sarà di 230/6.67=34V. La scelta del trasformatore non è molto vincolante ma è importante prestare attenzione senza fidarci troppo di quanto riportato sulle etichette. Ad esempio, io ho testato un vecchio trasformatore che sull’etichetta riporta “220-9V”. Tanto per cominciare la tensione di rete in tutta Europa dovrebbe essere di 230V per cui l’uscita già di per se dovrebbe diventare 9.4V (essendo 230V e non 220V). Ma facendo una misurazione “a vuoto”, ossia senza alcun carico collegato al trasformatore, scopriamo che la tensione in uscita è di 11.5V. Perché? Questo è dovuto al fatto che le perdite del trasformatore aumentano con l’aumentare della corrente che transita per cui per riuscire a garantire la tensione di 9V al massimo carico di progettazione, ci sarà inevitabilmente una tensione più alta “a vuoto”. Allora come calcoliamo la “vera” tensione. Ve lo dico subito, se non è di buona qualità lasciate perdere il multimetro, non accontentatevi, il mio, giusto per fare un esempio a 237V mi fornisce una letture di 224V, e 11.3V anziché 12.05V : insomma non fidatevi troppo se non avete un buono strumento di misura.

Per misurare la tensione reale in uscita dal nostro alimentatore abbiamo due modi. Uno del tutto empirico, ossia incrementiamo del 20% la tensione di uscita indicata sulla targhetta del trasformatore (sempre che ci sia). Nel nostro caso 9.4+20%=10.2V, inferiore però al dato reale di 11.5V, motivo per cui vi sconsiglio questa pratica anche se in rete troverete anche voi questo consiglio. Il secondo metodo, più preciso, prevede l’uso di un multimetro, quello che vi avevo appena detto di lasciar perdere; vediamo perché. Misurate la tensione in ingresso e quella in uscita e semplicemente calcolate il rapporto fra le due. Nel mio caso, giusto per fare un paio di esempi, misuravo  227 / 11.3 e in un tempo successivo 224 / 11.2 con un rapporto di 20. Anche se il vostro multimetro, è di scarsa qualità, l’errore sulle due misure sarà similare per cui il rapporto fra le due sarà realistico. Nel mio caso facendo 230/20 ottengo 11.5V che è appunto la mia tensione in uscita senza carico.

Tensione di picco

Quello che noi interessa realmente è la tensione di picco che può raggiungere Arduino in quanto non deve oltrepassare la soglia dei 5V su Arduino UNO e di 3.3V su Arduino DUE, anche se sarebbe più corretto dire “la tensione AREF” che non è detto ricalchi esattamente la tensione ideale di alimentazione. Ma fate molta attenzione. Le tensioni alternate di cui abbiamo parlato sinora, sono tensioni RMS (Root Mean Square), per trovare il picco dobbiamo moltiplicare il tutto per la radice di 2 (circa 1.41) per cui la nostra tensione massima in uscita passerebbe da 11.5 a 16.2. Allora ci siamo? NO! Sinora abbiamo fatto i calcoli come se la tensione di ingresso fosse fissa a 230V, cosa che ovviamente non è, altrimenti che senso avrebbe misurarla? Quindi dobbiamo conoscere la variabilità di ingresso della tensione che deve essere al massimo del 10%, ciò significa che i valori RMS massimi e minimi della tensione di rete in Italia sono di 207-253V. Anche se potremmo rifare i calcoli da zero partendo dai 253V, possiamo accontentarci di aggiungere il 10% al valore prima calcolato e, arrotondando, arriviamo a 18V. Quindi fate attenzione, come vedete siamo partiti da un alimentatore in cui era scritto 9V e siamo arrivati a calcolare un picco di 18V, ossia il doppio.

Questione di onde

No, mi dispiace, quanto visto non basta ancora. Abbiamo calcolato un’onda massima in uscita con picco di 18V, però ci siamo scordati che la semionda negativa arriverà a -18, cosa incompatibile con Arduino che non tollera valori inferiori allo zero. Quindi cosa fare? Dobbiamo innanzitutto innalzare la tensione base allo stesso modo di quanto visto con la pinza amperometrica per cui con un partitore di tensione simmetrico portiamo la 5V o la 3.3V rispettivamente a 2.5 o 1.65V. La seconda cosa da fare sarà quella di “comprimere” l’onda in uscita per impedire che sfori il tetto massimo verso l’alto o scenda sotto lo zero verso il basso. Per fare ciò dobbiamo usare un partitore asimmetrico. Potete usare la mia app per dimensionarlo correttamente, ma nulla vi vieta di fare i calcoli manualmente o ricorrere ad altri tools. Tenete presente che è fortemente consigliato “comprimere” l’onda lasciando un margine libero, ossia non arrivare ad un massimo teorico esattamente di 5V o 3.3V. Questo per diversi motivi: da un lato non possiamo escludere che ci siano delle sovratensioni che superano il 10% (temporali?), in secondo luogo i resistori hanno una certa tolleranza per cui il calcolo non sarà mai così preciso come ce lo aspettiamo e per finire non è detto che i 5V e 3.3V siano tali, nel senso che il valore di riferimento è AREF che dipende dall’alimentazione che a sua volta non è detto essere perfetta. In definitiva meglio sacrificare una parte della scala e ridurre la precisione di misura che rischiare di bruciare Arduino.schema_consumo_elettrico

Riassumiamo

Per semplificarvi la vita ho provveduto a riassumere quanto detto sopra in alcune semplici formule da applicare allo schema che vi propongo qui vicino. Lo schema è quasi del tutto sovrapponibile a quello visto con la pinza amperometrica, l’unica differenza è che al posto della pinza abbiamo il trasformatore e cambiano i valori del partitore R1-R2. Per il partitore R3-R4 vale la regola che i resistori devono essere identici, ricordate che se di valore più elevato riducono il consumo del circuito.

M=Vcc/2 (Vcc è la tensione di funzionamento di Arduino, 5 o 3.3V)

P=(Sec*sqr(2)) + 10%. Ossia il valore rms in uscita dal trasformatore, moltiplicato per la radice di due e a cui alla fine aggiungiamo il 10%. Questo è il valore di picco massimo atteso.

A partire da questi possiamo calcolare a nostra scelta R1 o R2. Fissiamo uno dei due valori a nostro piacimento e calcoliamo il secondo

R1=R2*((P-M)/M)) e R2=R1*(M/(P-M))

Il primo prototipo l’ho testato con Arduino DUE che sappiamo operare a 3.3V, ma nelle formule anziché i 3.3V ho usato 3V (quindi M=1.5) per avere un margine di protezione sugli ingressi di Arduino, infatti se osservate lo schema, non c’è nulla che protegga gli ingressi di Arduino da una sovratensione. Così facendo ho usato 110K per R1 e 10K per R2. Bene ora che abbiamo tutte le informazioni necessarie per dimensionare il sistema dobbiamo passare alla parte software e qui un pizzico di teoria ci sarà d’aiuto

Potenza apparente e attiva

Ricordate che ho sempre detto che sinora abbiamo utilizzato la pinza amperometrica con due semplificazioni di base? La prima riguardava il fatto che la tensione fosse fissa a 230V e l’altra che il carico misurato fosse puramente resistivo, quindi privo di tutte le componenti induttive e capacitive che i comuni apparecchi elettronici hanno. Tutto ciò può portare ad un errore che è tanto più marcato quanto più ci scostiamo da questi parametri ideali. Abbiamo detto che la classica lampadina ad incandescenza è un carico puramente resistivo e non per nulla abbiamo usato questo strumento per calibrare il nostro sistema. In queste condizioni infatti tensione e corrente sono perfettamente in fase, per cui la potenza è data dalla moltiplicazione dei due, ossia P=V*I. Questa è la potenza apparente e si misura in VA (Volt Ampere). Con un carico puramente resistivo questa corrisponde alla potenza reale (potenza attiva), ma ciò è dato solamente dal caso particolare che stiamo analizzando, infatti l’introduzione di carichi induttivi e capacitivi provoca uno sfasamento fra le due onde calcolabile con un “angolo di sfasamento”, e guarda caso la potenza attiva si calcola con P=V*I*cos(φ). Se l’angolo di sfasamento è nullo, il coseno vale uno e come si suol dire “il cerchio si chiude”.

Come calcoliamo l’angolo di sfasamento? Beh direte, basta che valutiamo dove si trovano i picchi o il passaggio per lo zero delle due onde e da li riusciamo a calcolare l’angolo di sfasamento. Verissimo, ma questo assunto prevede che le onde di corrente e tensione siano delle sinusoidi perfette, cosa che nella realtà non accade, anzi, spesso le forme d’onda presentano morfologie bizzarre e distorte che sono tutto tranne che delle sinusoidi ideali. Quindi? In realtà è molto più semplice di quanto sembri. Cominciamo a campionare le due onde e punto per punto moltiplichiamo il valore di corrente per quello di tensione, in questo modo otteniamo la potenza istantanea punto per punto. Facendo la media dei campionamenti lungo l’intera onda otteniamo la potenza attiva (che si misura in W). In modo similare è possibile calcolare la potenza RMS. In questo caso facciamo la somma dei quadrati sia della tensione che del voltaggio, senza moltiplicarli fra loro, cosa che annulla l’effetto dell’angolo di sfasamento. Una volta calcolata la somma totale dividiamo per il numero di campionamenti sia della tensione che della corrente e mettiamo i relativi risultati sotto radice. Una volta ottenuti i valori RMS di tensione e corrente li moltiplichiamo fra loro ed otteniamo la potenza apparente che come dicevamo non è influenzata dall’angolo di sfasamento, ossia è quella che calcolavamo quando semplificavamo il sistema prevedendo un angolo di sfasamento nullo.

Qui sotto vi riporto un grafico che mostra in arancio l’ondulazione proveniente dall’alimentatore e in blu la lettura della pinza amperometrica con un carico resistivo di 100W applicato. Si nota che con questo carico il segnale è molto debole, ma dopotutto la pinza in mio possesso è il modello da 30A in grado di misurare carichi di quasi 7kW. Ciò nonostante l’errore di misura sui 100W si attesta ad un massimo del 3% e ripeto la parola massimo visto che in gran parte delle misure l’errore si è dimostrato intorno l’1% anche se devo ammettere che questo risultato l’ho ottenuto applicando un algoritmo di denoising che però non tratteremo in quanto aumenterebbe troppo la complessità del nostro articolo.

plotting_arduinoDUE_consumo_energetico

Visto così il segnale pare molto pulito, la realtà è invece un po’ diversa. Nel prossimo grafico vi mostro in dettaglio il segnale della pinza amperometrica senza carico, che di fatto dovrebbe corrispondere alla tensione in uscita dal partitore di tensione applicato alla 3.3V (su Arduino DUE). Come potete vedere senza algoritmi di denoising c’è parecchio rumore di fondo per cui la misura diventa particolarmente imprecisa per piccoli carichi, è anche vero che se a qualcuno interessa misurare carichi più piccoli può incrementare il numero di avvolgimenti del cavo in ingresso sulla pinza o utilizzare una pinza amperometrica progettata per carichi inferiori.

plotting_arduinoDUE_pinzasenzacarico

Con Arduino UNO invece la minor risoluzione del convertitore ADC fa si che anche la soglia di percezione del rumore sia inferiore per cui lo stesso grafico diventerebbe:

plotting_arduinoUNO_pinzasenzacarico

rumore che si attenua notevolmente utilizzando la tecnica di oversampling che vi ho spiegato in un precedente articolo, nel grafico qui sotto vediamo l’oversampling a 11 bit su Arduino UNO.

plotting_arduinoUNO_pinzasenzacarico_OS

Qui sotto invece vi riporto il grafico con la lettura dell’alimentatore e della pinza amperometrica, sempre con carico resistivo di 100W, ma con ArduinoUNO e oversampling del segnale a 11bit.

plotting_arduinoUNO_consumo_energetico_OS

Tra le altre le prove con Arduino UNO le ho fatto semplicemente spostando i cavi di alimentazione, massa e letture analogiche dalla DUE alla UNO, non ho perciò modificato i resistori del partitore presenti sul trasformatore, cosa che mi permetterebbe di aumentare la gamma della lettura con maggior precisione della stessa.

Lo schemaschema_arduino_consumo_energetico

Di fatto si tratta più di una ripetizione più che di cose nuove, ma qui metto tutto insieme per cui è più facile seguire lo schema se dovete cominciare da zero. Ci tengo a sottolineare che ci sono alcuni miglioramenti da poter fare, questo circuito è da considerarsi perfettamente funzionante ma perfettibile, giusto per ribadire la cosa non ci sono protezioni che salvino Arduino in caso di sovratensioni sia positive che negative al di fuori dei limiti teorici previsti.

Il circuito è formato da un partitore R3-R4 dal quale fuoriesce la tensione di alimentazione di Arduino dimezzata e che appunto usiamo come riferimento “zero” per le letture sia dal trasformatore che dalla pinza amperometrica. Il trasformatore usa un secondo partitore che permette, come spiegato, di ridurre la massima tensione in uscita per adattarla a quella leggibile da Arduino.

Lo schema qui vicino dovrebbe chiarire il tutto. In azzurro vediamo il partitore che divide la linea di alimentazione, nel caso specifico ho usato la linea a 3.3V (filo rosso), ma su Arduino UNO dovete usare la linea a 5V (lo schema riporta Arduino UNO solo per semplicità di disegno). La linea azzurra, termina in tre posti, ossia all’ingresso analogico numero 4 per la lettura diretta da parte di Arduino (nota: nello sketch troverete A5), alla pinza amperometrica e al trasformatore. La linea verde esce dalla pinza amperometrica e termina all’ingresso analogico A1. Si noti che dall’uscita del trasformatore arriviamo al secondo partitore di cui ho più sopra spiegato come dimensionare. L’uscita dallo stesso raggiunge A2 per la misurazione da parte di Arduino.

Sketch

Immagino siate impazienti di provare qualcosa di pronto per cui eccoci alla parte software vera e propria. Lo sketch di oggi funziona sia su Arduino UNO che su Arduino DUE, occorrono solo piccole modifiche che riguardano la calibrazione del trasformatore. Inoltre ho deciso di sfruttare una delle caratteristiche delle ultime versioni dell’IDE di Arduino, ossia la funzione “Plotter Seriale” che permette di generare direttamente dall’IDE, i grafici che vi ho riportato in questo articolo. E’ un sistema molto rudimentale, che non permette di fare nulla di nulla, la scala è automatica, i colori delle tracce anche, non è possibile fermare il grafico ne effettuare uno screenshot, ma comunque è una caratteristica decisamente molto comoda. Se la prima linea del listato (//#define LOCALDEBUG 1) è commentata, il listato si prepara per l’output grafico che potete vedere applicando la funzione “Plotter Seriale” dell’IDE, in caso contrario fornisce un output testuale con i seguenti dati:

Midpoint= 1024.00
min V= -570.00 – max V= 569.00 min I= -8.00 – max I= 8.50 – campionamenti= 17.00
rms I= 0.45 – V= 227.02
Real power= 100.20
Apparent power= 101.24
Power Factor= 0.99

Ci sono perciò la misura del “midpoint”, ossia la tensione in uscita dal partitore sulla linea di alimentazione, i valori minimi e massimi sia sul voltaggio che sulla corrente, il numero di campionamenti effettuati sul periodo stabilito, che di default è un’intera onda, i valori rms di corrente e tensione, la potenza reale, quella apparente ed il fattore di potenza. L’unica modifica necessaria è quella che permette di calibrare il trasformatore e relativo partitore. Per farlo alla linea 46 dove è riportato ”  sensorVstep=0.5555; //0.181 SU ARDUINO DUE” , impostate dapprima sensorVstep=1 e compilate lasciando attiva la modalità debug (prima linea non commentata). A questo punto provate il software applicando alla pinza un carico puramente resistivo noto, io come sempre ho usato una lampadina ad incandescenza da 100W. A questo punto guardate il risultato della potenza reale letta, non badate alle prime misure, aspettate almeno 5-6 misure per far si che il sistema si sia stabilizzato. A questo punto facciamo finta che vengano misurati 180W. Calcoliamo ora Carico reale / misurato, ossia 100/180 ed otteniamo 0.555, guarda caso l’esempio che vi porto è quello che ho ottenuto nella realtà e che perciò trovate nel listato. Sostituite con il valore calcolato, ricompilate e il vostro sistema è pronto. Per migliorare la precisione di calibrazione potete fare due, tre o quattro avvolgimenti del filo sulla pinza amperometrica, in questo caso la misura dovrà essere 200, 300 o 400W motivo per cui con 4 avvolgimenti avrete un carico reale di 400W e la misura non calibrata potrebbe essere di 720W. Poi però ricordatevi di togliere gli avvolgimenti sulla pinza amperometrica, io ho perso una buona oretta a capire perchè il mio portatile consumava più di 240W quando me ne aspettavo una sessantina. Il listato è già impostato per fare l’oversampling a 11bit con prescaler modificato nel caso venga utilizzato Arduino UNO, potete comunque intervenire su questi parametri come spiegato nei precedenti articoli. Al fine di ridurre il rumore sia la tensione che la corrente vengono campionate come media di 3 misurazioni consecutive per cui nell’esempio che vi ho mostrato sopra, i 17 campionamenti si riferiscono comunque a 51 campionamenti sulla tensione e altrettanti sulla corrente che vengono però mediati in 17+17 per ridurre il rumore delle misure. Ecco qui sotto il listato

#define LOCALDEBUG 1

#ifdef __AVR__
  #define PS_8 ((1 << ADPS1) | (1 << ADPS0))
  #define PS_16 (1 << ADPS2)
  #define PS_32 ((1 << ADPS2) | (1 << ADPS0))
  #define PS_64 ((1 << ADPS2) | (1 << ADPS1))
  #define PS_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
 // i bit del convertitore ADC di arduino, su UNO sono 10
 #define basic_bits 10
 //i bit che vogliamo ottenere col sovravcampionamento
 #define extended_bits 11
 #define arduinorange 5
#else
 #define basic_bits 12
 //i bit che vogliamo ottenere col sovravcampionamento
 #define extended_bits 12
 //arduino adc range (5V, 3.3V or href value)
 #define arduinorange 3.3
#endif

//voltage range of sensor
#define sensorvoltagerange 1
//how many ampere the sensor reads (RMS)
#define sensorrange 30


//parametri calcolati automaticamente, NON modificare!
// bit di sovracampionamento
#define overbit extended_bits-basic_bits
//divisore oversampling
#define decimatoreoversample (pow(2,overbit))
//calcola risoluzione sensore

double sensorunit;
double sensorIstep;
double sensorVstep;


void setup()
{
  Serial.begin(19200);
  while (!Serial) {} // wait for serial port to connect. Needed for Leonardo only
  sensorunit=(((int)(1<<extended_bits))*(float)sensorvoltagerange/(float)arduinorange);
  sensorIstep=((float)sensorrange/(float)sensorunit);  // su DUE con sensore 30A ho 0.0242
  sensorVstep=0.5555; //0.181 SU ARDUINO DUE // QUESTO DEVE ESSERE CALIBRATO SUL VOSTRO SISTEMA
  
  //puntozero=(1<<(extended_bits-1)); // da tenere se non fai la lettura analogica
 
  #if defined __AVR__
   ADCSRA &= ~PS_128;  //Set up the ADC: remove bits set by Arduino library
   ADCSRA |= PS_32;    // set our own prescaler to XX
  #else
   analogReadResolution(12);
  #endif
 
   
  double tstart,tstop,test;
}

float SampleAnalogAvg(int localpin,unsigned char campioni)
{
  float valore=OversampledAnalogRead(localpin);
  for(int i=0;i<campioni;i++) valore=(valore+OversampledAnalogRead(localpin))/2;
  return(valore);
}


inline double OversampledAnalogRead(int pin)
{
 unsigned int val=0;
 unsigned int misureoversample=pow(4,overbit);
 for(unsigned char z=0;z<misureoversample;z++) val+=analogRead(pin);
 
 return(val>>overbit); //2^n
}


void loop()
{
  double istI,istV,istP,maxI=0,maxV=0,minI=256000,minV=256000,sum_inst_power=0,sqrV=0,sqrI=0,sum_sqrV=0,sum_sqrI=0;
  double rmsI,rmsV,rP,aP;
  double midpoint,tstart;
  float wavenumber=1;
  double timelen=(double)wavenumber*1/50*1000*1000; //0.02sec...è la lunghezza in microsecondi dell'onda completa.
  double counter=0;


  boolean st=false;                                  
  tstart = micros();    

   midpoint=SampleAnalogAvg(A5,10);  // su A5 è campionato il midpoint, ossia il voltaggio che da Arduino passa al partitore per essere dimezzato.
#ifdef LOCALDEBUG
  Serial.print("Midpoint= ");
  Serial.println(midpoint);  
#endif
  while(st==false) // aspetta di essere intorno allo zero per iniziare a campionare.                                   
  {
   istV=SampleAnalogAvg(A2,2)-midpoint; // A2 legge l'onda che arriva dal trasformatore
   if (istV<50 && istV>-50) st=true;  //check its within range
   if ((micros()-tstart)>5*timelen) st = true;
  }
  
  tstart=micros();
  while(micros()-tstart<timelen) 
  {
   
   istI=(SampleAnalogAvg(A1,3)-midpoint); // A1 è collegato alla pinza amperometrica. 
   istV=(SampleAnalogAvg(A2,3)-midpoint); // A2 legge l'onda che arriva dal trasformatore
   istP=istV*istI;
   sqrV=istV*istV;
   sqrI=istI*istI;
   sum_sqrV+=sqrV;
   sum_sqrI+=sqrI;
   sum_inst_power+=istP;   
 
   if(minV>istV) minV=istV;
   if(minI>istI) minI=istI; 

   if(maxV<istV) maxV=istV;
   if(maxI<istI) maxI=istI; 
   counter++;
  }
  rmsI=sqrt(sum_sqrI/counter)*sensorIstep;
  rmsV=sqrt(sum_sqrV/counter)*sensorVstep; 
  rP=sensorIstep*sensorVstep*sum_inst_power/counter;
  aP=rmsV*rmsI;

  
#ifdef LOCALDEBUG
  Serial.print("min V= ");
  Serial.print(minV);
  Serial.print(" - max V= ");
  Serial.print(maxV);

  Serial.print(" min I= ");
  Serial.print(minI);
  Serial.print(" - max I= ");
  Serial.print(maxI);
  Serial.print(" - campionamenti= ");
  Serial.println(counter);
  
  Serial.print("rms I= ");
  Serial.print(rmsI,2);
  Serial.print(" - V= ");
  Serial.println(rmsV,2);

  Serial.print("Real power= ");
  Serial.println(rP,2);
  Serial.print("Apparent power= ");
  Serial.println(aP,2);
  Serial.print("Power Factor= ");
  Serial.println(rP/aP,2);  
  Serial.println(" ");
  delay(5000);
  #else
  Serial.print(rmsI,2);
  Serial.print(",");
  Serial.print(rmsV,2);
  Serial.print(",");
  Serial.print(aP,2);
  Serial.print(",");
  Serial.println(rP,2);  
  #endif
  
  
} 

IMAG0012E’ abbastanza lungo ma gran parte non è altro che quanto già spiegato in passato, in particolare per quanto riguarda le funzioni di oversampling e la modifica del prescaler. In questo esempio, a differenza del passato, ho portato la velocità della porta seriale a 19200 per cui dovete modificare il relativo valore sul Monitor / Plotter seriale per ottenere una corretta visualizzazione dell’output. Ho fatto ciò per rendere il plotter più veloce. Nella foto a lato potete osservare il prototipo che ho realizzato. In alto a destra potete vedere il trasformatore che ho messo su una basetta millefori, ho preparato dei connettori a vite in cui da una parte abbiamo l’ingresso a 230V (cavi rosso, blu, giallo) e subito in vicinanza l’uscita che termina in una presa per collegarci l’utilizzatore finale oltre che la pinza amperometrica. Dai cavi grigi esce la tensione trasformata che vedete andare sulla breadboard. Una cosa molto importante non visibile in foto è che il fondo della mille fori con i vari fili stagnati è stata ricoperta con della plastica ed il tutto sigillato con colla a caldo per isolare in maniera sicura la 230V dal mondo esterno.

Nella fotto ci sono sia Arduino UNO che DUE per il semplice motivo che mi è comodo averli vicini e spostare al volo i cavi da uno all’altro per fare le relative prove. Ad essere onesto il progetto su breadboard ha una differenza rispetto a quanto ho sopra descritto sopra, infatti dalla tensione di Arduino partono due distinti partitori, uno per la pinza amperometrica ed uno per il trasformatore, ma ciò è dovuto solamente alla maggior semplicità nei test, è infatti più semplice staccare singole parti dello schema e fare le relative misure con l’oscilloscopio; non c’è perciò nessuna motivazione legata al funzionamento del sistema.

Il futuro

Con mia sorpresa devo ammettere che questa serie di articoli sul consumo energetico ha superato ogni mia aspettativa, anche perchè esistendo il progetto OpenEnergyMonitor pensavo di scrivere solo i primi due articoli della serie solo per completezza di questo blog, ma alla fine ho dovuto ricredermi e approfondire ancora la materia viste le numerose richieste che ricevo in tal senso. Vi chiederete se possono esserci sviluppi ulteriori e la risposta è sicuramente si. Pensavo, tanto per cominciare, di utilizzare degli schermi per mostrare l’output delle misurazioni direttamente su Arduino senza dover per forza restare collegati al PC per leggere l’output seriale. Una seconda cosa che farò è trasmettere la misura ad un secondo Arduino ricevente, a distanza. Una terza cosa che farò, sarà quella di permettere la lettura di più pinze amperometriche in contemporanea per far si che si possano monitorare più linee elettriche in un solo colpo. In molti mi chiedono infatti la possibilità di monitorare la produzione dei pannelli fotovoltaici ed il consumo dell’abitazione. Non ultimo dovrò spostare buona parte del codice in una libreria “ad ok”, in modo da rendere più semplice la progettazione e sviluppo dei sistemi che ne fanno uso.

 

Fonti principali:

https://openenergymonitor.org/emon/
http://www.atmel.com/images/atmel-2566-single-phase-power-energy-meter-with-tamper-detection_ap-notes_avr465.pdf

  20 Responses to “Arduino per il monitoraggio del consumo energetico – parte 4 – it”

  1.  

    Buongiorno forse ho capito male ma il trasformatore deve essere AC-AC?
    Non ho problemi a collegarlo agli ingressi analogici di arduino che funzionano in DC?
    Saluti

    •  

      mah, forse non hai letto l’articolo e ti sei limitato a guardare lo schema, certo che è AC-AC. Un segnale AC lo puoi collegare agli ingressi analogici di arduino, ci mancherebbe, basta rispettare i limiti di tensione minima e massima, nell’articolo è infatti spiegato come fare.

  2.  

    Salve e grazie della risposta tempestiva.Si in effetti ho letto l’articolo molto velocemente.
    Ho già realizzato il circuito proposto nella parte 2 ed è perfettamente funzionante ma adesso credo di relizzare anche questo essendo più preciso per la lettura dei carichi induttivi.
    Complimenti per il lavoro

  3.  

    Buongiorno, per alimentare i sensori, posso usare un alimentatore esterno da 5v? Poi non mi è chiaro il pin analogico 4, su arduino e nel programma viene utilizzato il pin 5, quale devo cambiare o utilizzare? Grazie Giorgio

    •  

      Certo che puoi usare un alimentatore esterno da 5V, io quasi sempre uso alimentatori usb per telefono riciclati. Sul pin hai ragione, evidentemente fra il disegno e la stesura del codice ho fatto delle modifiche, ovviamente devi usare il pin ove colleghi il filo, che sia il 4 o il 5 non cambia nulla, puoi modificarlo secondo le tue preferenze.

      •  

        la ringrazio per la risposta tempestiva, volevo chiedere inoltre se arduino deve essere alimentato dalla stessa linea che alimenta i sensori o posso usare due alimentazioni separate? cioè due trasformatori?

        •  

          Allora, fai attenzione ad una cosa. Io per “sensori” intendo le pinze amperometriche, quelle essendo “passive” non richiedono una vera forma di alimentazione, ma è sufficiente il “punto di mezzo” ottenuto con i partitore di tensione che puoi ottenere direttamente dell’alimentazione di Arduino. Fin qui non ti servono altri alimentatori. Se ivece vuoi usare il trasformatore per leggere la tensione di rete le cose cambiano. Non puoi ad esempio usare un alimentatore per telefono come ti dicevo, quello infatti, e fai attenzione alle parole, è un ALIMENTATORE e non un TRASFORMATORE, sono cose diverse, il secondo è contenuto nel primo ma non l’inverso. Perciò se vuoi usare un solo trasformatore, ti devi costruire poi anche il circuito di alimentazione ma c’è il rischio che i disturbi indotti dal tuo circuito si riflettano poi sulla lettura della tensione. Diciamo che anche se meno economico, è più semplice usare il trasformatore per leggere la tensione di rete ed in contemporanea usare un alimentatore esterno per alimentare Arduino. Se non l’hai letto, guarda anche questo articolo: http://www.mcmajan.com/mcmajanwpr/blog/2016/11/04/energia-it/

          •  

            ho usato la terminologia in modo inappropriato, ho costruito un alimentatore stabilizzato da 5v con integrato lm7805 con il quale vorrei alimentare come da circuito la pinza amperometrica, mi chiedevo se devo utilizzare la stessa corrente cc 5v per alimentare anche arduino oppure se è possibile alimentare arduino separatamente con un alimentatore stabilizzato con lm7812 a 12v, grazie Giorgio

  4.  

    Grazie per i preziosi consigli, oltre allo sketch in questa pagina, è possibile utilizzare lo sketch nella libreria ConsumoEnergeticoVI con gli stessi collegamenti?

  5.  

    Oltre ad utilizzare lo sketch in questa pagina, è possibile utilizzare lo stesso schema per lo sketch presente in libreria ConsumoEnergeticoVI giusto?

  6.  

    Complimenti per l’interessante articolo. Averi solo una domanda. Lo sketch è implementabile con altre due pinze amperometriche uguali per poter misurare contemporaneamente la produzione del fotovoltaico,l’assorbimento dell’impianto ed i prelievi dalla rete? E se si,come dovrei pocedere?

  7.  

    Ciao Mc,
    sono quasi arrivato alla fine del progetto (dopo oltre un mese di studi e implementazioni) anche grazie al tuo aiuto.

    Ho una domanda sullo sketch che presenti in questa pagina del blog.
    A parte le tante variabili globali, mi pare vada piuttosto bene. Infatti io l’ho modificato un pochino e sto facendo dei test con 2 pinze amp e 1 trasformatore.

    La prima domanda è questa:

    1)

    float wavenumber=1;
    double timelen=(double)wavenumber*1/50*1000*1000;

    Nell’articolo precedente (Arduino DUE per il monitoraggio del consumo energetico) invece c’erano questi parametri:

    wavenumber veniva passato = 3 alla funzione GetWaveValue e poi timelen lo moltiplicavi per 2.2


    while(micros()-tstart<timelen*2.2)

    Cosa mi consigli ??? Che ragionamento applichi alla base di questa conclusione???

    2) Seconda Domanda:
    Il mio progetto prevede di comunicare i dati di lettura a un HUB personale tramite protocollo MQTT ogni 10 secondi circa.

    Mi consigli di modificare il parametro “timelen = 10.000.000 micros” oppure di creare delle altre variabili globali per fare la media dei valori calcolati dentro il ciclo while(micros()-tstart<timelen) e trasmettere le medie ogni 10 secondi ?

    Nel frattempo sto studiando la McLibrary2, sezione Energia, perchè il filtro di kalman mi sa che puo' essere molto utile!

    Grazie per la risposta,
    Nicola.

  8.  

    Ah, in realtà ho una terza domanda (scusami) ^_^

    3) con due pinze amperometriche e un trasformatore, siccome noi andiamo a calcolare anche lo sfasamento tra tensione e corrente e noto che arduino opera le istruzioni del nostro sketch in serie, come è meglio procedere con la lettura dei valori ?

    Leggo pinza1 –> Leggo pinza2 –> Leggo V –> faccio i calcoli
    oppure
    Leggo pinza1 –> Leggo V –> Leggo pinza2 –> faccio i calcoli
    o altro ?

    La mia preoccupazione è che mentre sto leggendo la corrente, intanto la tensione possa variare e quindi avere uno sfasamento approssimativo.

    •  

      Ogni volta che mi fai una domanda comincio a sudare 🙂 Allora verdiamo per ordine:
      1) Sulle variabili globali ti dico che hai ragione, ma in questi piccoli sketch bado più alla semplicità che all’efficienza del codice, se guardi la mia libreria vedrai che è strutturata in maniera ben differente.
      2) le incongruenze nascono dal fatto che quando scrivo un articolo sperimento tantissimo e creo tantissime varianti degli sketch per cui poi spesso mi scappa qualcosa di differente…e mi fa sempre piacere quando qualcune se ne accorge perchè significa che ha letto con molta attenzione. Da qualche parte scrivevo che avevo notato che se invece di leggere un’onda ne leggevo almeno due, ottenevo misure migliori per cui il mio consiglio è di leggere qualcosa più delle due onde, che sia poi 2.2 o 2.5 poco importa. Se poi mi chiedi perchè ottengo misure migliori rispetto a fare la media di varie letture di onde singole non ne ho idea. E’ un dato sperimentale che ho rilevato sul campo.
      3) sicuramente inviare la media di multiple letture sui 10 secondi ti fornisce un risultato più accurato
      4) Guarda qui (meglio da pc con uno schermo grande): https://www.mcmajan.com/iot/ …è il sistema che sto scrivendo da due anni a questa parte. Vdrai ben poco, ma c’è un grafico con le ultime 24 ore di letture termiche del mio salotto sottoposte a filtro di Kalman. Ora vai su http://www.mcmajan.com/wtemp.php e trovi il vecchio sistema, la traccia rossa sono i dati grezzi letti dal sensore che prima hai visto filtrati. Che dici? Diversi vero? (la traccia blu è un mio vecchio algoritmo).
      5) La libreria ti risparmia tanto codice ma usandola senza leggere gli articoli non impari cosa c’è sotto. E la libreria stessa ha delle potenzialità che però sono un po’ complesse da sfruttare, ho messo la documentazione online, ma io stesso spesso devo rivedere il codice perchè non mi ricordo come funzionano certe parti di codice.
      6) Le letture di tensione e corrente devi farle il più vicino possibile, in modo da avere i dati il più possibile nello “stesso istante”. I calcoli li fai dopo che hai acquisito i dati grezzi. La reale contemporaneità ovviamente non puoi averla, ma lo scarto è veramente minimo e comunque nell’arco del tempo avrai dei casi in cui magari la sfiga vuole che nel frattempo la seconda lettura si sarà sfasata, ma a volte lo farà in positivo ed altre in negativo per cui nella media dovresti comunque avere un errore minimo.
      7) Ieri ho mandato in stampa il pcb nella prossima versione che avrà un arduino 0 con espansione delle porte analogiche e connettività wifi tramite ESP-01 montato sulla scheda. …. in questi mesi ho lavorato al protocollo di comunicazione delle schede e sono letteralmente impazzito, ma ora funziona anche se sono arrivato alla semplice connessione alla rete di casa senza invio reale di dati; ossia l’M0 fornisce via seriale i dati all’ESP per la connessione, come nome della rete, password, etc e l’esp esegue la connessione….è stato molto più complesso del previsto.
      8)No l’8 no, adesso vado a dormire 🙂

    •  

      vedo ora che la seconda domanda in realtà era più dettagliata di quanto ho capito ieri sera….forse, e di co forse, calcolare la tensione a metà delle misure e prima e dopo le correnti ti fornisce la misura più precisa per il semplice motivo che la tensione è mediamente “più vicina” alle altre due letture. La realtà è che le letture sono davvero molto veloci e non credo noterai alcuna differenza anche se mi piace come stai attento a tutti i dettagli… ora entro in modalità Lavoro ON 🙂

  9.  

    Con questo circuito è possibile anche vedere il verso della corrente con inverter grid tie?