docdoc:
Allora, una cosa per volta. Per ora prova questo codice come te l'ho modificato "al volo" (quindi non è detto sia 100% funzionante, a dovrebbe esserlo), ma dove troverai penso/spero delle cosette interessanti come consiglio di stile di programmazione.
Una volta che questo ti funziona, puoi eventualmente pensare ad usare millis() al posto dei delay().
// numero di relè
#define NUMRELE 5
// Pin di ogni relè
int pin[5] = { 3,4,5,6,7 };
// Relè attualmente attivo (-1 indica "nessun relè")
int releON = -1;
// Flag fine ciclo relè
bool fineCiclo = false;
// Pin del pulsante
#define PULSANTE 12
void setup() {
Serial.begin(115200); //attivo comunicazione seriale
// Inizializzazione pin dei relè e li spengo
for (int i=0; i<NUMRELE; i++) {
pinMode(pin[i], OUTPUT);
digitalWrite(pin[i], LOW);
}
// Inizializzazione pin pulsante
pinMode(PULSANTE, INPUT);
}
void loop() {
// Vedo se il tasto è stato premuto
if ( digitalRead(PULSANTE) == HIGH ) {
if ( !fineCiclo ) {
// Passo al successivo rele?
// (all'inizio poiché parto da -1, il primo sarà 0)
releON++;
if ( releON < NUMRELE ) { // Se non ho ancora finito
digitalWrite(pin[releON], HIGH); //accendo
Serial.print("Relè ");
Serial.print(releON);
Serial.println(" acceso");
delay(1000); // aspetto 1 secondo
}
else
{ // Ho finito!
fineCiclo = true; // Segnalo che ho finito
}
}
}
else
{ // Tasto non premuto o rilasciato, resetto le variabili
spengo();
resetto();
}
funzione_esterna();
} // fine loop
void spengo() {
for (int i=0; i<NUMRELE; i++) {
digitalWrite(pin[i], LOW);
}
releON = -1;
}
void resetto() {
fineCiclo = false;
releON = -1;
}
void funzione_esterna(){
if ( fineCiclo ) {
Serial.println(" tutti i relay sono stati accesi e la nuova funzione è stata richiamata correttamente");
//nuova funzione da preparare
}
}
Ottimo, ho capito molte migliorie, i cicli for semplificano davvero tanto.
Ho testato e funziona bene, la cosa che ho notato è che se lascio il pulsante e poi lo ripremo subito, il ciclo non si interrompe e prosegue, secondo me è proprio a causa del delay.
Ho dato un occhiata all'esempio di Etemenanki, ho capito il senso, ma per integrarlo in questo codice ho bisogno di capire bene come funziona.
una domanda mi sorge spontanea, avendo fatto tutto con il ciclo for, se in futuro volessi aggiungere un effetto accendi-spegni per 3 volte, solo al relay 4, questo ciclo for non va più bene, giusto?