// Edit 12-ott-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.1
#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
#define 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
int vr2 = 0; // voltaggio precedente
// 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()
{
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
total = 0; // Azzera per il prossimo calcolo
float VoltageReading; // comprende i numeri reali, rappresentati in virgola mobile , 32 bit, 7 cifre
VoltageReading=average*coefficiente_conversione;
if (VoltageReading - 0.5 < vr2) // salta un calo eccessivo
{ int temp = VoltageReading;
VoltageReading = vr2;
vr2 = temp;
}
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 TB)
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;
}
// ---- 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)
{
if (clima != 10 )
{
digitalWrite(RELAY5, LOW);
delay(2000);
digitalWrite(RELAY5, HIGH);
clima = 10;
}
digitalWrite(RELAY6, LOW); // relay attivo, pin 0V
}
Serial.print(" Voltaggio batteria media 10 letture: "

;
Serial.println(VoltageReading);
Serial.print(" Passa a enel quando minore di: "

;
Serial.println(tensione_bassa);
Serial.print(" Passa a batterie quando maggiore di: "

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

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