Arduino Energy Monitor

Salve a tutti sto cercando di realizzare il progetto "Energy Monitor" per il monitoraggio dei consumi. Ho letto queste guide:

http://playground.arduino.cc/Italiano/Emoncms#emoncms

Poi ho letto questo:

https://openenergymonitor.org/forum-archive/node/58.html

Dunque ho un problema nella rilevazione della tensione. Premetto che mi è stata fornita una schedina (che è praticamente il cirucito del secondo link che ho postato) a cui collegare le pinze amperometriche e un alimentatore Ac/Ac per rilevare la tensione. Potrà sembrare una domanda banale o imbarazzante , ma non ho capito come collegare l'alimentatore per recuperare la tensione e poi inviarla ad arduino su un pin analogico.

Inoltre come faccio a settare i parametri di calibrazione? Da quanto leggo sulla guida (di pitusso)sembra che consigli di cambiarli utilizzando una certa formula. Però non mi è molto chiaro il procedimento.

Un power adapter ac-ac è un trasformatore o adattatore ac-ac visto che riceve in ingresso una tensione e la riporta in uscita aumentata o diminuita in base al rapporto delle spire dei due avvolgimenti che lo compongono. Quel circuito rileva la tensione alternata mediante l'adattatore e la corrente mediante il sensore di corrente . In pratica se compri un adattatore ac-ac 230V - 9V, come indicato in quell'articolo, ponendo che sia di buona qualità, il rapporto tra le spire è di 230/9 = 25,55:1, quindi se in ingresso arrivano 200V in uscita ti trovi 200:25,55=7,83V; Quindi devi collegare l'adattatore alla rete elettrica ed il suo secondario (uscita) ai due fili previsti (senza preoccuparti della polarità); quel circuito occhio e croce riduce la tensione ulteriormente di 10 volte, e quindi all'ingresso A2 arriveranno circa 0,78V, a quel punto, via software leggi questo valore e rifai il calcolo inverso per arrivare alla tensione originale di 200V. La formula prevista in quel circuito probabilmente dovrai adattarla ai valori reali che ti troverai sull'ingresso A2, misurando la tensione di rete in quell'istante, e calcolando quindi il REALE rapporto del tuo adattatore. Personalmente avrei raddrizzato la sinusoide dell'adattattore con un ponte di diodi comunque in basso c'è il link alle ottime spiegazioni di funzionamento dei due circuiti. Riguardo il sensore di corrente, in quel circuito è previsto un 100A, che fornisce in uscita 50mA; i componenti a valle servono per trasformare la corrente in tensione ed anche qui vale il discorso di prima, occorre fare qualche misura e adattare il software; in base a cosa pensi di misurare devi prendere un sensore che abbia una corrente massima superiore ma senza eccedere, quello del link è un 30 A ma se in casa hai un contatore da 3 kW/h potrebbe andare benissimo un 20A, se poi prevedi un carico massimo di 10A va bene anche un sensore da 15A.

Ciao innanzitutto grazie per la risposta.

Io ho già a disposizione un sensore di corrente, che è esattamente quello proposto su openenergymonitor.org cioè un SCT013 100A-50mA e un alimentatore AC/AC 230V - 9V Modello Alca Power AP238 e in più, come ho detto, il circuito stampato a cui collegare i sensori e l'alimentatore per prendere corrente e tensione da inviare sui pin analogici di arduino. Credo che chi mi ha fornito questi componenti abbia preso tutte le informazioni proprio da quella pagina.

Grazie alla tua spiegazione ho compreso il ruolo dell'alimentatore AC/AC :D.

Per quanto riguarda la calibrazione della tensione: Diciamo che la tensione reale è 200V, quindi come hai detto, quella in arrivo su A2 sarà 0,78V. Ma il valore corretto lo ottengo utilizzando la libreria "EmonLib.h"? Nel senso nello sketch di test nel setup viene fatta la configurazione:

emon1.voltage(2, 234.26, 1.7); // Voltage: input pin, calibration, phase_shift

i valori che vengono restituiti sono:

float realPower = emon1.realPower; //extract Real Power into variable float apparentPower = emon1.apparentPower; //extract Apparent Power into variable float powerFActor = emon1.powerFactor; //extract Power Factor into Variable float supplyVoltage = emon1.Vrms; //extract Vrms into Variable float Irms = emon1.Irms;

Questi sono già corretti (se la configurazione è giusta) o devono essere ulteriormente manipolati? Cioè quel 0,78 di tensione è ciò che leggo dopo aver utilizzato le funzioni della libreria e da lì devo calcolarmi il rapporto reale? Oppure devo solo inserire i parametri giusti in emon1.voltage(...) ed emon1.current(...) ?

Comunque dovrei misurare i valori da un impianto fotovoltaico.

