Questo è il codice che gira sul MASTER (una Arduino DUE), ovvero quello che riceve i dati delle a Seriali RS232
Commento:
Ogni pacchetto che arriva dalla seriale viene analizzato e convertito altrove, in questo "altrove" viene chiamata la funzione Code()
La funzione Code():
-
apre una connessione I2C con la scheda SLAVE (Arduino MEGA) 0x04
-
se la tensione è maggiore di 22 V, niente, il valore restituito mi accende un LED Verde su un semaforo e il carattere che visualizza il voltaggio sul display MASTER sarà di colore verde
-
se la tensione è tra i 19 e i 22V, si accende un LED Giallo e la scritta sul display MASTER sarà di colore giallo (es. 20.2 V scritti in giallo invece che verde). Non viene attivato alcun allarme.
-
se la tensione scende sotto i 19 V, si accende un LED Rosso sul semaforo, la tensione sul MASTER sarà indicata con un carattere rosso, e si attiverà una funzione di Allarme() la quale fa molte cose, tipo far suonare una campana, una luce rotante, spedisce un SMS all'Elettromeccanico di reperibilità, manda un messaggio UDP in rete etc.
///////////////////////////////////////////// Codice
int Codice(float c, unsigned char codex)
{
Wire.beginTransmission(0x04);
if (c >= 22.0){
return 1; // verde
}
if (c < 22.0 && c >= 19.0){
//invio un byte
char alarm = 'G';
Wire.write(codex);
Wire.write(alarm);
//fine trasmissione
Wire.endTransmission();
return 2; // giallo
}
if (c < 19.0){
//invio un byte
char alarm = 'R';
// punto = 'X';
Wire.write(codex);
Wire.write(alarm);
//fine trasmissione
Wire.endTransmission();
return 3; // rosso
}
}
A noi interessa la comunicazione I2C con lo slave. Con codex e alarm si passano il codice (che equivale anche al numero di contatto), e se l'allarme è giallo o rosso.
Ora lato SLAVE dove gira la routine incriminata:
code è il codice di errore (il contatto, o meglio, uno dei contatti che è senza tensione)
priorità_A è una variabile che definisce che priorità ha nello schema elettrico il contatto: se più alta (es. 52) significa che è un contatto "lontano" dalla sorgente di tensione, se è più bassa (Es. 3) sarà del contatto più vicino, più a monte, e ovviamente l'HighLander che dobbiamo trovare.
verticale è solo una roba per farmi scorrere le righe degli allarmi più in basso. Ignoratela.
gia_1 è un flag per evitare che se la stringa è già stata visualizzata, venga rivisualizzata di nuovo, facendo flasshare lo schermo
La parte commentata con una serie infinita di AND è il sistema precedente.
if(code == 11) {
if (priorita_A >= 16){
verticale = 15;
priorita_A = 17;
// if ((PRI_10 == 0) && (PRI_11 == 0) && (PRI_12 == 0) && (PRI_13 == 0) && (PRI_14 == 0) && (PRI_15 == 0) && (PRI_16 == 0) && (PRI_17 == 0) && (PRI_18 == 0) && (PRI_19 == 0)
// && (PRI_20 == 0) && (PRI_26 == 0) && (PRI_27 == 0) && (PRI_28 == 0) && (PRI_29 == 0)) {
if(gia1 == 0) {
myGLCD.clrScr();
if(alarm == 'R'){
digitalWrite(Verde, LOW);
digitalWrite(Rosso, HIGH);
myGLCD.setFont(arial_bold);
myGLCD.setColor(VGA_RED);
myGLCD.print("ALLARME!", LEFT, verticale);
myGLCD.printNumI(hour(),130 , verticale, 2, ' ');
myGLCD.print(":", 158, verticale);
myGLCD.printNumI(minute(), 170, verticale, 2, '0');
myGLCD.print(".", 200, verticale);
myGLCD.printNumI(second(), 215, verticale, 2, '0');
myGLCD.setFont(franklingothic_normal);
myGLCD.print(" ", RIGHT, verticale);
myGLCD.print("S14", RIGHT, verticale);
myGLCD.print("Pannello su S14", LEFT, verticale+15);
++flag_1;
myGLCD.print("Porta INTR 1SX", LEFT, verticale+30);
//++flag_;
}
if(alarm == 'G'){
digitalWrite(Verde, LOW);
digitalWrite(Giallo, HIGH);
myGLCD.setFont(arial_bold);
myGLCD.setColor(VGA_YELLOW);
myGLCD.print("LOW VOLT", LEFT, verticale);
myGLCD.printNumI(hour(),130 , verticale, 2, ' ');
myGLCD.print(":", 158, verticale);
myGLCD.printNumI(minute(), 170, verticale, 2, '0');
myGLCD.print(".", 200, verticale);
myGLCD.printNumI(second(), 215, verticale, 2, '0');
myGLCD.setFont(franklingothic_normal);
myGLCD.print(" ", RIGHT, verticale);
myGLCD.print("S14", RIGHT, verticale);
myGLCD.print("Pannello su S14", LEFT, verticale+15);
++flag_1;
myGLCD.print("Porta INTR 1SX", LEFT, verticale+30);
//++flag_1
}
gia1 = 1;
}
}
}