Come da titolo, sono intenzionato nella realizzazione di un deviatore automatico ovvero un sistema che possa “deviare” il carico da una alimentazione verso un’altra nel caso in cui una di questa raggiunga un valore di tensione troppo basso.
In particolare sto tentando di realizzare un sistema che sia in grado di:
-
rilevare la tensione di una batteria
-
determinare se tale valore sia compreso in una certa soglia di intervento (ad esempio < 11V)
-
preventivamente allo scambio dell’alimentazione faccia avviare un alimentatore (precedentemente in modalità di stand-by) e ne controlli lo stato di funzionamento
N.B: per stato di funzionamento intendo la lettura di segnali che determineranno:
- la presenza di tensione dell’alimentatore [in stand-by]
- lo stato del segnale DC-OK fornito dall'alimentatore [in funzione]
- il valore della tensione erogata dall'alimentatore [in funzione]
-
in caso che tale tensione rientri nei valori nominali faccia chiudere o aprire in sequenza due relè che effettivamente si prenderanno in carico di commutare il carico da una sorgente verso l’altra.
-
nel caso non si verifichi tale condizione lo notifichi (con un buzzer e/o led)
Secondo la mia idea poi tale procedimento dovrà essere reversibile quindi in caso la tensione della batteria ritorni ad essere a valori normali (ad esempio > 12.8V) il sistema dovrà:
-
chiudere o aprire in sequenza i due relè che riporteranno l’alimentazione del carico verso la batteria
-
dopo aver atteso un certo periodo di tempo (3 secondi) riportare in stand-by l’alimentatore
Questo è il funzionamento in linea generale del sistema che ho in mente, purtroppo però, sto avendo diverse difficoltà nello sviluppo di un codice che permetta di fare tutto ciò che ho appena descritto.
Così dopo aver provato per settimane nel tentare di risolvere questo problema mi sono deciso nel chiedere aiuto tramite il forum poiché dalle mie ricerche in internet non ho trovato nulla di simile .
Detto ciò posto anche il mio attuale codice (che però non funziona per nulla) in cui ho omesso la parte di set-up poiché oltre alla inizializzazione dei pin come input o output e la definizione di un riferimento di tensione esterno a 2,50V aveva ben poco.
void loop(){
//V_BATT = ((analogRead(V_BATT_pin) * 2.50)/1023.00) * A;
V_BATT = 0;
V_BATT_SUM = 0;
//V_BATT SENS.
for(int i = 0; i < 10; i++) {
V_BATT_SUM += ((analogRead(A0) * 2.50)/1023.00) * ((R1+R2)/R2);
delay(20);
}
V_BATT = V_BATT_SUM / 10.00;
V_PSU = 0;
V_PSU_SUM = 0;
//V_BATT SENS.
for(int i = 0; i < 10; i++) {
V_PSU_SUM += ((analogRead(A1) * 2.50)/1023.00) * ((R1+R2)/R2);
delay(20);
}
V_PSU = V_PSU_SUM / 10.00;
if (V_BATT >= 12.30){
if ((GRID_ACT == false) && (BATT_ACT == false)){
do {
digitalWrite(K1A_pin,HIGH);
delay(30);
digitalWrite(K1B_pin,LOW);
BATT_ACT = true;
} while(BATT_ACT == false);
}
if (GRID_ACT == true){
do {
digitalWrite(K1A_pin,HIGH);
delay(30);
digitalWrite(K1B_pin,LOW);
delay(1000);
digitalWrite(PSU_EN_pin, LOW);
GRID_ACT == false;
BATT_ACT == true;
} while (BATT_ACT == false);
}
}
if (V_BATT < 11.00){
if ((GRID_ACT == false) && (BATT_ACT == false)){
if ((digitalRead(PSU_ONLINE_pin)) == HIGH){
digitalWrite(PSU_EN_pin, HIGH);
delay(800);
}
if ((digitalRead(PSU_ONLINE_pin)) == LOW){
//ALLARME: RETE NON PRESENTE
ALL_RNP ();
}
if ((digitalRead(PSU_ONLINE_pin) == HIGH) && (digitalRead(PSU_DC_OK_pin) == HIGH) && (V_PSU > 10)){
delay(3000);
do {
digitalWrite(K1A_pin,LOW);
delay(30);
digitalWrite(K1B_pin,HIGH);
delay(1000);
GRID_ACT == true;
BATT_ACT == false;
} while (BATT_ACT == false);
}
if ((digitalRead(PSU_ONLINE_pin) == LOW) || (digitalRead(PSU_DC_OK_pin) == LOW) || (V_PSU < 10)){
//ALLARME: ALIMNETATORE NON AVVIATO O ALIMENTAZIONE FUORI LIMITE
ALL_ANA_AFL ();
}
}
}
delay(2500);
}
//ALLARME: RETE NON PRESENTE
void ALL_RNP (){
serial.println("ALLARME RETE NON PRESENTE");
}
//ALLARME: ALIMENTATORE NON AVVIATO O ALIMENTAZIONE FUORI LIMITE
void ALL_ANA_AFL (){
serial.println("ALLARME ALIMNETATORE NON AVVIATO O ALIMENTAZIONE FUORI LIMITE");
}
Dove:
V_BATT: contiene il valore della tensione della batteria (di tipo double)
V_BATT_SUM: contiene le somme di 10 rilevazioni per fare la media aritmetica (di tipo double)
V_PSU: contiene il valore della tensione dell’alimentatore (di tipo double)
V_PSU_SUM: stesso di V_BATT_SUM ma per l’alimentatore (di tipo double)
GRID_ACT: variabile che salva lo stato della modalità a rete [true=attiva false=non attiva] (di tipo bool)
BATT_ACT:variabile che salva lo stato della modalità a batteria [true=attiva false=non attiva] (di tipo bool)
Come hardware utilizzo un Arduino NANO e poi sono definiti come:
K1A relè collegato alla batteria
K1B relè collegato all’alimentatore
PSU_ONLINE: è allo stato HIGH quando l’alimentatore ha tensione e resta cosi anche quando è acceso
PSU_DC_OK: è allo stato HIGH quando l’alimentatore fornisce una tensione entro i limiti
PSU_EN: è un segnale che deve fornire l'aurduino e quando questo è allo stato HIGH l’alimentatore è acceso mentre quando questo è allo stato LOW l'alimentatore è in stand-by.
Fornisco in oltre un schema elettrico della parte dei relè per poter far comprendere meglio qual’è la tipologia del circuito.
Spero, grazie all'aiuto del forum, di risolvere questo problema di natura software e mi scuso in anticipo se tale argomento non fosse in linea con il forum
Ringrazio in anticipo per le risposte fornite
Saluti