/* Edit 6-ago-2014.. Testato su Arduino Pro Mini.. http://energiaalternativa.forumcommunity.net/?t=54823501
Prodotto da calcola (antrec.geo@yahoo.com) (rettifiche by sabin)

Scopo: Controllo tensione per commutazione inverter (UPS) enel/batterie..
Due linee di alimentazione.
    - Prima, (Relay4), per PC, TV, caldaia, termosifoni.
    - Seconda, (Relay6), cor ritardo 4 minuti (relay5 per protezione motori), per frigoriferi, climatizzatore.
    Relay6. Connesso dopo relay4 quando tensione è max.
    Quando tensione min, prima scollega relay6, ultimo realy4.
   
Funzione baypass regolatore 30A.
    Relay9 comanda relè per baypassare regolatore da 30A perchè dopo raggiunto 26V riduce amperaggio.

Codice:
    Definizione variabili
    definizione pinMode
Loop. 15 letture tensione, (in 4.5+ secondi)
    ogni lettura controllo pulsante, se premuto, in sequenza attiva o disattiva passaggio prima linea a batteria, passaggio a batterie in 2 sec.
    A seguire se entro 2 sec. se viene premuto pulsante, seconda linea passa a batterie, se premuto 3a volta torna tutto a enel.
Calcola media 15 letture.
    Confronto con lettura precedente, ce trova un calo di 0,5 volt, salta lettura, e memorizza.
   
Verifica tensioni
     Clima passa a enel se tensione min.                                    Attiva pausa per 10 min. pc = 1; cc++ (conteggio clima)
    Inverter passa a enel se tensione torna a min . Spegne tutti i relè.     Attiva pausa per 10 min. pe = 1; ce++ (conteggio enel)
     Inverter passa a batterie se tensione e max.
    Clima passa a batterie se tensione torna max.
Baypass regolatore
    Se la tensione è tra 25 e 28.8 attiva baypass.
Serial print
    Stampa informazini su monitor seriale.
   
*/

// Definire margine di tensione
#define tensione_bassa 23.3 //valori tipo: 11.9 (sistema 12V); 23.9 (sistema 24V)
#define tensione_alta 27.5
#define tensione_clima 28

#define vrx 25 // reset VoltageReading a valore medio (per 24 volt)

#define numeroletture 15 // letture tensione

#define coefficiente_conversione 0.05900 // per alzare tensione letta, alzare numero..
// bat-24V>DC-DC 0.05850... con usb 0.05400 .. origine 0.05620

#define RELAY4 4 // enel - batterie
#define RELAY5 5 // pausa frigo (linea con relè temporizzato)
#define RELAY6 6 // linea frigoriferi
#define RELAY9 9 // baypass regolatore 30A
#define a0pin A0 // lettura volt
#define a1pin A1 // pulsante, passa a batterie

int total = 0; // Somma letture
int average = 0; // Media
int clima = 5; // salta conferma verifica
int posizione = 5; // controllo posizione, salta conferma
int pulsante = 0; // controllo pulsante, x passare a batterie
int time = 0; // conteggio per bypass regolatore
byte pc = 0; // pausa per clima
byte pe = 0; // pausa per enel
int cc = 0; // conteggio pausa clima
int ce = 0; // conteggio pausa enel
int pausa = 133; // 10 min.= 600 sec. / 4.5 = 133...

float vr2 = 0; // voltaggio precedente
float temp = 0;
float VoltageReading; // comprende i numeri reali, rappresentati in virgola mobile , 32 bit, 7 cifre




// Setup ----  Setup ----  Setup ----  Setup ----  Setup ----  Setup ---- 
void setup()
{
Serial.begin(9600);
pinMode(RELAY4, OUTPUT);
pinMode(RELAY5, OUTPUT);
pinMode(RELAY6, OUTPUT);
pinMode(RELAY9, OUTPUT);
pinMode(a0pin, INPUT);
pinMode(a1pin, INPUT);

digitalWrite(RELAY4, HIGH);
digitalWrite(RELAY5, HIGH);
digitalWrite(RELAY6, HIGH);
digitalWrite(RELAY9, HIGH);

}



