strumento multifunzione, miglioramento sketch

si tratta di uno strumento multifunzione per camper/barca, perfettamente funzionante, misura volt volt Max volt Min ampere in carica ampere in scarica ampere Max in carica ampere Max in scarica amperora in carica amperora in scarica amperora in bilancio wattore in carica wattore in scarica wattore in bilancio percentuale stato batteria

non credo esista un aggeggio del genere almeno low cost, iniziato per gioco e postato su un sito mi chiedono di costruirlo in serie ma non ho tempo e voglia :)

chiedo se mi date una mano a modificare lo sketch da giocattolo a "professionale" se invece va bene cosi ok. è frutto di vostri consigli anche non chiesti direttamente. grazie

lo sketch { troppo lungo

//schema

// due fili alla batteria servizi // 3 fili ad Allegro ACS758 50A bipolare // lcd 20*4

parte 1

#include <LiquidCrystal.h>
#include <swRTC.h>
swRTC rtc; 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
float ingressoVolt;                   
float ingressoAmpere;                   

int rele = 8;
int buzzer = 9;
int ledRosso =13;
float volt;            
float voltMax;                     //volt max (hold)
float voltMin = 1023;              //volt min (hold)

float ampere;       
float ampereMax = 1023;            //ampere consumo max (hold)

float ampereBil;                   //ampere in bilancio tra caricati e scaricati
float ampereKa;                    // aampre caricando
float ampereKaMax;                 //ampere caricando max (hold)

int watt; 
int wattKa;                        //watt caricando
int carica;                        // per percentuale stato carica batteria
unsigned long msec =0;             // per wattOre, amperOre in carica, consumo e in bilancio
unsigned long millisec;
unsigned long secondi;
unsigned long ore;
unsigned long minuti; 

float millivolt; 
float tempo;
int avanzare;
float caricaTot ;
float caricaTotKa;
float caricaTotBil;
float ampMedio;
float ampMedioKa;
float ampMedioBil; 
float ampOre; 
float ampOreKa; 
float ampOreBil;  
int wattOre;  
int wattOreKa; 
int wattOreBil;  

int tastoTaci;                     // tacitazione allarme
int puls;                          // pulsante sequenze lcd

int cambia =0;                     // cambio di stato
int state = 0;                     // cambio di stato
int ciao = 0;                      // cambio di stato
int miao = 0;                      // cambio di stato
int ziao = 0;                      // cambio di stato
int piao = 0;                      // cambio di stato

void setup() {

  lcd.begin(20, 4);  
  Serial.begin (9600);

  rtc.stopRTC();                   
  rtc.setTime(00, 00, 00);
  rtc.startRTC();
  pinMode(13, OUTPUT);
  pinMode(10, INPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  lcd.clear();
}
void loop() {

  lcd.setCursor(0, 0);                             //cursore vai al primo carattere della prima rica
  lcd.print("D ");
  lcd.print(rtc.getDay(), DEC);                    // fammi vedere i giorni
  lcd.setCursor(5, 0);
  lcd.print("H ");
  lcd.print(rtc.getHours(), DEC);                  // fammi vedere le ore
  lcd.print(":");
  lcd.print(rtc.getMinutes(), DEC);                // fammi vedere i minuti
  lcd.print(":");
  lcd.print(rtc.getSeconds(), DEC);                // fammi vedere i secondi
  lcd.print(" ");

  ingressoVolt = analogRead (A3);                   //collego batteria servizi
  delay(50);
  volt = ingressoVolt*(20.1 / 1023.0);              //calcolo del partitore di tensione, 20V in,  5V out
  delay(50);                                        // consiglio 4 resistenze identiche tra loro, meglio da 10Kohm,
  // 3 in parallelo tra il meno e pin arduino, 1 tra segnale e pin arduino

  ingressoAmpere = analogRead (A2);                 //collego sensore mpere ACS 758
  millivolt = ingressoAmpere * (5000.0  / 1023.0);  //calcoli per Allegro ACS 758 50A bi   
  millivolt = millivolt - 2500 ;                    //calcoli per Allegro ACS 758 50A bi
  delay(50);                                        //calcoli per Allegro ACS 758 50A bi
  ampere = millivolt/40;                            //calcoli per Allegro ACS 758 50A bi
  if (ampere > 0){                                    // solo negativi, consumando
    ampere=0;
  }
  delay(50);

  watt = volt * ampere;                            // calcolo dei watt consumando
  delay(50);

  avanzare = avanzare + 1;                         // calcolo per i wattOra, amperOra consumate
  millisec = millis();                             // calcolo per i wattOra, amperOra consumate
  tempo = millisec/1000.0/3600.0 ;                 // calcolo per i wattOra, amperOra consumate
  caricaTot = caricaTot + ampere;                  // calcolo per i wattOra, amperOra consumate
  ampMedio = caricaTot / avanzare;                 // calcolo per i wattOra, amperOra consumate
  ampOre = ampMedio*tempo  ;                       // calcolo per  amperOra consumate  
  delay(50); 
  wattOre = volt * ampOre;                         //wattOre consumate
  delay(50);
  carica =  ingressoVolt/(1023.0/20.0/100.0) -1180;    //calcolo percentuale carica batteria, 11,80v == 0%,, 12,80v == 100%
  carica = constrain (carica, 0, 100);                 //calcolo percentuale carica batteria, 11,80v == 0%,, 12,80v == 100%
  delay(50);
  ampereKa = millivolt/40;                             //calcoli per Allegro ACS 758 50A bi
  if (ampereKa < 0){                                     // solo positivi, caricando
    ampereKa=0;
  }
  delay(50);
  wattKa = volt * ampereKa;                           //watt caricando
  delay(50);
  caricaTotKa = caricaTotKa + ampereKa;              // calcolo per i wattOra, amperOra caricate
  ampMedioKa = caricaTotKa / avanzare;               // calcolo per i wattOra, amperOra caricate
  ampOreKa = ampMedioKa*tempo  ;                     // calcolo per  amperOra caricate
  delay(50);
  wattOreKa = volt * ampOreKa;                       // wattOra caricate
  delay(50);
  ampereBil = millivolt/40;                          // calcolo per i wattOra, amperOra in bilancio
  delay(50);
  caricaTotBil = caricaTotBil + ampereBil;           // calcolo per i wattOra, amperOra in bilancio
  ampMedioBil = caricaTotBil / avanzare;             // calcolo per i wattOra, amperOra in bilancio
  ampOreBil = ampMedioBil*tempo  ;                   // calcolo per  amperOra in bilancio
  wattOreBil = volt * ampOreBil;                     // watt in bilancio
  delay(50);

  voltMax = max(volt, voltMax);                      // per far restare inpresso i volt max raggiunti
  voltMin = min(volt, voltMin);                      // per far restare inpresso i volt min raggiunti
  ampereMax = min(ampere, ampereMax);                // per far restare inpresso gli ampere min raggiunti in consumo
  ampereKaMax = max(ampereKa, ampereKaMax);          // per far restare inpresso gli ampere max raggiunti in carica

parte 2

  lcd.setCursor(15, 0);
  lcd.print("% ");                         
  lcd.print(carica);                               
  lcd.print(" ");
 
  tastoTaci = digitalRead (10);
  if ((volt <11.80)and(tastoTaci ==LOW)and(cambia == 0)) {
    digitalWrite(ledRosso,HIGH);                              // segnalazione allarme batt scarica
    analogWrite (buzzer, 1000);                               // allarme
    digitalWrite (rele,HIGH);                                 // rele fai qualcosa
    cambia=1;
  }
  else if ((volt <11.80)&& (tastoTaci ==HIGH)&&(cambia==1)){
    digitalWrite(ledRosso,LOW);
    analogWrite (buzzer, LOW);
    digitalWrite (rele,LOW);
    cambia=1;
  }
  if (volt > 11.80){
    digitalWrite(ledRosso,LOW);
    analogWrite (buzzer, LOW);
    digitalWrite (rele,LOW);
    cambia=0;
  }
    puls = digitalRead(6);                              // faccio pigiare il pulsante alla ragazza di turno 
  if ((puls==HIGH )&& (state==0)){
    lcd.setCursor(0, 1);
    lcd.print("Ti Amo              ");

    lcd.setCursor(0, 2);
    lcd.print("che fai             ");

    lcd.setCursor(0, 3);
    lcd.print("stasera ?           ");

    state=1;
    ziao=0;
  }
  if ((puls==LOW )&& (state==1)) {                     // rilascia il pulsante

    lcd.setCursor(0, 1); 
    lcd.print("Volt BS      ");
    lcd.print(volt,2);                   
    lcd.print(" ");                       

    lcd.setCursor(0, 2);
    lcd.print("Volt Max     ");                         
    lcd.print(voltMax);                               
    lcd.print("  ");

    lcd.setCursor(0, 3);
    lcd.print("Volt Min     ");                          
    lcd.print(voltMin);                             
    lcd.print("  ");                                  

    ciao=1;
  }
 if ((puls==HIGH )&& (ciao==1)){                     //faccio rischiacciare il pulsante alla ragazza di turno 
    lcd.setCursor(0, 1);
    lcd.print("Ti Amo              ");

    lcd.setCursor(0, 2);
    lcd.print("che fai             ");

    lcd.setCursor(0, 3);
    lcd.print("stasera ?           "); 

    state=3;
    ciao=2; 
  }
 if ((puls==LOW )&& (ciao==2)) {                     // rilascia il pulsante

    lcd.setCursor(0, 1);
    lcd.print("A Konsumo    ");                          
    if (ampere>=0){
      lcd.setCursor(14, 1);
    }  
    lcd.print(ampere,1);                             
    lcd.print("  ");

    lcd.setCursor(0, 2);
    lcd.print("A KonsumoMax ");                          

    lcd.print(ampereMax,1);                             
    lcd.print("  ");

    lcd.setCursor(0, 3);
    lcd.print("W konsumo    ");                         
    lcd.setCursor(13, 3);
    if (ampere >= 0){
      lcd.setCursor(14, 3);
    }
    lcd.print(watt);                                 
    lcd.print("   ");

    state=3;
    miao=1;
  }
 
  if ((puls==HIGH )&& (miao==1)) {                     //magari non ha capito  

    lcd.setCursor(0, 1);
    lcd.print("Ti Amo              ");

    lcd.setCursor(0, 2);
    lcd.print("che fai             ");

    lcd.setCursor(0, 3);
    lcd.print("stasera ?           ");

    state=3; 
    ciao=3;
    miao=2;
  }
 
  if ((puls==LOW )&& (miao==2)) {

    lcd.setCursor(0, 1);
    lcd.print("A Karika      ");
    lcd.setCursor(13, 1);
    lcd.print("+");
    lcd.print(ampereKa,1);                            
    lcd.print("  ");                      

    lcd.setCursor(0, 2);
    lcd.print("W Karika      ");                         
    lcd.setCursor(13, 2);
    lcd.print("+");
    lcd.print(wattKa);                                  
    lcd.print("   ");

    lcd.setCursor(0, 3);
    lcd.print("A KarikaMax  ");
    lcd.setCursor(13, 3);
    lcd.print("+");
    lcd.print(ampereKaMax,1);                            
    lcd.print("  "); 

    state=3; 
    ciao=3;
    ziao=1;
  }
 
  if ((puls==HIGH )&& (ziao==1)) {                      //magari non ha capito

    lcd.setCursor(0, 1);
    lcd.print("Ti Amo              ");

    lcd.setCursor(0, 2);
    lcd.print("che fai             ");

    lcd.setCursor(0, 3);
    lcd.print("stasera ?           ");

    state=3; 
    ciao=3;
    miao=3;
    ziao=2;
  }
 
  if ((puls==LOW )&& (ziao==2)) {

    lcd.setCursor(0, 1);
    lcd.print("Ah konsumo    ");
    lcd.setCursor(13, 1);
    if (ampOre >= 0){
      lcd.setCursor(14, 1);
    }
    lcd.print(ampOre,1);
    lcd.print("   ");
                           
    lcd.setCursor(0, 2);
    lcd.print("Ah Karika     ");
    lcd.setCursor(13, 2);
    lcd.print("+");
    lcd.print(ampOreKa,1);
    lcd.print("  ");
 
    lcd.setCursor(0, 3);
    lcd.print("Ah Bilancio   ");

    if (ampOreBil > 0){
      lcd.setCursor(13, 3);
      lcd.print("+");
    }
    lcd.setCursor(14, 3);
    if (ampOreBil < 0){
      lcd.setCursor(13, 3);
    }
    lcd.print(ampOreBil,1); 
    lcd.print("  ");

    state=3; 
    ciao=3;
    miao=3;
    piao=1;
  }
 
  if ((puls==HIGH )&& (piao==1)) {

    lcd.setCursor(0, 1);
    lcd.print("Ti Amo              ");

  
    lcd.setCursor(0, 2);
    lcd.print("che fai             ");

 
    lcd.setCursor(0, 3);
    lcd.print("stasera ?           ");
    state=3;
    ciao=3;
    miao=3;
    ziao=3;
    piao=2;
  }
 
  if ((puls==LOW )&& (piao==2)) {

    lcd.setCursor(0, 1);
    lcd.print("Wh konsumo     ");
    lcd.setCursor(13, 1);
    if (wattOre >= 0){
      lcd.setCursor(14, 1);
    }
    lcd.print(wattOre);
    lcd.print("    ");
  
    lcd.setCursor(0, 2);
    lcd.print("Wh Karika      ");
    lcd.setCursor(13, 2);
    lcd.print("+");
    lcd.print(wattOreKa);
    lcd.print("   ");
 
    lcd.setCursor(0, 3);
    lcd.print("Wh Bilancio  ");

    if (wattOreBil > 0){
      lcd.setCursor(13, 3);
      lcd.print("+");
    }
    lcd.setCursor(14, 3);
    if (wattOreBil < 0){
      lcd.setCursor(13, 3);
    }
    lcd.print(wattOreBil); 
    lcd.print("  ");

    state=0; 
    ciao=3;
    miao=3;
    ziao=3;
    piao=3;
  }
}

questa riga mi lascia perplesso:

if (ampere > 0){                                    // solo negativi, consumando
    ampere=0;
  }

caricaTot = caricaTot + ampere;  visto che non consideri lo scarico il carico sará sempre un valore alto e non corrisponde al valore reale.

Non ha senso prendere come tempo di ciclo quello casuale del loop per fare i calcoli delle somme.

La carica di un accumulatore al piombo non é lineare con la sua tensione tra 11,8 e 12,8V. La tensione massima di carica dovrebbe essere 13,8V, ma dipende dal caricabatteria o dal alternatore.

Fare la somma di un valore a un float é causa di errore. Visto che il float ha solo da 6 a 7 cifre significanti a un valore abbatanza alto che la somma é sempre uguale al valore precedente.

smetto a analzzare il Sketch senza la pretesa di voler aver fatto un lavoro completo.

Ciao Uwe

Altra cosa. float nomevar = 1023; è uno spreco di risorse. Lì non ti serve un float perché stai assegnando alla var un intero. Mi viene poi da pensare che 1023 sia la lettura massima di un pin analogico. In questo caso è un ulteriore segnale che sbagli variabile perché analogRead restituisce dati interi. La cosa è confermata qui:

float ingressoVolt;
...
ingressoVolt = analogRead(A3);

Leggi un int e lo registri in un float. A parte sprecare il doppio di byte (2 byte per un int, 4 per un float), perdi anche in precisione. Se devi usare quel numero in un calcolo di float, basta fare il casting. Esempio:

int ingressoVolt = analogRead(A3);
millivolt = float(ingressoAmpere) * (5000.0  / 1023.0);

Inoltre per risparmiare RAM usa la funzione F() per le stringhe da stampare. Converti quindi tutto quello che è:

lcd.print("   ");

in

lcd.print(F("   "));

(PS: solo per stringhe, non vale per variabili. Vale a dire che non puoi fare lcd.print(F(var));)

Vedo poi un sacco di ripetizioni di codice (come quello che stampa il messaggino d'amore). I codici ripetitivi si mettono generalmente in una funzione e si richiamano all'occorrenza. In questo modo invece di avere magari 10 volte le stesse istruzioni scritte in 10 punti diversi, fai una funzione unica che richiami 10 volte.

PS. ho visto che hai usato la swRTC. Mi fa piacere :sweat_smile: Non so se hai visto ma nelle ultime versioni della lib c'è un esempio allegato che serve a stampare l'ora in formato 00:00:00, mettendo cioè lo "0" aggiuntivo nel caso il numero sia inferiore a 10. Magari ti può servire, lo adatti per la stampa sull'LCD di un orario più "professionale ;)

grazie per le indicazioni, modifico

per quando riguarda il float, che errore potrebbe dare? considerando che uso un numero solo dopo la virgola

leo72: PS. ho visto che hai usato la swRTC. Mi fa piacere :sweat_smile: Non so se hai visto ma nelle ultime versioni della lib c'è un esempio allegato che serve a stampare l'ora in formato 00:00:00, mettendo cioè lo "0" aggiuntivo nel caso il numero sia inferiore a 10. Magari ti può servire, lo adatti per la stampa sull'LCD di un orario più "professionale ;)

tra i vari che ho provato era quello che si adattava meglio, o meglio, quello piu intuitivo da usare :) appena posso provo l'esempio e poi ti dico

camperos:
grazie per le indicazioni, modifico

per quando riguarda il float, che errore potrebbe dare? considerando che uso un numero solo dopo la virgola

Concettualmente è errato.
analogRead restituisce un intero, perché salvarlo in un float? Salvalo in un intero (risparmi 2 byte di RAM) e poi usa questa variabile nei calcoli con gli altri float facendo il casting. I numeri in virgola mobile vengono arrotondati, potresti avere problemi di varia natura. Ti quoto cosa dice il Reference:

Floating point numbers are not exact, and may yield strange results when compared. For example 6.0 / 3.0 may not equal 2.0.

camperos: tra i vari che ho provato era quello che si adattava meglio, o meglio, quello piu intuitivo da usare :) appena posso provo l'esempio e poi ti dico

Cerco di fare le mie lib facili da usare, che cioè si adattino all'ambiente di Arduino, pensato per principianti. :sweat_smile:

sai che non ho capito la parte del float non preciso =( =( =( a parte la parte dei numeri interi e RAM che approfondisco dopo dopo, ho fatto un piccolo sketch con numeri a caso

float x = 10.577;
float y = 1.1022;
float z = 0;
void setup(){
Serial.begin (9600);
}

void loop() {
  
  z = x*y;
  Serial.println (z,7);
}

mi da lo stesso risultato della calcolatrice di Windows : 11,6579694 quindi sembra che float i calcoli li fa giusti, mi era venuto un colpo :sweat_smile:

Lascia perdere, approfondirai più in là. Tieni per buono: "ad ognuno il suo". Se devi salvare un intero, usa una variabile di tipo int. ;)

ok ma devo ancora levare dei float.

@uwefed

quando ho iniziato il progetto non ho previsto che mentre scaricavo potevo caricare, perchè per la carica ho sempre utilizzato solo l'alternatore del motore in viaggio e in viaggio non utilizzo nulla di apparecchiature che assorbono corrente.

quindi se mettiamo che stiamo scaricando, dal sensore avrò dati negativi, arrivo ad esempio a -27 Ah...parto con il camper, l'alternatore carica e se non faccio :

if (ampere > 0){                                    // solo negativi, consumando
    ampere=0;
  }

gli Ah consumati anzichè bloccarsi a -27, diventano -26,-25, -24, non so piu quello che effettivamente ho consumato. questo vale anche per la carica al contrario. gli Ah in bilancio non ha la parte di code citato

per quanto riguarda la carica della batteria che non è lineare, il mio strumento si limita a misurare quanta energia serve per caricare completamente la batteria, o solamente per misurare quanta energia le sto inserendo. chiedo scusa se sono poco chiaro :astonished:

modificato parzialmente (non ho ancora finito) con piu funzioni e meno float
e aggiunto un po di cose
arduino Mega

//schema

// due fili alla batteria servizi
// 3 fili ad Allegro ACS758 50A bipolare
// 6 sensori temperatura NTC, 6 resistenze
// 3 sensori pressione  MPX5010
// 4 pulsanti, 2 resistenze
// lcd 20*4
#include <math.h>
#include <LiquidCrystal.h>
#include <swRTC.h>
swRTC rtc; 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

float Termistore(int RawADC) {
  long Resistance;  
  float Temp;
  Resistance=((10240000/RawADC) - 10000);
  Temp = log(Resistance);
  Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp)); //resisteza termistori convertiti in volt
  Temp = Temp - 273.15; //convertiti in celsius...da kelvin
  return Temp;
}
float tempMot =15;  
float tempH2o =14;  
float tempEst =13; 
float tempGas =12; 
float tempBat =11; 
float tempPan =10;  

int chiare = 0;
int grigie1 =0;
int grigie2 =0;
int chiares = 0;
int grigies1 =0;
int grigies2 =0;

int ingressoVolt;                   
int ingressoAmpere;                   

int rele = 8;
int buzzer = 7;
int ledRosso =13;
float volt;            
float voltMax;                     //volt max (hold)
float voltMin = 1023;              //volt min (hold)

float ampere;       
float ampereMax = 1023;            //ampere consumo max (hold)

float ampereBil;                   //ampere in bilancio tra caricati e scaricati
float ampereKa;                    // aampre caricando
float ampereKaMax;                 //ampere caricando max (hold)

int watt; 
int wattKa;                        //watt caricando
int carica;                        // per percentuale stato carica batteria
unsigned long msec =0;             // per wattOre, amperOre in carica, consumo e in bilancio
unsigned long millisec;            //
unsigned long secondi;             //
unsigned long ore;                 //
unsigned long minuti;              //

float millivolt;                   //    
float tempo;                       //
int avanzare;                      //
float caricaTot ;                  //
float caricaTotKa ;                //
float caricaTotBil;                //
float ampMedio;                    //
float ampMedioKa;                  //
float ampMedioBil;                 //
float ampOre;                      //
float ampOreKa;                    //
float ampOreBil;                   //
int wattOre;                       //
int wattOreKa;                     //
int wattOreBil;                    //

int tastoTaci;                     // tacitazione allarme
int puls;                          // pulsante sequenze lcd

int cambia =0;                     // cambio di stato
int stat = 0;                     // cambio di stato
int ciao = 0;                      // cambio di stato
int miao = 0;                      // cambio di stato
int ziao = 0;                      // cambio di stato
int piao = 0;                      // cambio di stato
int liao =0;
int viao =0;

void setup() {
  lcd.begin(20, 4);  
  Serial.begin (9600);
  rtc.stopRTC();                   
  rtc.setTime(00, 00, 00);
  rtc.startRTC();
  pinMode(13, OUTPUT);
  pinMode(10, INPUT);
  pinMode(9, INPUT);
  pinMode(8, OUTPUT);
  pinMode(7, INPUT);

  lcd.clear();
}
void loop() {
  lcd.setCursor(0, 0);                             //cursore vai al primo carattere della prima rica
  lcd.print("D ");
  lcd.print(rtc.getDay(), DEC);                    // fammi vedere i giorni
  lcd.setCursor(5, 0);
  lcd.print("H ");
  lcd.print(rtc.getHours(), DEC);                  // fammi vedere le ore
  lcd.print(":");
  lcd.print(rtc.getMinutes(), DEC);                // fammi vedere i minuti
  lcd.print(":");
  lcd.print(rtc.getSeconds(), DEC);                // fammi vedere i secondi
  lcd.print(" ");

  batteria();
  temperature();
  liquidi();
  LCD();
}

//////////////////////////////////////////////ragazza///////////////////////////////////////////////////////////////
void ragazza(){
  lcd.setCursor(0, 1);
  lcd.print("Ti Amo              ");

  lcd.setCursor(0, 2);
  lcd.print("che fai             ");

  lcd.setCursor(0, 3);
  lcd.print("stasera ?           ");
}
///////////////////////////////////////////batteria////////////////////////////////////////////////////////////////////
void batteria(){


  ingressoVolt = analogRead (A3);                   //collego batteria servizi
  delay(50);
  volt = float (ingressoVolt)*(20.1 / 1023.0);              //calcolo del partitore di tensione, 20V in,  5V out
  delay(50);                                        // consiglio 4 resistenze identiche tra loro, meglio da 10Kohm,
  // 3 in parallelo tra il meno e pin arduino, 1 tra segnale e pin arduino
  ingressoAmpere = analogRead (A2);                 //collego sensore mpere ACS 758
  millivolt = float (ingressoAmpere) * (5000.0  / 1023.0);  //calcoli per Allegro ACS 758 50A bi   
  millivolt = millivolt - 2500 ;                    //calcoli per Allegro ACS 758 50A bi
  delay(50);                                        //calcoli per Allegro ACS 758 50A bi
  ampere = millivolt/40;                            //calcoli per Allegro ACS 758 50A bi
  if (ampere > 0){                                    // solo negativi, consumando
    ampere=0;
  }
  delay(50);

  watt = volt * ampere;                            // calcolo dei watt consumando
  delay(50);

  avanzare = avanzare + 1;                         // calcolo per i wattOra, amperOra consumate
  millisec = millis();                             // calcolo per i wattOra, amperOra consumate
  tempo = millisec/1000.0/3600.0 ;                 // calcolo per i wattOra, amperOra consumate
  caricaTot = caricaTot + ampere;                  // calcolo per i wattOra, amperOra consumate
  ampMedio = caricaTot / avanzare;                 // calcolo per i wattOra, amperOra consumate
  ampOre = ampMedio*tempo  ;                       // calcolo per  amperOra consumate  
  delay(50); 
  wattOre = volt * ampOre;                         //wattOre consumate
  delay(50);
  carica =  ingressoVolt/(1023.0/20.0/100.0) -1180;    //calcolo percentuale carica batteria, 11,80v == 0%,, 12,80v == 100%
  carica = constrain (carica, 0, 100);                 //calcolo percentuale carica batteria, 11,80v == 0%,, 12,80v == 100%
  delay(50);
  ampereKa = millivolt/40;                             //calcoli per Allegro ACS 758 50A bi
  if (ampereKa < 0){                                     // solo positivi, caricando
    ampereKa=0;
  }
  delay(50);
  wattKa = volt * ampereKa;                           //watt caricando
  delay(50);
  caricaTotKa = caricaTotKa + ampereKa;              // calcolo per i wattOra, amperOra caricate
  ampMedioKa = caricaTotKa / avanzare;               // calcolo per i wattOra, amperOra caricate
  ampOreKa = ampMedioKa*tempo  ;                     // calcolo per  amperOra caricate
  delay(50);
  wattOreKa = volt * ampOreKa;                       // wattOra caricate
  delay(50);
  ampereBil = millivolt/40;                          // calcolo per i wattOra, amperOra in bilancio
  delay(50);
  caricaTotBil = caricaTotBil + ampereBil;           // calcolo per i wattOra, amperOra in bilancio
  ampMedioBil = caricaTotBil / avanzare;             // calcolo per i wattOra, amperOra in bilancio
  ampOreBil = ampMedioBil*tempo  ;                   // calcolo per  amperOra in bilancio
  wattOreBil = volt * ampOreBil;                     // watt in bilancio
  delay(50);

  voltMax = max(volt, voltMax);                      // per far restare impresso i volt max raggiunti
  voltMin = min(volt, voltMin);                      // per far restare impresso i volt min raggiunti

  ampereMax = min(ampere, ampereMax);                // per far restare impresso gli ampere min raggiunti in consumo

  ampereKaMax = max(ampereKa, ampereKaMax);          // per far restare impresso gli ampere max raggiunti in carica

}
//////////////////////////////////////////////////////////////////temperature///////////////////////////////////////////////////////////

void temperature() {
  tempMot=Termistore(analogRead(15));
  tempH2o=Termistore(analogRead(14));
  tempGas=Termistore(analogRead(13));
  tempBat=Termistore(analogRead(12));
  tempPan=Termistore(analogRead(11));
  tempEst=Termistore(analogRead(10));

}
/////////////////////////////////////////////////////////////////liquidi//////////////////////////////////////////////////////////////
void liquidi(){
  chiare=  analogRead (A0) ;
  chiares = map (chiare,37,210, 0,140);
  grigie1=  analogRead (A4) ;
  grigies1 = map (grigie1,37,210, 0,140);
  grigie2=  analogRead (A5) ;
  grigies2 = map (grigie2,37,210, 0,140);
}

////////////////////////////////////////////////////////////////LCD///////////////////////////////////////////////////////////////////


void LCD (){
  lcd.setCursor(15, 0);
  lcd.print("% ");

tralascio la parte restante LCD

edit: modificato ingressi analogici temperature