Controllo e monitoraggio > Contacalore per PDC con Arduino e Raspberry


Come monitorare il COP di una PDC in modo semplice ed economico con Arduino e Raspberry.

Articolo in preparazione....

 

Vedere come si comporta la nostra pompa di calore in funzione della variazioni climatiche o di carico, puo essere un esercizio molto interessante che richide però la misura del calore prodotto dalla macchina oltre che il consumo di energia elettrica consumato della stessa,

Il COP è definito come il rapporto tra l'energia termica prodotta con l'energia elettrica consumata.. se viene considerata l'energia prodotta e consumata in un dato giorno, significa che stiamo misurando il cop di quel giorno.. se invece consideriamo il cop in una data ora, il COP misurato è quello orario.. e cosi via.. il COP misurato durante una intera stagione termica è detto anche SCOP ovveo cop stagionale,  ed è il dato più interessante soprattutto se si vuole comparare la PDC con un qualsiasi altro  sistema tradizionale di riscaldamento.

Il sistema di monitoraggio che suggeriamo in questo articolo misura la potenza termica prodotta e la potenza elettrica consumata, quindi il rapprto di queste 2 grandezze definisce il COP istantaneo della PDC... tali grandezze vengono lette e misurate da una schedina  Arduino Uno ed inviate via interfaccia seriale, al sistema di monitoraggio ( Emoncms ) installato su un Rapberry.

 

COME FUNZIONA 

Per realizzare un misuratore di COP abbiamo visto che occorre fare 2 misure di potenza;  termica prodotta ed  elettrica consumata..  

Per quanto riguarda la potenza termica essa è proporzionale al prodotto tra la differenza di temperatura subita da un fluido, con la sua quantita o portata e più precisamente,  se vogliamo esprimere tale potenza in Watt ( W ),  la formula è la seguente :

Pt = Q. *  Dt * 1.16

dove Dt è la differenza di temperatura tra il fluido in uscita con quello in ingresso e Q è la portata del fuido  espressa in Lt/min .Contatore acqua con uscita ad impulso

Il differenziale di temperatura lo misureremo tramite 2 sonde analogiche LM35 che andremo ad installare in pozzetti termometrici posti in uscita e ingresso della PDC; mentre la portata d'acqua la misureremo con un flussimetro volumetrico ad impulso.. cioè un misuratore di portata d'acqua che dispone di  un contatto elettrico che chiude ogni volta che è passata  una nota quatita d'acqua.

Conoscendo la quantita d'acqua per  impulso e misurando il tempo intercorso tra un impulso e il successivo, ecco che avremo realizzato un preciso misuratore di portata.

La misura della potenza elettrica verrà fatta in modo analogo alla portata,  grazie al fatto che andremo a contare gli impulsi di un comune contatore elettrico con uscia ad impulso..

  

Analizzando lo schema sottostante si puo vedere che i 2 ingressi di interrupt della schedina Arduino Uno ( IN 2 e IN 3 ) sono forzati a livello logico 1 tramite 2 resistenze da 22 K connesse al +5V ( pull up ),  con i contatti liberi dei 2 misuratori ad impulso che vanno a chiudere a massa realizzando un passaggio di stato da 1 a 0 ad ogni impulso rilevato.

