/* Edit 23-nov-2013.. Testato su Arduino Pro Mini..
Prodotto da calcola (antrec.geo@yahoo.com) (rettifiche by sabin)
Controllo tensione per commutazione enel/batterie..
Distacco Frigo prima della commutazione..
Tensione media, per passaggio climatizzatore a enel, ritorno a tensione massima.
Pulsante per passaggio forzato a batterie e ritorno a enel
Salta una lettura con calo eccessivo (spunto motori)
*/
#include "OneWire.h" // Librerie. consente di accedere ai dispositivi 1-wire (1 filo)
#include "Wire.h"
// Definire margine di tensione
#define tensione_bassa 23.6 //valori tipo: 11.9 (sistema 12V); 23.9 (sistema 24V)
#define tensione_media 24.0
#define tensione_alta 26.8
#define coefficiente_conversione 0.05850 // 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 // tensione media
#define a0pin A0 // lettura volt
#define a1pin A1 // pulsante, passa a batterie
const float numeroletture = 15; // letture tensione
int total = 0; // Somma letture
int average = 0; // Media
int batt = 5; // salta conferma verifica. 5 enel, 10 batterie
int clima = 5; // salta conferma verifica
int posizione = 5; // controllo posizione pulsante
int pulsante = 0; // controllo pulsante, x passare a batterie
float vr2 = 0; // voltaggio precedente
float temp = 0;
// Comunicazione seriale e settaggi
void setup()
{
Serial.begin(9600);
Wire.begin();
pinMode(RELAY4, OUTPUT);
pinMode(RELAY5, OUTPUT);
pinMode(RELAY6, OUTPUT);
pinMode(a0pin, INPUT);
pinMode(a1pin, INPUT);
digitalWrite(RELAY4, HIGH);
digitalWrite(RELAY5, HIGH);
digitalWrite(RELAY6, HIGH);
}
// Loop infinito
void loop()
{
total = 0; // Azzera per il prossimo calcolo
for (int A = 0; A < numeroletture; A++)
{
total += analogRead(a0pin); //Legge la tensione su A0
delay(300); //ritardo in millisecondi
// ---- Controllo pulsante per passaggio forzato
pulsante = analogRead(a1pin);
if (pulsante > 700)
{
if (posizione != 10 ) // passa a batterie
{
digitalWrite(RELAY5, LOW);
delay(1000);
digitalWrite(RELAY5, HIGH);
batt = 10;
digitalWrite(RELAY4, LOW);
delay(2000);
posizione = 10;
pulsante = 0;
}
} // batt fine
if (pulsante > 700)
{
if (posizione != 5 ) // passa a enel
{
digitalWrite(RELAY5, LOW);
delay(1000);
digitalWrite(RELAY5, HIGH);
batt = 5;
digitalWrite(RELAY4, HIGH);
delay(2000);
posizione = 5;
pulsante = 0;
}
} // enel fine
} // lettura fine
average = total / numeroletture; //Calcola la media
float VoltageReading; // comprende i numeri reali, rappresentati in virgola mobile , 32 bit, 7 cifre
VoltageReading=average*coefficiente_conversione;
if (VoltageReading - 0.4 < vr2) // 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
// enel su contatto NC (relay 24v (riposo)).. relay4 HIGH riposo (enel), fili (bobina relay 24v) su contatto NO
// passa a enel (se VR minore di TB)
if (VoltageReading < tensione_bassa)
{
if (batt != 5 )
{
digitalWrite(RELAY5, LOW);
delay(2000);
digitalWrite(RELAY5, HIGH);
batt = 5;
}
digitalWrite(RELAY4, HIGH); // relay riposo, pin alimentato
posizione = 5;
}
// passa a batterie (se VR maggiore di TA)
if (VoltageReading > tensione_alta)
{
if (batt != 10 )
{
digitalWrite(RELAY5, LOW);
delay(2000);
digitalWrite(RELAY5, HIGH);
batt = 10;
}
digitalWrite(RELAY4, LOW); // relay attivo, pin 0V
posizione = 10;
delay(2000); // pausa per stabilizzare tensione
}
// ---- Controllo tensione media, x clima
// passa a enel
if (VoltageReading < tensione_media)
{
if (clima != 5 )
{
digitalWrite(RELAY5, LOW);
delay(2000);
digitalWrite(RELAY5, HIGH);
clima = 5;
}
digitalWrite(RELAY6, HIGH); // relay riposo, pin alimentato
}
// passa a batterie
if (VoltageReading > tensione_alta + 1) // + 1 aggiunge un volt
{
if (clima != 10 )
{
digitalWrite(RELAY5, LOW);
delay(2000);
digitalWrite(RELAY5, HIGH);
clima = 10;
}
digitalWrite(RELAY6, LOW); // relay attivo, pin 0V
delay(2000); // pausa per stabilizzare tensione
}
Serial.print(" Voltaggio media 15 letture: "

;
Serial.println(VoltageReading);
Serial.print(" Lettura precedente: "

;
Serial.println(vr2);
Serial.print(" Somma letture: "

;
Serial.println(total);
Serial.print(" Valore tensione_bassa: "

;
Serial.println(tensione_bassa);
Serial.print(" Valore tensione_media: "

;
Serial.println(tensione_media);
Serial.print(" Valore tensione_alta: "

;
Serial.println(tensione_alta);
Serial.print(" Lettura pin A1 (pulsante): "

;
Serial.println(pulsante);
Serial.println();
}
//Fine listato