/* Edit 8-giu-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.
    Inverter passa a enel se tensione torna a min . Spegne tutti i relè, attiva pausa di 10 minuti.
     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
unsigned long tempo = 0; // permanenza minima a enel.
unsigned long ltempo = 600; // n. secondi loop tempo.

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()
{
total = 0;  // Azzera per il calcolo

for (int A = 0; A < numeroletture; A++) // Letture tensione, controllo pulsante
{
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.
*/

  // 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;
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);

//  10 minuti Pausa--------------- 10 minuti Pausa--------------- 10 minuti Pausa--------------- 10 minuti Pausa---------------

Serial.println("  Pausa. (600 = 10 min.)... ");  // 60x10= 600
 for( tempo = 0; tempo < ltempo; tempo++)
{
delay(1000);
pulsante = analogRead(a1pin); // ---- Controllo pulsante
if (pulsante > 700)
{ break;
}
VoltageReading = analogRead(a0pin); //Legge la tensione su A0
VoltageReading *= coefficiente_conversione;

Serial.print("  N. "); Serial.print(tempo); Serial.print("  di ");  Serial.print(ltempo);
Serial.print(" .volt:."); Serial.print(VoltageReading);
Serial.println();

} // fine pausa
}
}




  //       inverter passa a batterie (se VR maggiore di TA) ---   inverter passa a batterie (se VR maggiore di TA) ---
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 (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


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.println();


}

//Fine listato



Home - Schede