illya95:
Ho visto il codice da te modificato, hai ragione, è molto più pulito. Grazie.
Bene. Ma lo hai provato? Ovviamente dato che la configurazione è ora in testa al programma, puoi decidere di mappare i pin secondo quello che ritieni più opportuno per te, anche rimettere i pin 0 ed 1.
per questo che non ho voluto entrare nel merito della mappatura ma focalizzarmi solo sul problema dei relays. So bene anche che dovrei evitare di usare RX e TX per collegare input specialmente se passa corrente (ti blocca il bootloader), ma era l'unico modo.
E perché? Guarda che anche i pin analogici puoi usarli come digitale, come ti ho scritto in precedenza, quindi a parte A0 ed A1 ne hai almeno altri due, A2 ed A3 (se A4 ed A5 li usi per I2C, altrimenti anche questi sono disponibili).
Poi per il resto del codice ti consiglio di cercare di ottimizzarlo, vedrai che utilizzando questi metodi ti troverai non solo un codice più compatto e leggibile, ma ti sarà più facile apportare modifiche (a questo o ai tuoi futuri progetti)!
Potresti iniziare a compattare maggiormente almeno il loop(), ma non solo (anche la gestione delle pagine del menu), portando dentro ad apposite funzioni il codice per "blocchi logici", poi prova ad imparare ad usare gli array vedrai quanto sarà tutto più semplice.
Prendiamo ad esempio le varie funzioni accessorie come le "turnRelay*": mettendo i pin dei relè dentro ad un array puoi avere UNA sola funzione per accendere o spegnere qualsiasi relé!
Quindi invece di tutte queste righe:
...
#define P_RLY1 6
#define P_RLY2 8
#define P_RLY3 9
#define P_RLY4 10
...
void setup() {
...
pinMode(P_RLY1, OUTPUT);
pinMode(P_RLY2, OUTPUT);
pinMode(P_RLY3, OUTPUT);
pinMode(P_RLY4, OUTPUT);
...
... e tutte le righe dove fai turnRelayOff() e turnRelayOn() e relayone = false o true...
}
...
void turnBacklightOn() {
digitalWrite(P_BACKLIGHT, LOW);
}
void turnBacklightOff() {
digitalWrite(P_BACKLIGHT, HIGH);
}
void turnRelayOn() {
digitalWrite(P_RLY1, LOW);
}
void turnRelayOff() {
digitalWrite(P_RLY1, HIGH);
}
void turnRelayTwoOn() {
digitalWrite(P_RLY2, LOW);
}
void turnRelayTwoOff() {
digitalWrite(P_RLY2, HIGH);
}
void turnRelayThreeOn() {
digitalWrite(P_RLY3, LOW);
}
void turnRelayThreeOff() {
digitalWrite(P_RLY3, HIGH);
}
void turnRelayFourOn() {
digitalWrite(P_RLY4, LOW);
}
void turnRelayFourOff() {
digitalWrite(P_RLY4, HIGH);
}
vedi qui (la prima definizione sostituisce completamente i simboli #define dei pin relè):
...
byte pinRele[4] = { 6, 8, 9, 10 };
bool relay[4];
...
void setup() {
...
for ( int i=0; i<=3; ++i) {
pinMode(pinRele[i], OUTPUT);
relay[i] = false;
}
...
}
void loop() {
...
// Attivo il relè 3 (invece di turnRelayThreeOn e relaythree=true)
rele(3, true);
...
// Spengo il relè 3 (invece di turnRelayThreeOff e relaythree=false)
rele(3, false);
...
}
void rele(byte num, bool stato) {
if ( stato )
digitalWrite(pinRele[num], HIGH);
else
digitalWrite(pinRele[num], HIGH);
relay[num] = stato;
}
...
Non ti pare?