Tutti quei valori dipendono dai valori reali di tensione e corrente, probabilmente dovrai intervenire su quella riga del setup, ma non conosco la libreria. Non vorrei sbagliarmi ma nei risultati restituiti leggo Vrms mente normalmente la tensione si misura in Vpp. Come ti ho già detto l'autore propone delle formule che hanno soddisfatto i valori da lui ottenuti, diciamo che con sensore di corrente, essendo identico, probabilmente la differenza non ci sarà o sarà trascurabile, mentre l'adattatore è difficile stabilirlo. Tieni presente che io ho calcolato un valore ipotetico rispetto ad una tensione ipotetica, peraltro mi sa che per come lui raddrizza la tensione vada applicata una formula diversa dalla sola riduzione e successiva ripartizione. La cosa è semplice, realizza il circuito, carica il firmware così com'è, attrezzati con un multimetro digitale, misura la tensione di rete, applica un carico noto, possibilmente resistivo e poi vedi cosa ti restituisce il software, a quel punto puoi calcolare quei valori con le formule standard che trovi sulla rete dappertutto e li compari con i risultati ottenuti; se sono molto differenti interverrai sulle formule specifiche come da istruzioni. Io non conosco quella lib e non so dirti altro, parti da una prova concreta e già avrai delle indicazioni istantanee, postale qui e cercheremo di capire, se necessario, come agire.

Va bene, appena riesco posto i dati . Grazie mille :)

Sera.

Mi sono attrezzato con un misuratore di consumi (https://www.amazon.it/gp/product/B00N9GP840/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1). Ho collegato anche l'alimentatore AC/AC per misurare la tensione. Ho modificato questi parametri di setup dallo sketch di configurazione della libreria Emon, giungendo a questi valori:

emon1.voltage(A2, 245.71, 1.7);  // Voltage: input pin, calibration, phase_shift
 emon1.current(A0, 72.72);       // Current: input pin, calibration.

La formula che ho utilizzato è quella che consigliano loro su open energy monitor, cioé:

calibration = valoreReale/valoreLetto * calibration (cioè il valore precedente di calibration).

Sia per tensione, che per corrente ho utilizzato la stessa formula.

Per le prove ho utilizzato una piccola stufetta da 400w.

I valori sono rispettivamente:

real power, apparent power, Vrms, Irms, power factor

Con la stufa accesa rilevo questi valori:

382.67 388.00 233.19 1.66 0.99 
384.06 389.40 234.05 1.66 0.99 
380.23 386.40 233.03 1.66 0.98 
383.18 388.55 233.94 1.66 0.99 
379.66 384.52 232.99 1.65 0.99 
380.88 387.32 233.98 1.66 0.98 
379.25 384.64 233.12 1.65 0.99 
383.16 388.23 233.87 1.66 0.99 
376.07 381.39 232.97 1.64 0.99 
381.62 387.88 233.84 1.66 0.98 
377.34 383.15 232.91 1.65 0.98 
380.02 385.34 233.78 1.65 0.99 
374.41 379.07 232.87 1.63 0.99 
379.27 384.45 233.87 1.64 0.99 
375.49 380.60 233.02 1.63 0.99 
377.36 382.72 234.02 1.64 0.99 
376.50 381.49 233.29 1.64 0.99 
378.13 383.83 233.98 1.64 0.99 
373.63 378.52 232.95 1.62 0.99 
377.82 383.41 233.99 1.64 0.99 
372.54 377.91 232.90 1.62 0.99 
375.67 380.88 233.96 1.63 0.99 
373.73 379.05 232.99 1.63 0.99 
377.22 383.24 233.82 1.64 0.98 
371.09 376.24 233.02 1.61 0.99 
376.33 381.72 233.67 1.63 0.99 
376.22 381.51 233.79 1.63 0.99 
376.27 381.96 233.70 1.63 0.99 
370.43 375.86 232.53 1.62 0.99 
371.06 377.50 233.64 1.62 0.98 
368.12 372.98 232.51 1.60 0.99 
371.61 377.69 234.32 1.61 0.98 
370.54 375.71 232.06 1.62 0.99 
373.29 378.58 233.01 1.62 0.99 
371.99 377.11 233.31 1.62 0.99

Quando la spengo e alla pinza non faccio leggere nulla, mi restituisce questo:

-77.29 89.40 234.90 0.38 -0.86 
-76.88 89.90 233.94 0.38 -0.86 
-75.17 87.50 234.19 0.37 -0.86 
-75.56 88.62 234.30 0.38 -0.85 
-76.38 90.43 234.18 0.39 -0.84 
-75.14 86.55 233.47 0.37 -0.87 
-74.39 87.18 234.35 0.37 -0.85 
-73.86 85.99 233.31 0.37 -0.86 
-76.72 91.12 234.37 0.39 -0.84 
-76.11 88.77 233.39 0.38 -0.86 
-79.33 90.51 234.30 0.39 -0.88 
-75.75 88.01 233.34 0.38 -0.86 
-76.44 90.44 234.20 0.39 -0.85 
-74.26 87.50 233.51 0.37 -0.85 
-74.62 91.84 234.09 0.39 -0.81 
-74.71 86.74 233.33 0.37 -0.86 
-74.55 87.53 234.18 0.37 -0.85 
-72.86 87.35 233.27 0.37 -0.83 
-77.44 94.33 234.11 0.40 -0.82 
-72.38 84.82 233.14 0.36 -0.85 
-77.27 90.43 234.63 0.39 -0.85 
-72.56 85.48 234.88 0.36 -0.85 
-73.21 88.93 234.81 0.38 -0.82 
-78.19 91.30 233.89 0.39 -0.86 
-77.57 92.06 234.90 0.39 -0.84 
-77.66 89.36 233.86 0.38 -0.87 
-76.68 92.82 235.70 0.39 -0.83 
-76.62 92.15 234.05 0.39 -0.83 
-75.48 88.63 231.74 0.38 -0.85 
-71.17 88.59 230.15 0.38 -0.80 
-78.60 91.20 231.13 0.39 -0.86 
-75.26 87.90 231.05 0.38 -0.86 
-73.36 86.44 231.15 0.37 -0.85 
-74.18 86.66 230.71 0.38 -0.86

Ci sono anche dei valori negativi :neutral_face:

Ok, ho cambiato scheda. Sono passato dal Mega (non originale) ad Arduino Uno (originale) e non ricevo più valori negativi. Senza carico oscillo tra -1 e +1. Mentre con i carichi i valori di tensione, corrente e real power sono più o meno gli stessi di quelli che leggo dal misuratore. Credo dovrò smanettare ancora un po' sui valori di calibrazione, però direi che sono a buon punto. :)

A sto punto penso di avere qualche problema sul Mega.

Comunque il mio dubbio adesso è sul valore "phase_shift", cioè sfasamento. L'ho lasciato a 1,7 così com'era impostato di default. Però non so se sia corretto e come agire su di esso.

Leggendo sul forum e anche altrove non mi pare ci sia una soluzione per il calcolo del phase shift (correggetemi se sbaglio).

Comunque dalla potenza istantanea volevo ricavare anche i kwatt/h.

Avevo pensato a qualcosa di simile:

#include "EmonLib.h"             // Include Emon Library
EnergyMonitor emon1;             // Create an instance

float watth;
float kwatth;
unsigned long previousMillis;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  emon1.voltage(2, 234.26, 1.7);  // Voltage: input pin, calibration, phase_shift
  emon1.current(1, 111.1);       // Current: input pin, calibration.
}