Il software userà routine di interrupt cosi da realizzare un misura precisissima del tempo intercorso tra un impulso e il successivo e fornirà di conseguenza una misura precisa delle 2 variabili. (Portata dell'acqua e potenza elettrica )

Completano il circuito il link seriale tra la scheda Arduino Uno e il Raspberry, realizzato tramite un partitore resistivo che riduce la tensione dalla logica a 5 V di Arduino con quella a 3.3 del Raspberry e i 2 ingressi analogici A1 e A2 dove sono collegate le sonde analogiche di misura della temperatura.

Questo tipo di sonde produce una tensione in uscita  proporzionale alla temperatura misurata , più precisamente l'uscita varia di  10 millivolt per ogni grado centigrado e di conseguenza è facile misurare la temperatura facendo una conversione digitale della misura della tensione intestata sui rispettivi ingressi di Arduino. 

Oltre a questo e affinchè il tutto funzioni, dobbiamo disabilitare l’autoreset di Arduino. Questo può essere fatto collegando un condensatore da 1-10uF tra RESET e GND. Se non si fa questo la comunicazione seriale non funzionerà correttamente!

 

 

Contacalorie per pdc con Arduino e Raspberry

Il codice di Arduino.

Questo sotto è lo scratch di Arduino da compilare e uploadare su una scheda generica Arduino uno.. lo scratch si compone di un unico file e si puo inserire copiando il testo dalla riga //inizio scratch fino a // Fine scatch

 

// INIZIO SCRATCH

//VARIABILI INTERRUPT
 
volatile unsigned long delta_pulse=300001; // time pulse interval
volatile unsigned long old_pulse = 0;// start up value
volatile unsigned long last_pulse = 0;//
volatile unsigned long filter_pulse = 0;
 
volatile unsigned long delta_pulse2=600001; // time pulse interval
volatile unsigned long old_pulse2 = 0;// start up value
volatile unsigned long filter_pulse2 = 0;
 
// VARIABILI e costanti
 
#define calibrationFactorQ 10   // 10 = per misuratori di flusso da  10 Lt per impulso 
#define calibrationFactorW 3600000   // 3600000 = per contatori da 1 impulso og
float flowRate;  // variabile contenente il flusso espresso in Lt/Min
float Wpdcin; // Potenza assorbita dalla PDC in Watt
float Wpdcout; // Potenza termica prodotta dalla PDC in Watt
float TempRitorno; // variabile contenente temperatura di ritorno
float TempMandata; // variabile contenente temperatura di mandata.
 
 
void setup() {
// initialize serial:
Serial.begin(9600);
pinMode(2, INPUT); //misuratore  ad impulso di flusso 
pinMode(3, INPUT); //misuratore  ad impulso energia elettrica
attachInterrupt(0, pulse, FALLING); // interrupt pulse x portata acqua
attachInterrupt(1, pulse2, FALLING); // interrupt pulse x lampeggio contatore.
}
void loop() {
 
//LOOP MISURA TEMPERATURE
 
TempRitorno= analogRead(1);//lettura valore temperatura di ritorno
TempRitorno = analogRead(1);//lettura valore temperatura di mandata
TempRitorno = (5.0 * TempRitorno * 100.0)/1024.0; //conversione del dato analogico in temperatura
TempRitorno = TempRitorno + 0;
 
TempMandata = analogRead(2);//lettura valore temperatura di mandata
TempMandata = analogRead(2);//lettura valore temperatura di mandata
TempMandata = (5.0 * TempMandata * 100.0)/1024.0; //conversione del dato analogico in temperatura
TempMandata = TempMandata + 0;
 
 
// Conversione da misure del periodo eseguite tramite interrupt e valori di portata e potenza 
last_pulse = millis();
filter_pulse = last_pulse - old_pulse; // tempo trascorso dall'ultimo interrupt x portata acqua
 
if(filter_pulse > delta_pulse){ // integra in discesa.
delta_pulse = filter_pulse;
}
 
filter_pulse2 = last_pulse - old_pulse2; // tempo trascorso dall'ultimo interrupt x potenza fotovoltaica
 
if(filter_pulse2 > delta_pulse2){ // integra in discesa.
delta_pulse2 = filter_pulse2;
}
 
flowRate=(calibrationFactorQ)*(60000.00/(delta_pulse)); //per calcolare litri/minuto
Wpdcin = calibrationFactorW / delta_pulse2; // calcola potenza elettrica dall'impulso contatore. 
 
//filtra la misura azzerando valori minimi.
if((flowRate) < (4)){
flowRate = 0;
}
if((Wpdcin) < (7)){
Wpdcin= 0;
}

Wpdcout=((TempMandata-TempRitorno)*(flowRate*60)*1.16); //calcolo dei watt, valore intero espresso in watt

 
//****
 
// invia i dati via seriale 
 
Serial.print("#");
Serial.print(TempMandata);
Serial.print(";");
Serial.print(TempRitorno);
Serial.print(";");
Serial.print(flowRate);
Serial.print(";");
Serial.print(Wpdcin);
Serial.print(";");
Serial.println(Wpdcout);
 
delay (5000);      // pausa di 5 secondi nel ciclo.
 
 
}         // fine void
 
//#############LOOP INTERUPT###########
 
//Calcolo della portata acqua
void pulse() {
 
last_pulse = millis();
filter_pulse = last_pulse - old_pulse;
 
if (filter_pulse > 1000) {// ignore if receive impulses lower than 1 second..
 
delta_pulse = filter_pulse;
old_pulse = last_pulse;
 
 
}
}
 
 
//Calcolo della potenza fv tramite lampeggio
void pulse2() {
 
last_pulse = millis();
filter_pulse2 = last_pulse - old_pulse2;
 
if (filter_pulse2 > 500) {// ignore if receive impulses lower than 0.5 second..
 
delta_pulse2 = filter_pulse2;
old_pulse2 = last_pulse;
 
 
}
}
 
// FINE SCRATCH

 

Il codice di PHP.

 

Arduino uno ha il compito di rilevare le misure ed inviarle via seriale ad un computer Raspbery PI.. su quest'ultimo girerà un software scritto in php che ha il compito di legegre la seriale, spacchettare le variabili cosi come gli arrivano ed inviarle a sua volta ad una installazione di emocms per essere monitorate e memorizzate.

Prossimamente descriveremo il software in PHP ed andremo avanti con il progetto

 

Stay Tuned...