#include <liquidcrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);//ASSEGNAZIONE PIN LCD
const int BACKLIGH_PIN = 10;
const int ProdottaPin = A11;
const int AssorbitaPin = A12;
const int TensionePin = A13;
const int TempoCampionatura = 40; //Scegli i ms da Campionare
const float Fattore_Conversione_Potenza = .11; //Fattore di conversione Potenze
const float Fattore_Conversione_Corrente = .055;
const float Fattore_Conversione_Tensione = 1.6;
long start ;
int i ;
long PotenzaPro;
long PotenzaAss;
float PotenzaAss_Float;
float AmperPro;
float AmperAss;
long OffsetPro;
long OffsetAss;
long OffsetTens;
int Tensionemin=1023;
int Tensionemax=0;
void setup() {
//lcd.begin(16, 2);
Serial.begin(9600) ;
pinMode(BACKLIGH_PIN, OUTPUT);
digitalWrite(BACKLIGH_PIN, HIGH);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PowerMeter"

;
lcd.setCursor(0,1);
lcd.print("Enhanced"

;
delay(2000);
//CALCOLO AUTOMATICO OFFSET SENSORI
for (i = 0 ; i <= 1000 ; i++){
OffsetPro+=analogRead(ProdottaPin);
OffsetAss+=analogRead(AssorbitaPin);
int Tensioneinst =analogRead(TensionePin);
if (Tensionemax<tensioneinst)Tensionemax=Tensioneinst;
if (Tensionemin>Tensioneinst)Tensionemin=Tensioneinst;
}
OffsetPro/=1000;
OffsetAss/=1000;
OffsetTens=(Tensionemax+Tensionemin)/2;
//--------------------------------
ADCSRA&=0X90+ 0b100; //Setta ADC prescaler a 16 quindi la velocita delle conversioni

}
void loop() {
PotenzaPro=0;
PotenzaAss=0;
AmperPro=0;
AmperAss=0;
int NumCampionamenti=0;
int Tensionepicco=0;
start = millis() ;
do
{
NumCampionamenti++;
int Tensioneinst = abs(analogRead(TensionePin)-OffsetTens);
int Prodottainst = abs(analogRead(ProdottaPin)-OffsetPro);
int Assorbitainst = abs(analogRead(AssorbitaPin)-OffsetAss);
PotenzaPro += Tensioneinst*Prodottainst;
PotenzaAss += Tensioneinst*Assorbitainst;
AmperPro+=Prodottainst;
AmperAss+=Assorbitainst;
if (Tensionepicco<tensioneinst)Tensionepicco=Tensioneinst;
}while((millis()-start)<tempocampionatura);
int Tempomisura=millis() - start;
PotenzaPro=(PotenzaPro/NumCampionamenti)*Fattore_Conversione_Potenza;
PotenzaAss_Float=(PotenzaAss/NumCampionamenti)*Fattore_Conversione_Potenza;//Calcolo Potenza Somma medie V*I in Float
PotenzaAss=(PotenzaAss/NumCampionamenti)*Fattore_Conversione_Potenza;
AmperPro=(AmperPro/NumCampionamenti)*Fattore_Conversione_Corrente;
AmperAss=(AmperAss/NumCampionamenti)*Fattore_Conversione_Corrente;
int TensioneRMS=Tensionepicco*Fattore_Conversione_Tensione;
float TensioneRMS_Float=Tensionepicco*Fattore_Conversione_Tensione;//Calcolo Tensione in Float
int PotenzaProCalc=TensioneRMS*AmperPro;
int PotenzaAssCalc=TensioneRMS*AmperAss;
float PotenzaAssCalc_Float=TensioneRMS_Float*AmperAss;//Calcolo Potenza Vm*Im in Float
//Visualizza risultati su PC
if (Tensionemax>23 && Tensionemin<1000)
Serial.println ("Misurazioni Attendibili"

;
else
Serial.println ("ERROR"

;
Serial.print ("Numero Campionamenti = "

;
Serial.println(NumCampionamenti);
Serial.print ("Tempo conversione = "

;
Serial.print(Tempomisura) ;
Serial.println(" ms"

;
Serial.print ("ADCSRA = "

;
Serial.println(ADCSRA) ;
Serial.print ("Tensione RMS = "

;
Serial.print(TensioneRMS) ;
Serial.println(" Volt"

;
Serial.print ("Valore Sensore Tensione Max = "

;
Serial.println(Tensionemax) ;
Serial.print ("Valore Sensore Tensione Min = "

;
Serial.println(Tensionemin) ;
Serial.print ("Offset Sensore Tensione = "

;
Serial.println(OffsetTens) ;
Serial.print ("Offset Sensore Produzione = "

;
Serial.println(OffsetPro) ;
Serial.print ("Offset Sensore Assorbimento = "

;
Serial.println(OffsetAss) ;
Serial.print ("Potenza Prodotta = "

;
Serial.print(PotenzaPro) ;
Serial.println(" Watt"

;
Serial.print ("Potenza Prodotta Calcolata= "

;
Serial.print(PotenzaProCalc) ;
Serial.println(" Watt"

;
Serial.print ("Potenza Assorbita = "

;
Serial.print(PotenzaAss) ;
Serial.println(" Watt"

;
Serial.print ("Potenza Assorbita Calcolata = "

;
Serial.print(PotenzaAssCalc) ;
Serial.println(" Watt"

;
Serial.print ("Corrente Prodotta = "

;
Serial.print(AmperPro) ;
Serial.println(" Amper"

;
Serial.print ("Corrente Assorbita = "

;
Serial.print(AmperAss) ;
Serial.println(" Amper"

;
Serial.println(""

;
Serial.println(""

;
//Visualizza risultati su LCD
lcd.setCursor(0, 0);
lcd.print("V*I="

;
lcd.print(PotenzaAssCalc);
lcd.print("W "

;
lcd.setCursor(10, 0);
lcd.print(PotenzaAssCalc_Float,1);
lcd.print("W "

;
lcd.setCursor(0,1);
lcd.print("Spr="

;
lcd.print(PotenzaAss);
lcd.print("W "

;
lcd.setCursor(10, 1);
lcd.print(PotenzaAss_Float,1);
lcd.print("W "

;
//delay(1000);
}