void loop() {
  // put your main code here, to run repeatedly:
  if(millis() - previousMillis > 2000){
    previousMillis = millis();
    emon1.calcVI(20,2000);         
    float realPower =  emon1.realPower; //Potenza istantanea
    
    watth += (realPower/1800); //sommo ogni "piccola" potenza 

    kwatth = watth/1000; // da watt a chilowatt

    Serial.println(kwatth);  
  }
}

Aggiorno la discussione:

Facendo ulteriori prove ho notato che i valori ricevuti sono sempre un po' ballerini. Inoltre il valore della corrente non è mai 0. Nel senso che, anche se il sensore non sta misurando nulla mi arriva sempre qualcosa. Tipo 0,03/0,04 ecc.

Per essere sicuro che non stia leggendo qualcosa devi allontanare il sensore dal cavo della corrente e vedere se ancora balla; poi esiste il noto problema della instabilità delle letture ADC su Arduino, quindi per vedere letture stabili il sistema usato più frequentemente è quello di fare una decina o più letture di seguito, sommare i valori e poi dividerli per il numero di letture effettuate, così ottieni una media; altra cosa che ti consiglio di fare è "bloccare" la lettura per un secondo con un delay(1000), così hai un refresh ogni secondo, cosa che non ti creerà alcun problema in termini pratici, ma renderà lo strumento più "guardabile".

[quote author=Michele Menniti link=msg=3158671 date=1488563595] Per essere sicuro che non stia leggendo qualcosa devi allontanare il sensore dal cavo della corrente e vedere se ancora balla; poi esiste il noto problema della instabilità delle letture ADC su Arduino, quindi per vedere letture stabili il sistema usato più frequentemente è quello di fare una decina o più letture di seguito, sommare i valori e poi dividerli per il numero di letture effettuate, così ottieni una media; altra cosa che ti consiglio di fare è "bloccare" la lettura per un secondo con un delay(1000), così hai un refresh ogni secondo, cosa che non ti creerà alcun problema in termini pratici, ma renderà lo strumento più "guardabile". [/quote]

emon1.calcVI(20,2000);

questa funzione qui, da quello che ho capito, fa proprio quello: in questo caso 20 misurazioni in 2 secondi.

Per quanto riguarda il delay, avevo pensato di utilizzare la funzione millis() per ripetere la lettura ogni tot. secondi. E' la stessa cosa, no?

Sì, in genere il millis è meglio del delay perché NON blocca le attività del microcontrollore, mentre la mia idea era proprio quello di fermare tutto e quindi anche la visualizzazione sul display, comunque fai un po' di prove. Non conosco il firmware e non so se quella funzione fa ciò che ti serve, al limite prova ad aumentare il numero di letture, ma se è così forse non ti serve nemmeno il delay() perché in questo caso dovrebbe mostrarti una lettura ogni due secondi.

Buonasera, so che è un argomento vecchio ma sto cercando di fare lo stesso progetto e volevo sapere se eravate riusciti a capire come si calibra la phase, se l'1.7 deve essere cambiato o meno. grazie Giorgio