/* 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 |