//Arduino Pro Mini VERSIONE CON DISTACCO FRIGO prima della commutazione, e pulsante FTV
//prodotto da calcola (antrec.geo@yahoo.com)
#include "OneWire.h" // consente di accedere ai dispositivi 1-wire (1 filo)
#include "Wire.h"
////////////////////////////////
//INIZIO PARTE MODIFICABILE
///////////////////////////////
#define tensione_bassa 6 //valori tipo: 11.9 (sistema 12V); 23.8 (sistema 24V)
#define tensione_alta 8 //valori tipo: 13.7 (sistema 12V); 27.4 (sistema 24V)
///////////////////////////////
//FINE PARTE MODIFICABILE
///////////////////////////////
#define coefficiente_conversione 0.05400 // con usb 0.05400 .. con DC-DC 0.05900.. origine 0.05620
#define RELAY1 4
#define RELAY2 5
#define RELAY3 6
#define inputPin A0 //lettura volt
#define a1pin A1 //pulsante, ON fotovoltaico
#define NUMREADINGS 5 //Il numero indica i valori tensione da leggere
#define bassatensione (tensione_bassa/coefficiente_conversione) // Valore della tensione stop batt ritorno rete
#define altatensione (tensione_alta/coefficiente_conversione) // Valore tensione stop rete ritorno batt.
int readings[NUMREADINGS]; //Letture dal input analogico
int index = 0; //Indice della lettura corrente
int total = 0; //Totale letture
int average = 0; //Media
int salto = 0;
int pulsante = 0;
#define media1 (bassatensione + altatensione)/2
void setup()
{
//Apro la comunicazion seriale
Serial.begin(9600);
Wire.begin();
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(inputPin, INPUT);
pinMode(a1pin, INPUT);
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, HIGH);
digitalWrite(RELAY3, HIGH);
for (int i = 0; i < NUMREADINGS; i++)
readings[i] = 0; //Mette tutti 0 nell'array
}
void loop()
{
//Serial.println(media1);
for (int A = 0; A < NUMREADINGS; A++)
{
total -= readings[index]; //Sottrae l'ultima lettura
readings[index] = analogRead(inputPin); //Legge i valori provenienti dal sensore e li salva nell'array
total += readings[index]; //Aggiunge la lettura al totale
index = (index + 1); //Incrementa l'indice
if (index >= NUMREADINGS) // > maggiore di .. < minore di
index = 0; //Alla fine dell'array resetta l'indice a 0
average = total / NUMREADINGS; //Calcola la media
}
float VoltageReading; // comprende i numeri reali, rappresentati in virgola mobile , 32 bit, 7 cifre
float media_avvio;
VoltageReading=average*coefficiente_conversione;
media_avvio=media1*coefficiente_conversione;
if (VoltageReading < tensione_bassa) // passa a enel (se VR minore di TB)
{
{
if (salto != 5 )
digitalWrite(RELAY3, LOW);
delay(1500);
digitalWrite(RELAY3, HIGH);
delay(200);
salto = 5;
}
digitalWrite(RELAY2, HIGH);
delay(200);
digitalWrite(RELAY1, LOW);
}
if (VoltageReading > tensione_alta) // passa a FTV (se VR maggiore di TB)
{
{
if (salto != 10 )
digitalWrite(RELAY3, LOW);
delay(1500);
digitalWrite(RELAY3, HIGH);
delay(200);
salto = 10;
}
digitalWrite(RELAY1, HIGH);
delay(200);
digitalWrite(RELAY2, LOW);
}
pulsante = analogRead(a1pin); // controllo pulsante
if (pulsante > 800)
{
{
if (salto != 10 )
digitalWrite(RELAY3, LOW);
delay(1500);
digitalWrite(RELAY3, HIGH);
delay(200);
salto = 10;
}
digitalWrite(RELAY1, HIGH);
delay(200);
digitalWrite(RELAY2, LOW);
delay(3000);
}
Serial.print(" Voltaggio batteria media 5 letture: "

;
Serial.println(VoltageReading); //Serial.println(average);
Serial.print(" Voltaggio batteria intermedio tra min-max: "

;
Serial.println(media_avvio);
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(" tensione A1: "

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