//         Loop ------- Loop ------- Loop ------- Loop ------- Loop ------- Loop ------- Loop ------- Loop -------
void loop()
{
// digitalWrite(RELAY9, LOW); // controllo tempo con led baypass

total = 0;  // Azzera per il calcolo

// Letture tensione
for (int A = 0; A < numeroletture; A++)
{
total += analogRead(a0pin); //Legge la tensione su A0
delay(300); //ritardo in millisecondi. 300 x 15 letture = 4.500

// ---- Controllo pulsante per passaggio forzato
pulsante = analogRead(a1pin);

if (pulsante > 700)
{
if (posizione != 10 ) // passa a batterie
{
delay(1000);
digitalWrite(RELAY4, LOW);
delay(2000);
posizione = 10;
pulsante = 0;
for (int B = 0; B < 20; B++) // loop 2 secondi, se pulsante on, passa linea frigo a batterie
{delay(100); pulsante = analogRead(a1pin);
if (pulsante > 700) { digitalWrite(RELAY6, LOW); // relay attivo, pin 0V
clima = 10; }
}
}
} // batt fine

if (pulsante > 700)
{
if (posizione != 5 ) // passa a enel
{
digitalWrite(RELAY5, LOW);
delay(2000);
digitalWrite(RELAY5, HIGH);
digitalWrite(RELAY4, HIGH); posizione = 5;
digitalWrite(RELAY6, HIGH); clima = 5; // per sicurezza, nel caso fosse attivo
digitalWrite(RELAY9, HIGH);
delay(2000);
posizione = 5;
pulsante = 0;
}
} // enel fine

} //              lettura fine --- lettura fine --- lettura fine --- lettura fine --- lettura fine ---


 // ---- Calcola la media ---- Calcola la media
average = total / numeroletture;

VoltageReading=average*coefficiente_conversione;

if (VoltageReading < vr2 - 0.4) // salta un calo eccessivo
{ temp = VoltageReading;
VoltageReading = vr2; // correggi con voltaggio precedente
vr2 = temp; // memorizza calo
}
else { vr2 = VoltageReading; // altrimenti memorizza lettura
}


/*                       ---- Controllo tensione, enel/batterie ---- Controllo tensione, enel/batterie
La 220V sul contatto NC del relè 24V.
La bobina del relè 24V sul contatto NO del relè 5V.
Sul codice, digitalWrite(RELAY, LOW); bobina 5V eccitata,
No diventa chiuso, bobina 24V eccitata, la 220V viene interrotta,
entra in funzione l'inverter come UPS.
*/

if (pc == 1) {cc++;} // se pausa = 1, incrementa contatore
if (cc > pausa) {pc = 0; cc = 0;} // se il contatore raggiunge limite, azzera
if (pe == 1) {ce++;}
if (ce > pausa) {pe = 0; ce = 0;}

  // clima passa a enel
if (VoltageReading < tensione_bassa)
{
if (clima != 5 )
{
digitalWrite(RELAY5, LOW);
delay(1000);
digitalWrite(RELAY6, HIGH); // relay riposo, pin alimentato
delay(6000); // pausa per stabilizzare tensione
digitalWrite(RELAY5, HIGH);
clima = 5;
pc = 1; // attiva pausa clima
VoltageReading = vrx; // per impianto 24 volt
}
}

  // inverter passa a enel (se VR minore di TB)
if (VoltageReading < tensione_bassa)
{
if (posizione != 5 )
{
posizione = 5;
delay(1000);
digitalWrite(RELAY4, HIGH); // relay riposo, pin alimentato
digitalWrite(RELAY6, HIGH); // per sicurezza, nel caso fosse attivo
digitalWrite(RELAY9, HIGH);
pe = 1; // attiva pausa enel
}
}




  //       inverter passa a batterie (se VR maggiore di TA) ---   inverter passa a batterie (se VR maggiore di TA) ---
if (pe == 0)
{
if (VoltageReading > tensione_alta)
{
if (posizione != 10 )
{
delay(1000);
digitalWrite(RELAY4, LOW); // relay attivo, pin 0V
delay(4000); // pausa per stabilizzare tensione
posizione = 10;
VoltageReading = vrx;
}
}
}


  // clima passa a batterie
if (pc == 0)
{
if (VoltageReading > tensione_clima)
{
if (clima != 10 )
{
digitalWrite(RELAY5, LOW);
delay(2000);
digitalWrite(RELAY6, LOW); // relay attivo, pin 0V
digitalWrite(RELAY5, HIGH);
delay(4000); // pausa per stabilizzare tensione
clima = 10;
}
}
}

  // Baypass regolatore 30A
 
{
if (time > 12 ) {if ((VoltageReading < 25) || (VoltageReading > 28.8 ))
{
digitalWrite(RELAY9, HIGH); time = 0;
}
else {
digitalWrite(RELAY9, LOW); time = 0;
}}

time++;} // un ciclo = 5 secondi X 12 = un minuto


// digitalWrite(RELAY9, HIGH); delay (2000) // controllo tempo con led baypass.. saltare codice bypass

//  -  -  -  - Serial Print  -  -  -  -

Serial.print("Voltaggio media 15 letture:."); Serial.print(VoltageReading); Serial.print(" precedente:."); Serial.println(vr2);

Serial.print("Valore tensione_bassa:."); Serial.print(tensione_bassa); Serial.print(" - alta:.");  Serial.println(tensione_alta);
/*
Serial.print("Lettura pin A1 (pulsante):."); Serial.print(pulsante); Serial.print(" Time:."); Serial.println(time);

Serial.print("posizione (5 enel. 10 batt.):."); Serial.print(posizione); Serial.print(" clima:."); Serial.println(clima);

Serial.print("pc :."); Serial.print(pc); Serial.print(" cc:."); Serial.println(cc);

Serial.print("pe :."); Serial.print(pe); Serial.print(" ce:."); Serial.println(ce);
*/
Serial.println();

}
//Fine listato





Home - Schede