...CODICE CON TRE INGRESSI ...Mi servirà per mandare in pensione il vecchio powermeter .
Sarà configurato :
ingresso 1 = ingresso rete
ingresso 2 = piano inferiore
ingresso 3 = piano superiore
Avendo un impianto grid potrò calcolare la potenza prodotta dall'inverter ...energia acquistata ed energia venduta oltre alla ripartizione dei consumi

...mi piace
//Prodotto da ElettroshockNow (ElettroshockNow@gmail.com)
//Condiviso su http://www.EnergiAlternativa.org
//
//Eventuali condivisioni su altri canali/Forum devono specificare
//il forum di origine http://WWW.ENERGIALTERNATIVA.ORG e la licenza
//di seguito:
//
//CC BY-NC-SA 4.0
//Uso non commerciale, modificabile, con obbligo di condivisione-
//http://creativecommons.org/licenses/by-nc-sa/4.0/deed.it
//
//SETTAGGI UTENTE
const int OffsetPin= 0; //IMPOSTA PIN INGRESSO
const int TensionePin = 1;//IMPOSTA PIN INGRESSO
const int Corrente1Pin = 2;//IMPOSTA PIN INGRESSO
const int Corrente2Pin = 3;//IMPOSTA PIN INGRESSO
const int Corrente3Pin = 4;//IMPOSTA PIN INGRESSO
const float Fattore_Conversione_Tensione=0.272;//INSERIRE VALORI DI CALIBRAZIONE
const float Fattore_Conversione_Corrente=0.02502;//INSERIRE VALORI DI CALIBRAZIONE
//FINE SETTAGGI UTENTE
float Tensioneinst,Corrente1inst,Corrente2inst,Corrente3inst,ADC_Tensione,ADC_Corrente1,ADC_Corrente2,ADC_Corrente3,ADC_Offset,TensioneRMS,Corrente1RMS,Corrente2RMS,Corrente3RMS,Energia1Prodotta,Energia1Consumata,Energia1Totale,Energia2Prodotta,Energia2Consumata,Energia2Totale,Energia3Prodotta,Energia3Consumata,Energia3Totale,Frequenza;
long last_refresh,Sine_stop,last_E;
void setup() {
Serial.begin(115200);
}
void loop() {
float SommaV=0,SommaI1=0,SommaI2=0,SommaI3=0;
long SommaP1=0,SommaP2=0,SommaP3=0,Sine_Tstart;
int NumCampionamenti=0,Sine_start=0,FreqReady=0;
Sine_stop = (millis()+100) ;//campiona 5 periodi
while (millis() < Sine_stop){
NumCampionamenti++;
ADC_Tensione=((ADC_Tensione*19)+analogRead(TensionePin))/20;//lettura con media
ADC_Corrente1=((ADC_Corrente1*19)+analogRead(Corrente1Pin))/20;
ADC_Corrente2=((ADC_Corrente2*19)+analogRead(Corrente2Pin))/20;
ADC_Corrente3=((ADC_Corrente3*19)+analogRead(Corrente3Pin))/20;
ADC_Offset=((ADC_Offset*19)+analogRead(OffsetPin))/20;
if((ADC_Tensione-ADC_Offset)<-300)FreqReady=1;//Arma il trigger
if((ADC_Tensione-ADC_Offset)>300&FreqReady){//memorizza inizio e fine periodi
FreqReady=0;
if (Sine_start==0)Sine_Tstart=micros();
if (Sine_start==4)Frequenza=4000000/float((micros()-Sine_Tstart));//calcola frequenza su 4 periodi
Sine_start++;
}
Tensioneinst = int(ADC_Tensione-ADC_Offset)*Fattore_Conversione_Tensione;//eliminazione errore
Corrente1inst = int(ADC_Corrente1-ADC_Offset)*Fattore_Conversione_Corrente;
Corrente2inst = int(ADC_Corrente2-ADC_Offset)*Fattore_Conversione_Corrente;
Corrente3inst = int(ADC_Corrente3-ADC_Offset)*Fattore_Conversione_Corrente;
SommaV += pow(Tensioneinst,2);
SommaI1 += pow(Corrente1inst,2);
SommaI2 += pow(Corrente2inst,2);
SommaI3 += pow(Corrente3inst,2);
SommaP1 += (Tensioneinst*Corrente1inst);
SommaP2 += (Tensioneinst*Corrente2inst);
SommaP3 += (Tensioneinst*Corrente3inst);
}
TensioneRMS = ((TensioneRMS*19)+sqrt(SommaV / NumCampionamenti))/20; //media ultimi 20 valori
Corrente1RMS = ((Corrente1RMS*19)+sqrt(SommaI1 / NumCampionamenti))/20; //media ultimi 20 valori
Corrente2RMS = ((Corrente2RMS*19)+sqrt(SommaI2 / NumCampionamenti))/20; //media ultimi 20 valori
Corrente3RMS = ((Corrente3RMS*19)+sqrt(SommaI3 / NumCampionamenti))/20; //media ultimi 20 valori
int PotenzaAttiva1 = SommaP1/ NumCampionamenti;
float Energia1=float(PotenzaAttiva1)*(micros()-last_E)/1000000/3600/1000; //CALCOLA DELTA ENERGIA
Energia1Totale+= Energia1;
int PotenzaApparente1 = TensioneRMS * Corrente1RMS;
if(PotenzaAttiva1<0){
PotenzaApparente1=-PotenzaApparente1;
Energia1Consumata+=Energia1;
}
else Energia1Prodotta+=Energia1;
int PotenzaAttiva2 = SommaP2/ NumCampionamenti;
float Energia2=float(PotenzaAttiva2)*(micros()-last_E)/1000000/3600/1000;
Energia2Totale+= Energia2;
int PotenzaApparente2 = TensioneRMS * Corrente2RMS;
if(PotenzaAttiva2<0){
PotenzaApparente2=-PotenzaApparente2;
Energia2Consumata+=Energia2;
}
else Energia2Prodotta+=Energia2;
int PotenzaAttiva3 = SommaP3/ NumCampionamenti;
float Energia3=float(PotenzaAttiva3)*(micros()-last_E)/1000000/3600/1000;
Energia3Totale+= Energia3;
int PotenzaApparente3 = TensioneRMS * Corrente3RMS;
if(PotenzaAttiva3<0){
PotenzaApparente3=-PotenzaApparente3;
Energia3Consumata+=Energia3;
}
else Energia3Prodotta+=Energia3;
last_E=micros();
float FattorediPotenza1 = float(PotenzaAttiva1)/float(PotenzaApparente1);
if(FattorediPotenza1>1)FattorediPotenza1=1;
float FattorediPotenza2 = float(PotenzaAttiva2)/float(PotenzaApparente2);
if(FattorediPotenza2>1)FattorediPotenza2=1;
float FattorediPotenza3 = float(PotenzaAttiva3)/float(PotenzaApparente3);
if(FattorediPotenza3>1)FattorediPotenza3=1;
if(millis()>(last_refresh+500)){//REFRESH DISPLAY OGNI X Ms
last_refresh=millis();
Serial.println("***EnergyMeter STM32 EnergiAlternativa.org***");
//Serial.print("NumCampionamenti= ");
//Serial.println(NumCampionamenti);
Serial.print("Frequenza Campionamento= ");
Serial.print(NumCampionamenti*10);
Serial.println(" Hz");
/*
Serial.print("ADC_Tensione=");
Serial.println(ADC_Tensione);
Serial.print("ADC_Corrente=");
Serial.println(ADC_Corrente);
Serial.print("ADC_Offset=");
Serial.println(ADC_Offset);
*/
Serial.print("TensioneRMS= ");
Serial.print(TensioneRMS,1);
Serial.println(" V");
Serial.print("Frequenza= ");
Serial.print(Frequenza,1);
Serial.println(" Hz");
Serial.println("***INGRESSO-1***");
Serial.print("Corrente1RMS= ");
Serial.print(Corrente1RMS,2);
Serial.println(" A");
Serial.print("PotenzaAttiva1= ");
Serial.print(PotenzaAttiva1 );
Serial.println(" W");
Serial.print("PotenzaApparente1= ");
Serial.print(PotenzaApparente1);
Serial.println(" VA");
Serial.print("FattorediPotenza1= ");
Serial.println(FattorediPotenza1 );
Serial.print("Energia1Consumata= ");
Serial.print(Energia1Consumata,4);
Serial.println(" Kwh");
Serial.print("Energia1Prodotta= ");
Serial.print(Energia1Prodotta,4);
Serial.println(" Kwh");
Serial.print("Energia1Totale= ");
Serial.print(Energia1Totale,4);
Serial.println(" Kwh");
Serial.println("***INGRESSO-2***");
Serial.print("Corrente2RMS= ");
Serial.print(Corrente2RMS,2);
Serial.println(" A");
Serial.print("PotenzaAttiva2= ");
Serial.print(PotenzaAttiva2 );
Serial.println(" W");
Serial.print("PotenzaApparente2= ");
Serial.print(PotenzaApparente2);
Serial.println(" VA");
Serial.print("FattorediPotenza2= ");
Serial.println(FattorediPotenza2 );
Serial.print("Energia2Consumata= ");
Serial.print(Energia2Consumata,4);
Serial.println(" Kwh");
Serial.print("Energia2Prodotta= ");
Serial.print(Energia2Prodotta,4);
Serial.println(" Kwh");
Serial.print("Energia2Totale= ");
Serial.print(Energia2Totale,4);
Serial.println(" Kwh");
Serial.println("***INGRESSO-3***");
Serial.print("Corrente3RMS= ");
Serial.print(Corrente3RMS,2);
Serial.println(" A");
Serial.print("PotenzaAttiva3= ");
Serial.print(PotenzaAttiva3 );
Serial.println(" W");
Serial.print("PotenzaApparente3= ");
Serial.print(PotenzaApparente3);
Serial.println(" VA");
Serial.print("FattorediPotenza3= ");
Serial.println(FattorediPotenza3 );
Serial.print("Energia3Consumata= ");
Serial.print(Energia3Consumata,4);
Serial.println(" Kwh");
Serial.print("Energia3Prodotta= ");
Serial.print(Energia3Prodotta,4);
Serial.println(" Kwh");
Serial.print("Energia3Totale= ");
Serial.print(Energia3Totale,4);
Serial.println(" Kwh");
Serial.println("-------------------");
}
}