/* Edit 6-ago-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. Attiva pausa per 10 min. pc = 1; cc++ (conteggio clima) Inverter passa a enel se tensione torna a min . Spegne tutti i relè. Attiva pausa per 10 min. pe = 1; ce++ (conteggio enel) 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 regolatore byte pc = 0; // pausa per clima byte pe = 0; // pausa per enel int cc = 0; // conteggio pausa clima int ce = 0; // conteggio pausa enel int pausa = 133; // 10 min.= 600 sec. / 4.5 = 133... 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() { // digitalWrite(RELAY9, LOW); // controllo tempo con led baypass total = 0; // Azzera per il calcolo // Letture tensione for (int A = 0; A < numeroletture; A++) { 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. */ if (pc == 1) {cc++;} // se pausa = 1, incrementa contatore if (cc > pausa) {pc = 0; cc = 0;} // se il contatore raggiunge limite, azzera if (pe == 1) {ce++;} if (ce > pausa) {pe = 0; ce = 0;} // 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; pc = 1; // attiva pausa clima 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); pe = 1; // attiva pausa enel } } // inverter passa a batterie (se VR maggiore di TA) --- inverter passa a batterie (se VR maggiore di TA) --- if (pe == 0) { 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 (pc == 0) { 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 // digitalWrite(RELAY9, HIGH); delay (2000) // controllo tempo con led baypass.. saltare codice bypass // - - - - Serial Print - - - - 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.print("pc :."); Serial.print(pc); Serial.print(" cc:."); Serial.println(cc); Serial.print("pe :."); Serial.print(pe); Serial.print(" ce:."); Serial.println(ce); */ Serial.println(); } //Fine listato |
Home - Schede |