Funzionamento in contemporanea relè

Buon giorno a tutti.... mi servirebbe un consiglio su uno sketch che ho fatto per una fontana automatizzata.... Il mio problema è che ho collegato una serie di relè che mi comanderanno 8 faretti che ho chiamato LED nello sketch, quattro elettrovalvole e due motorini a 24Volt che faranno aprire e chiudere due meccanismi.... il problema è che quando accendono determinate luci ed elettrovalvole devono contemporaneamente funzionare i 2 motorini in apertura ma non lo fanno.... si accendono le luci, poi le elettrovalvole e alla fine i motorini tutto in sequenza.... Penso che il problema sia dovuto ai delay, ma non riesco a capire come risolvere...

Sto usando Arduino Mega 2560 e per il collegamento hardware non c'è nessun problema.

Il codice è questo

#define FPA 2     //Finecorsa1 porta Apertura
#define FSA 3     //Finecorsa2 sole Apertura
#define FFA 4     //Finecorsa3 fiori Apertura
#define FPC 5     //Finecorsa1 porta Chiusura
#define FSC 14    //Finecorsa2 sole Chiusura
#define FFC 6     //Finecorsa3 fiori Chiusura
#define MPA 47     //Relè Motore avanti porta
#define MPI 10    //Relè Motore indietro porta
#define MFA 11    //Relè Motore avanti fiori
#define MFI 12    //Relè Motore indietro fiori
#define LED1 25   //Relè faretto 1
#define LED2 23   //Relè faretto 2
#define LED3 27   //Relè faretto 3
#define LED4 29   //Relè faretto 4
#define LED5 31   //Relè faretto 5
#define LED6 33   //Relè faretto 6
#define LED7 35   //Relè faretto 7
#define LED8 37   //Relè faretto 8
#define EV1 39    //Relè Elettro Valvola 1
#define EV2 41    //Relè Elettro Valvola 2
#define EV3 43    //Relè Elettro Valvola 3
#define EV4 45    //Relè Elettro Valvola 4
#define MUSIC 49  //Relè musica

byte stato_fp = 1;
byte stato_ff = 1;

unsigned int ritardo = 30000;  // aggiungere commento
unsigned long pausa = 600000;  // aggiungere commento

void setup() {
  Serial.begin(9600);
  pinMode(FPA, INPUT_PULLUP);
  pinMode(FSA, INPUT_PULLUP);
  pinMode(FFA, INPUT_PULLUP);
  pinMode(FPC, INPUT_PULLUP);
  pinMode(FSC, INPUT_PULLUP);
  pinMode(FFC, INPUT_PULLUP);
  pinMode(MPA, OUTPUT);
  pinMode(MPI, OUTPUT);
  pinMode(MFA, OUTPUT);
  pinMode(MFI, OUTPUT);


  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, HIGH);

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  pinMode(LED8, OUTPUT);
  pinMode(EV1, OUTPUT);
  pinMode(EV2, OUTPUT);
  pinMode(EV3, OUTPUT);
  pinMode(MUSIC, OUTPUT);

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, HIGH);
  digitalWrite(LED5, HIGH);
  digitalWrite(LED6, HIGH);
  digitalWrite(LED7, HIGH);
  digitalWrite(LED8, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
  digitalWrite(EV4, HIGH);
  digitalWrite(MUSIC, HIGH);

  motore_porta_stop();
  motore_fiori_stop();
  led_spento();
  elettrovalvole_spento();

  //Serial.println("resetta tutte le posizioni");
  // reset_tutto();
  //led_spento();
}

void loop() {
  // 1° Step *************************************
  Serial.println("Primo Step");
  digitalWrite(MUSIC, LOW);
  gioco_primo_step();

  //delay(ritardo);
  led_spento();
  elettrovalvole_spento();

  // 2° Step *************************************

  Serial.println("Secondo Step");
  gioco_secondo_step();



  // 3° Step *************************************

  Serial.println("Terzo Step");
  gioco_terzo_step();
  motore_porta_apri();
  motore_fiori_apri();

  stato_fp = 1;
  stato_ff = 1;
  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPA) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFA) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }

    delay(15000);

    led_spento();
    elettrovalvole_spento();
  }

  // 4° Step *************************************

  Serial.println("Quarto Step Chiusura");
  motore_porta_chiudi();
  motore_fiori_chiudi();

  stato_fp = 1;
  stato_ff = 1;

  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPC) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFC) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
  }

  digitalWrite(MUSIC, HIGH);

  delay(pausa);
}

void reset_tutto() {

  motore_porta_chiudi();
  motore_fiori_chiudi();

  stato_fp = 1;
  stato_ff = 1;

  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPC) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFC) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
  }
}

void motore_porta_stop() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
}

void motore_fiori_stop() {

  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, HIGH);
}

void motore_porta_apri() {

  digitalWrite(MPA, LOW);
  digitalWrite(MPI, HIGH);
}

void motore_fiori_apri() {

  digitalWrite(MFA, LOW);
  digitalWrite(MFI, HIGH);
}

void motore_porta_chiudi() {

  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, LOW);
}

void motore_fiori_chiudi() {

  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, LOW);
}

void led_spento() {

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, HIGH);
  digitalWrite(LED5, HIGH);
  digitalWrite(LED6, HIGH);
  digitalWrite(LED7, HIGH);
  digitalWrite(LED8, HIGH);
}

void elettrovalvole_spento() {

  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
  digitalWrite(EV4, HIGH);
}

void gioco_primo_step() {

  digitalWrite(EV1, LOW);

  delay(7000);

  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);

  delay(7000);

  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, HIGH);
  digitalWrite(LED5, HIGH);
  digitalWrite(EV4, LOW);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);

  delay(7000);

  digitalWrite(EV4, HIGH);
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV3, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);

  delay(7000);

  digitalWrite(EV3, HIGH);
  digitalWrite(LED6, HIGH);
  digitalWrite(LED7, HIGH);
}


void gioco_secondo_step() {

  digitalWrite(EV1, LOW);

  delay(4000);

  digitalWrite(EV2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);

  delay(4000);

  digitalWrite(EV3, LOW);
  digitalWrite(EV4, LOW);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);

  delay(4000);

  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
  digitalWrite(EV4, HIGH);

  led_spento();

  delay(2000);

  digitalWrite(EV2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);

  delay(4000);

  digitalWrite(EV3, LOW);
  digitalWrite(EV4, LOW);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);

  delay(4000);

  digitalWrite(EV2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);

  delay(4000);

  digitalWrite(EV3, LOW);
  digitalWrite(EV4, LOW);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);

  delay(2000);

  led_spento();
  elettrovalvole_spento();
}



void gioco_terzo_step() {

   digitalWrite(EV2, LOW);
  digitalWrite(EV3, LOW);
  digitalWrite(EV4, LOW);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);
  digitalWrite(LED8, LOW);
}

Il pezzetto di sketch che non fa quello che dovrebbe fare è questo:

// 3° Step *************************************

  Serial.println("Terzo Step");
  gioco_terzo_step();
  motore_porta_apri();
  motore_fiori_apri();

  stato_fp = 1;
  stato_ff = 1;
  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPA) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFA) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }

    delay(15000);

    led_spento();
    elettrovalvole_spento();

che dovrebbe far partire il gioco_terzo_step, motore_porta_apri(); e motore_fiori_apri(); insieme..... invece non è così, mi parte il gioco terzo step e quando finisce partono i 2 motori.... c'è qualcuno che potrebbe vedere il motivo per cui succede questo? è da giorni che provo a trovare una soluzione ma non ne vengo a capo... Grazie in anticipo

... pensi bene ... il delay() è una funzione "bloccante", il programma si ferma li e non va avanti sino a quando non è passato il tempo impostato.

Dovresti studiarti bene come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che poi ti sarà tutto più chiaro e potrai ridisegnare il tuo programma (perché va proprio ridisegnato) in modo che faccia quello che vuoi tu.

Guglielmo

Si, posso ridisegnare tutto togliendo i delay() e configurando il sistema con i millis(), però nello specifico in questo pezzo di sketch non capisco cosa fa andare avanti il gioco_terzo_step(); e poi motore_porta_apri(); motore_fiori_apri();, visto che nel void gioco_terzo_step() non c'è nessun delay().

Ed un'altra cosa, nel pezzo di sketch sotto:

// 3° Step *************************************

  Serial.println("Terzo Step");
  gioco_terzo_step();
  motore_porta_apri();
  motore_fiori_apri();

  stato_fp = 1;
  stato_ff = 1;
  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPA) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFA) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }

    delay(15000);

    led_spento();
    elettrovalvole_spento();

lo sketch deve attendere 15 secondi, devo lasciare il delay() o operare sempre con i millis()?

Grazie anticipatamente della risposta..

Tutti delay() presenti nel programma vanno sostituiti con la funzione millis()

Dal programma non è chiaro che cosa desideri fare. Se, però, vuoi che i motorini partano o si fermino durante i delay, ha solo due possibilità:

  1. spezzi i delay e inserisci i comandi per i motorini;
  2. più elegantemente, riscrivi il programma strutturandolo con una macchina a stati finiti e usando millis().
1 Like

Evidentemente esegue tutto gioco_terzo_step(), poi comanda i due motori. Se preferisci, puoi scrivere:

  Serial.println("Terzo Step");
  motore_porta_apri();
  motore_fiori_apri();
  gioco_terzo_step();

In questo modo farà tutto apparentemente allo stesso tempo, poiché le due funzioni che comandano i motori durano in tutto poche decine di microsecondi.
Anche se così risolvi il problema, però, comincia a interessarti alle macchine a stati finiti e all'uso di millis(), in modo da essere pronto a usarli quando ti occorrerà.

Buon giorno a tutti... ho provato a sostituire i delay() con i millis(), può qualcuno dare un occhiata per vedere se il mio approccio va bene? o se eventualmente ci sono altri metodi?
Grazie a tutti.

#define FPA 2               //Finecorsa1 porta Apertura
#define FSA 3               //Finecorsa2 sole Apertura
#define FFA 4               //Finecorsa3 fiori Apertura
#define FPC 5               //Finecorsa1 porta Chiusura
#define FSC 14              //Finecorsa2 sole Chiusura
#define FFC 6               //Finecorsa3 fiori Chiusura
#define MPA 47              //Relè Motore avanti porta
#define MPI 10              //Relè Motore indietro porta
#define MFA 11              //Relè Motore avanti fiori
#define MFI 12              //Relè Motore indietro fiori
#define LED1 25             //Relè faretto 1
#define LED2 23             //Relè faretto 2
#define LED3 27             //Relè faretto 3
#define LED4 29             //Relè faretto 4
#define LED5 31             //Relè faretto 5
#define LED6 33             //Relè faretto 6
#define LED7 35             //Relè faretto 7
#define LED8 37             //Relè faretto 8
#define EV1 39              //Relè Elettro Valvola 1
#define EV2 41              //Relè Elettro Valvola 2
#define EV3 43              //Relè Elettro Valvola 3
#define EV4 45              //Relè Elettro Valvola 4
#define MUSIC 49            //Relè musica
#define INTERVALLO4 4000    //Intervallo 4 secondi
#define INTERVALLO7 7000    //Intervallo 7 secondi
#define INTERVALLO15 15000  //Intervallo 15 secondi


byte stato_fp = 1;
byte stato_ff = 1;

unsigned long pausa = 600000;  // aggiungere commento

unsigned long t0, dt;

void setup() {
  Serial.begin(9600);
  pinMode(FPA, INPUT_PULLUP);
  pinMode(FSA, INPUT_PULLUP);
  pinMode(FFA, INPUT_PULLUP);
  pinMode(FPC, INPUT_PULLUP);
  pinMode(FSC, INPUT_PULLUP);
  pinMode(FFC, INPUT_PULLUP);
  pinMode(MPA, OUTPUT);
  pinMode(MPI, OUTPUT);
  pinMode(MFA, OUTPUT);
  pinMode(MFI, OUTPUT);


  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, HIGH);

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  pinMode(LED8, OUTPUT);
  pinMode(EV1, OUTPUT);
  pinMode(EV2, OUTPUT);
  pinMode(EV3, OUTPUT);
  pinMode(MUSIC, OUTPUT);

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, HIGH);
  digitalWrite(LED5, HIGH);
  digitalWrite(LED6, HIGH);
  digitalWrite(LED7, HIGH);
  digitalWrite(LED8, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
  digitalWrite(EV4, HIGH);
  digitalWrite(MUSIC, HIGH);

  motore_porta_stop();
  motore_fiori_stop();
  led_spento();
  elettrovalvole_spento();

  //Serial.println("resetta tutte le posizioni");
  // reset_tutto();
  //led_spento();
}

void loop() {
  // 1° Step *************************************
  Serial.println("Primo Step");
  digitalWrite(MUSIC, LOW);
  gioco_primo_step();

  //delay(ritardo);
  led_spento();
  elettrovalvole_spento();

  // 2° Step *************************************

  Serial.println("Secondo Step");
  gioco_secondo_step();



  // 3° Step *************************************

  Serial.println("Terzo Step");

  motore_porta_apri();
  motore_fiori_apri();
  gioco_terzo_step();


  stato_fp = 1;
  stato_ff = 1;
  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPA) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFA) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }

    t0 = millis();
    dt = millis() - t0;

    if (dt >= INTERVALLO15) {
      led_spento();
      elettrovalvole_spento();

      t0 = millis();
    }
  }

  // 4° Step *************************************

  Serial.println("Quarto Step Chiusura");
  motore_porta_chiudi();
  motore_fiori_chiudi();

  stato_fp = 1;
  stato_ff = 1;

  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPC) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFC) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
  }

  digitalWrite(MUSIC, HIGH);

  delay(pausa);
}

void reset_tutto() {

  motore_porta_chiudi();
  motore_fiori_chiudi();

  stato_fp = 1;
  stato_ff = 1;

  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPC) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFC) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
  }
}

void motore_porta_stop() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
}

void motore_fiori_stop() {

  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, HIGH);
}

void motore_porta_apri() {

  digitalWrite(MPA, LOW);
  digitalWrite(MPI, HIGH);
}

void motore_fiori_apri() {

  digitalWrite(MFA, LOW);
  digitalWrite(MFI, HIGH);
}

void motore_porta_chiudi() {

  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, LOW);
}

void motore_fiori_chiudi() {

  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, LOW);
}

void led_spento() {

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, HIGH);
  digitalWrite(LED5, HIGH);
  digitalWrite(LED6, HIGH);
  digitalWrite(LED7, HIGH);
  digitalWrite(LED8, HIGH);
}

void elettrovalvole_spento() {

  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
  digitalWrite(EV4, HIGH);
}

void gioco_primo_step() {

  digitalWrite(EV1, LOW);

  t0 = millis();
  dt = millis() - t0;

  if (dt >= INTERVALLO7) {
    digitalWrite(EV1, HIGH);
    digitalWrite(EV2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    digitalWrite(LED5, LOW);

    t0 = millis();
  }


  dt = millis() - t0;

  if (dt >= INTERVALLO7) {

    digitalWrite(EV1, HIGH);
    digitalWrite(EV2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    digitalWrite(LED5, LOW);

    t0 = millis();
  }


  dt = millis() - t0;

  if (dt >= INTERVALLO7) {

    digitalWrite(EV2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);
    digitalWrite(EV4, LOW);
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);

    t0 = millis();
  }

  dt = millis() - t0;

  if (dt >= INTERVALLO7) {

    digitalWrite(EV4, HIGH);
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(EV3, LOW);
    digitalWrite(LED6, LOW);
    digitalWrite(LED7, LOW);

    t0 = millis();
  }

  dt = millis() - t0;

  if (dt >= INTERVALLO7) {

    digitalWrite(EV3, HIGH);
    digitalWrite(LED6, HIGH);
    digitalWrite(LED7, HIGH);

    t0 = millis();
  }
}


void gioco_secondo_step() {

  digitalWrite(EV1, LOW);

  t0 = millis();

  dt = millis() - t0;

  if (dt >= INTERVALLO4) {

    digitalWrite(EV2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    digitalWrite(LED5, LOW);

    t0 = millis();
  }

  dt = millis() - t0;

  if (dt >= INTERVALLO4) {

    digitalWrite(EV3, LOW);
    digitalWrite(EV4, LOW);
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED6, LOW);
    digitalWrite(LED7, LOW);

    t0 = millis();
  }

  dt = millis() - t0;

  if (dt >= INTERVALLO4) {
    digitalWrite(EV2, HIGH);
    digitalWrite(EV3, HIGH);
    digitalWrite(EV4, HIGH);

    led_spento();

    t0 = millis();
  }

  dt = millis() - t0;

  if (dt >= 2000) {

    digitalWrite(EV2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    digitalWrite(LED5, LOW);

    t0 = millis();
  }


  dt = millis() - t0;

  if (dt >= INTERVALLO4) {

    digitalWrite(EV3, LOW);
    digitalWrite(EV4, LOW);
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED6, LOW);
    digitalWrite(LED7, LOW);

    t0 = millis();
  }

  dt = millis() - t0;

  if (dt >= INTERVALLO4) {

    digitalWrite(EV2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    digitalWrite(LED5, LOW);

    t0 = millis();
  }

  dt = millis() - t0;

  if (dt >= INTERVALLO4) {

    digitalWrite(EV3, LOW);
    digitalWrite(EV4, LOW);
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED6, LOW);
    digitalWrite(LED7, LOW);

    t0 = millis();
  }

  dt = millis() - t0;

  if (dt >= 2000) {

    led_spento();
    elettrovalvole_spento();

    t0 = millis();
  }
}



void gioco_terzo_step() {

  digitalWrite(EV2, LOW);
  digitalWrite(EV3, LOW);
  digitalWrite(EV4, LOW);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);
  digitalWrite(LED8, LOW);
}

Salve, ho fatto un po’ di modifiche nello sketch proposto l’ultima volta, funziona tutto ma c’è un pezzo di sketch che non si esegue… Spiego cosa dovrebbe fare e cosa fa:

  • All’avvio si resetta tutto portando tutti i movimenti ai finecorsa iniziali.
  • Nel Primo Step c’è un piccolo gioco di luci ed acqua comandati da relè ed elettrovalvole con intervalli gestiti da delay. FUNZIONA
  • Nel secondo Step si apre una porta e salgono dei fiori con dei motorini a 24v gestiti da relè e finecorsa. FUNZIONA
  • Nel Terzo step cambia l’attivazione dei relè e delle elettrovalvole. FUNZIONA
  • Nel Quarto Step cambia di nuovo l’attivazione dei relè e delle elettrovalvole. FUNZIONA
    - Nel Quinto Step c’è una pedana con su una statua di Gesù che gira una volta verso destra e quando arriva al finecorsa e ritorna di nuovo in posizione sulla sinistra nell’altro finecorsa, CHE FUNZIONA, ma mentre gira la pedana verso destra e poi verso sinistra dovrebbe muovere il braccio che ha un solo finecorsa, quindi dovrebbe atttivarsi per 1,5 secondi si ferma e ritorna al finecorsa, tutto questo per la durata del movimento della pedana. Questo non riesco a far funzionare….
  • Tutto il resto funziona perfettamente.
    Qualcuno di buon cuore potrebbe darmi una mano a risolvere il problema?
    Ringrazio tutti anticipatamente.

Allego qui lo sketch:

#define FPA 2               //Finecorsa1 porta Apertura
#define FGA 8              //Finecorsa2 gesu Apertura
#define FFA 4               //Finecorsa3 fiori Apertura
#define FPC 5               //Finecorsa1 porta Chiusura
#define FGI 3              //Finecorsa2 gesu Chiusura
#define FFC 6               //Finecorsa3 fiori Chiusura
#define FBC 45              //Finecorsa braccio chiuso
#define MPA 47              //Relè Motore avanti porta
#define MPI 10              //Relè Motore indietro porta
#define MFA 11              //Relè Motore avanti fiori
#define MFI 12              //Relè Motore indietro fiori
#define MBA 22              //Motore braccio avanti
#define MBI 24              //Motore braccio indietro
#define MGA 26              //Motore gesù Avanti
#define MGI 28              //Motore gesù indietro
#define LED1 25             //Relè faretto 1
#define LED2 23             //Relè faretto 2
#define LED3 46             //Relè faretto 3
#define LED_GESU 27         //Led gesù
#define EV1 39              //Relè Elettro Valvola 1
#define EV2 41              //Relè Elettro Valvola 2
#define EV3 43              //Relè Elettro Valvola 3
#define MUSIC 49            //Relè musica
#define INTERVALLO4 4000    //Intervallo 4 secondi
#define INTERVALLO5 5000    //Intervallo 5 secondi
#define INTERVALLO7 7000    //Intervallo 7 secondi
#define INTERVALLO15 15000  //Intervallo 15 secondi
#define PAUSA_BRACCIO 1500  //Durata azione braccio

byte stato_fp = 1;
byte stato_ff = 1;
byte stato_fg = 1;
byte stato_fb = 1;
byte stato_fg1 = 1;

unsigned long pausa = 600000;  // aggiungere commento

unsigned long t0, dt;

int stato = 0;


void setup() {

  Serial.begin(9600);
  pinMode(FPA, INPUT_PULLUP);
  pinMode(FGA, INPUT_PULLUP);
  pinMode(FFA, INPUT_PULLUP);
  pinMode(FPC, INPUT_PULLUP);
  pinMode(FGI, INPUT_PULLUP);
  pinMode(FFC, INPUT_PULLUP);
  pinMode(FBC, INPUT_PULLUP);
  pinMode(MPA, OUTPUT);
  pinMode(MPI, OUTPUT);
  pinMode(MFA, OUTPUT);
  pinMode(MFI, OUTPUT);
  pinMode(MBA, OUTPUT);
  pinMode(MBI, OUTPUT);
  pinMode(MGA, OUTPUT);
  pinMode(MGI, OUTPUT);


  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, HIGH);
  digitalWrite(MBA, HIGH);
  digitalWrite(MBI, HIGH);
  digitalWrite(MGA, HIGH);
  digitalWrite(MGI, HIGH);

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED_GESU, OUTPUT);
  pinMode(EV1, OUTPUT);
  pinMode(EV2, OUTPUT);
  pinMode(EV3, OUTPUT);
  pinMode(MUSIC, OUTPUT);

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED_GESU, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
  digitalWrite(MUSIC, HIGH);

  motore_porta_stop();
  motore_fiori_stop();
  motore_braccio_stop();
  motore_gesu_stop();
  led_spento();
  elettrovalvole_spento();


  Serial.println("resetta tutte le posizioni");
  reset_tutto();

    //led_spento();
}



void loop() {
  switch (stato) {
    case 0:
      MainLoop();
      break;
    case 10:
      PrimoStep();
      break;
    case 20:
      SecondoStep();
      break;
    case 30:
      TerzoStep();
      break;
    case 40:
      QuartoStep();
      break;
    case 50:
      QuintoStep();
      break;
    case 60:
      SestoStep();
      break;
    case 70:
      SettimoStep();
      break;
    case 80:
      OttavoStep();
      break;
    case 90:
      Attesa();
      break;
  }
}



void MainLoop() {

  Serial.println("Main Loop");
  digitalWrite(MUSIC, LOW);

  //Gioco luci ed elettrovalvole numero 1

  

  stato = 10;
}

void PrimoStep() {

  Serial.println("Primo Step");

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  delay(INTERVALLO7);

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);

  delay(INTERVALLO7);

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  delay(INTERVALLO7);

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);

  delay(INTERVALLO7);

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  delay(INTERVALLO7);

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);

  delay(INTERVALLO7);


  stato = 20;
}

void SecondoStep() {

  Serial.println("Secondo Step");

  motore_fiori_apri();
  motore_porta_apri();
  

  stato_fp = 1;
  stato_ff = 1;
  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPA) == 0) {
      motore_porta_stop();
      digitalWrite(LED_GESU, LOW);
      stato_fp = 0;
    }
    if (digitalRead(FFA) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
  }

  

  stato = 30;
}

void TerzoStep() {

  Serial.println("Terzo Step");

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, HIGH);
   
stato = 40;
}

void QuartoStep() {

Serial.println("Quarto Step");

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);


  stato = 50;
}


void QuintoStep() {

  Serial.println("Quinto Step");

motore_gesu_avanti();

stato_fg = 1;

  while(stato_fg != 0) {

    if(digitalRead(FGI) == 0){
      motore_gesu_stop();
      
      stato_fg = 0;

      
    }
  }


  motore_braccio_avanti();

t0 = millis();
dt = (millis() - t0);

if(dt >= PAUSA_BRACCIO) {
  
motore_braccio_stop();

}

motore_braccio_indietro();

  stato_fb = 1;

  while (stato_fb != 0) {

     if (digitalRead(FBC) == 0) {
      motore_braccio_stop();
      stato_fb = 0;
    }
  }

  

  stato = 60;
}


void SestoStep() {
Serial.println("Sesto Step");

motore_gesu_indietro();

stato_fg1 = 1;

  while(stato_fg1 != 0) {

    if(digitalRead(FGA) == 0){
      motore_gesu_stop();
      
      stato_fg1 = 0;

      
    }
  }

  

stato = 70;
 
}



void SettimoStep() {
Serial.println("Settimo Step");


stato = 80;
}

void OttavoStep(){

  Serial.println("Ottavo Step");

motore_porta_chiudi();
  motore_fiori_chiudi();

  stato_fp = 1;
  stato_ff = 1;
  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPC) == 0) {
      motore_porta_stop();
      digitalWrite(LED_GESU, HIGH);
      stato_fp = 0;
    }
    if (digitalRead(FFC) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
  }


  delay(PAUSA_BRACCIO);

 

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  delay(INTERVALLO4);

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);

  delay(INTERVALLO4);

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  digitalWrite(MUSIC, LOW);

  stato = 90;



}






void Attesa() {
Serial.println("Pausa 10 minuti");
  delay(pausa);

  stato = 0;
}

void reset_tutto() {

  motore_gesu_indietro();

  delay(15000);
  motore_porta_chiudi();
  motore_fiori_chiudi();
    motore_braccio_indietro();

  stato_fp = 1;
  stato_ff = 1;
  stato_fg = 1;
  stato_fb = 1;

  while (stato_fp != 0 || stato_ff != 0 || stato_fg != 0 || stato_fb != 0) {
    if (digitalRead(FPC) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFC) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
    if (digitalRead(FGA) == 0) {
      motore_gesu_stop();
      stato_fg = 0;
    }
    if (digitalRead(FBC) == 0) {
      motore_braccio_stop();
      stato_fb = 0;
    }
  }
}

void motore_porta_stop() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
}

void motore_fiori_stop() {

  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, HIGH);
}

void motore_porta_apri() {

  digitalWrite(MPA, LOW);
  digitalWrite(MPI, HIGH);
}

void motore_fiori_apri() {

  digitalWrite(MFA, LOW);
  digitalWrite(MFI, HIGH);
}

void motore_porta_chiudi() {

  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, LOW);
}

void motore_fiori_chiudi() {

  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, LOW);
}

void led_spento() {

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
}

void elettrovalvole_spento() {

  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
}


void motore_braccio_avanti() {

  digitalWrite(MBA, LOW);
  digitalWrite(MBI, HIGH);
}


void motore_braccio_indietro() {

  digitalWrite(MBA, HIGH);
  digitalWrite(MBI, LOW);
}


void motore_braccio_stop() {

  digitalWrite(MBA, HIGH);
  digitalWrite(MBI, HIGH);
}

void motore_gesu_avanti() {

  digitalWrite(MGA, HIGH);
  digitalWrite(MGI, LOW);
}

void motore_gesu_indietro() {

  digitalWrite(MGA, LOW);
  digitalWrite(MGI, HIGH);
}

void motore_gesu_stop() {

  digitalWrite(MGA, HIGH);
  digitalWrite(MGI, HIGH);
}
void QuintoStep() {
    static byte istate = 0; // internal state
    switch (istate) {
        case 0:  // istate == 0
            Serial.println("Quinto Step");
            motore_gesu_avanti();
            motore_braccio_avanti();
            t0 = millis(); // salvo il tempo in t0
            // CHANGE STATE
            istate = 1; // seleziono lo stato da eseguire al prossimo ciclo di loop
            break;
            case 1:  // istate == 1
                dt = millis() - t0;
                if ( dt >= PAUSA_BRACCIO ) {
                    motore_braccio_stop();
                }
                 if ( digitalRead(FGI ) == 0 ) {
                     motore_gesu_stop();
                     motore_braccio_indietro();
                     // CHANGE STATE 
                     istate  = 2;
                }
                break;
            case 2:
                if (digitalRead(FBC) == 0) {
                    motore_braccio_stop();
                    istate = 0; // azzero lo stato interno
                    // CHANGE STATE
                    stato = 60;
                }
                break;
    } // end switch
  
} // end QuintoStep() 

Questa non è la soluzione, ma solo una possibile strada da seguire.
Da questa funzione dovresti ricavare le seguenti deduzioni:

  • Ciò che è stato eseguito e non voglio eseguirlo lo metto in un case alla cui fine seleziono il prossimo case da eseguire al prossimo ciclo di loop.
  • Ci deve sempre essere almeno una condizioni di uscita verso il prossimo case.
  • Le variabili statiche di funzione sono molto comode per evitare di spargere centinaio di variabili globali. Ricorda che esse mantengono lo stesso valore assegnato come accade alle variabili globali per cui molto spesso occorre azzerarle prima di cedere il controllo al prossimo stato.

Ciao.

l'ho inserito nel mio sketch ed ho applicato lo stesso ragionamento pure nell'SestoStep, ma il risultato è che dal TerzoStep mi va subito all'OttavoStep.... mi sta facendo impazzire...

#define FPA 2               //Finecorsa1 porta Apertura
#define FGA 8              //Finecorsa2 gesu Apertura
#define FFA 4               //Finecorsa3 fiori Apertura
#define FPC 5               //Finecorsa1 porta Chiusura
#define FGI 3              //Finecorsa2 gesu Chiusura
#define FFC 6               //Finecorsa3 fiori Chiusura
#define FBC 45              //Finecorsa braccio chiuso
#define MPA 47              //Relè Motore avanti porta
#define MPI 10              //Relè Motore indietro porta
#define MFA 11              //Relè Motore avanti fiori
#define MFI 12              //Relè Motore indietro fiori
#define MBA 22              //Motore braccio avanti
#define MBI 24              //Motore braccio indietro
#define MGA 26              //Motore gesù Avanti
#define MGI 28              //Motore gesù indietro
#define LED1 25             //Relè faretto 1
#define LED2 23             //Relè faretto 2
#define LED3 46             //Relè faretto 3
#define LED_GESU 27         //Led gesù
#define EV1 39              //Relè Elettro Valvola 1
#define EV2 41              //Relè Elettro Valvola 2
#define EV3 43              //Relè Elettro Valvola 3
#define MUSIC 49            //Relè musica
#define INTERVALLO4 4000    //Intervallo 4 secondi
#define INTERVALLO5 5000    //Intervallo 5 secondi
#define INTERVALLO7 7000    //Intervallo 7 secondi
#define INTERVALLO15 15000  //Intervallo 15 secondi
#define PAUSA_BRACCIO 1500  //Durata azione braccio

byte stato_fp = 1;
byte stato_ff = 1;
byte stato_fg = 1;
byte stato_fb = 1;
byte stato_fg1 = 1;

unsigned long pausa = 600000;  // aggiungere commento

unsigned long t0, dt;

int stato = 0;


void setup() {

  Serial.begin(9600);
  pinMode(FPA, INPUT_PULLUP);
  pinMode(FGA, INPUT_PULLUP);
  pinMode(FFA, INPUT_PULLUP);
  pinMode(FPC, INPUT_PULLUP);
  pinMode(FGI, INPUT_PULLUP);
  pinMode(FFC, INPUT_PULLUP);
  pinMode(FBC, INPUT_PULLUP);
  pinMode(MPA, OUTPUT);
  pinMode(MPI, OUTPUT);
  pinMode(MFA, OUTPUT);
  pinMode(MFI, OUTPUT);
  pinMode(MBA, OUTPUT);
  pinMode(MBI, OUTPUT);
  pinMode(MGA, OUTPUT);
  pinMode(MGI, OUTPUT);


  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, HIGH);
  digitalWrite(MBA, HIGH);
  digitalWrite(MBI, HIGH);
  digitalWrite(MGA, HIGH);
  digitalWrite(MGI, HIGH);

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED_GESU, OUTPUT);
  pinMode(EV1, OUTPUT);
  pinMode(EV2, OUTPUT);
  pinMode(EV3, OUTPUT);
  pinMode(MUSIC, OUTPUT);

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED_GESU, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
  digitalWrite(MUSIC, HIGH);

  motore_porta_stop();
  motore_fiori_stop();
  motore_braccio_stop();
  motore_gesu_stop();
  led_spento();
  elettrovalvole_spento();


  Serial.println("resetta tutte le posizioni");
  reset_tutto();

    //led_spento();
}



void loop() {
  switch (stato) {
    case 0:
      MainLoop();
      break;
    case 10:
      PrimoStep();
      break;
    case 20:
      SecondoStep();
      break;
    case 30:
      TerzoStep();
      break;
    case 40:
      QuartoStep();
      break;
    case 50:
      QuintoStep();
      break;
    case 60:
      SestoStep();
      break;
    case 70:
      SettimoStep();
      break;
    case 80:
      OttavoStep();
      break;
    case 90:
      Attesa();
      break;
  }
}



void MainLoop() {

  Serial.println("Main Loop");
  digitalWrite(MUSIC, LOW);

  //Gioco luci ed elettrovalvole numero 1

  

  stato = 10;
}

void PrimoStep() {

  Serial.println("Primo Step");

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  delay(INTERVALLO7);

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);

  delay(INTERVALLO7);

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  delay(INTERVALLO7);

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);

  delay(INTERVALLO7);

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  delay(INTERVALLO7);

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);

  delay(INTERVALLO7);


  stato = 20;
}

void SecondoStep() {

  Serial.println("Secondo Step");

  motore_fiori_apri();
  motore_porta_apri();
  

  stato_fp = 1;
  stato_ff = 1;
  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPA) == 0) {
      motore_porta_stop();
      digitalWrite(LED_GESU, LOW);
      stato_fp = 0;
    }
    if (digitalRead(FFA) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
  }

  

  stato = 30;
}

void TerzoStep() {

  Serial.println("Terzo Step");

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, HIGH);
   
stato = 40;
}

void QuartoStep() {

Serial.println("Quarto Step");

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);


  stato = 50;
}


void QuintoStep() {
static byte istate = 0; // internal state
    switch (istate) {
        case 0:  // istate == 0
            Serial.println("Quinto Step");
            motore_gesu_avanti();
            motore_braccio_avanti();
            t0 = millis(); // salvo il tempo in t0
            // CHANGE STATE
            istate = 1; // seleziono lo stato da eseguire al prossimo ciclo di loop
            break;
            case 1:  // istate == 1
                dt = millis() - t0;
                if ( dt >= PAUSA_BRACCIO ) {
                    motore_braccio_stop();
                }
                 if ( digitalRead(FGI ) == 0 ) {
                     motore_gesu_stop();
                     motore_braccio_indietro();
                     // CHANGE STATE 
                     istate  = 2;
                }
                break;
            case 2:
                if (digitalRead(FBC) == 0) {
                    motore_braccio_stop();
                    istate = 0; // azzero lo stato interno
                    // CHANGE STATE
                    stato = 60;
                }
                break;
    } // end switch
  
}


void SestoStep() {
    static byte istate = 0; // internal state
    switch (istate) {
        case 0:  //istate == 0
            Serial.println("Sesto Step");
            motore_gesu_indietro();
            motore_braccio_avanti();
            t0 = millis(); // salvo il tempo in t0
            // CHANGE STATE
            istate = 1; // seleziono lo stato da eseguire al prossimo ciclo di loop
            break;
            case 1:  // istate == 1
                dt = millis() - t0;
                if ( dt >= PAUSA_BRACCIO ) {
                    motore_braccio_stop();
                }
                 if ( digitalRead(FGA ) == 0 ) {
                     motore_gesu_stop();
                     motore_braccio_indietro();
                     // CHANGE STATE 
                     istate  = 2;
                }
                break;
            case 2:
                if (digitalRead(FBC) == 0) {
                    motore_braccio_stop();
                    istate = 0; // azzero lo stato interno
                    // CHANGE STATE
                    stato = 70;
                }
                break;
    } // end switch
  
} // end SestoStep() 

void SettimoStep() {
Serial.println("Settimo Step");


stato = 80;
}

void OttavoStep(){

  Serial.println("Ottavo Step");

motore_porta_chiudi();
  motore_fiori_chiudi();

  stato_fp = 1;
  stato_ff = 1;
  while (stato_fp != 0 || stato_ff != 0) {
    if (digitalRead(FPC) == 0) {
      motore_porta_stop();
      digitalWrite(LED_GESU, HIGH);
      stato_fp = 0;
    }
    if (digitalRead(FFC) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
  }


  delay(PAUSA_BRACCIO);

 

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(EV2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  delay(INTERVALLO4);

  digitalWrite(LED1, LOW);
  digitalWrite(EV1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(EV3, LOW);

  delay(INTERVALLO4);

  digitalWrite(LED1, HIGH);
  digitalWrite(EV1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(EV3, HIGH);

  digitalWrite(MUSIC, LOW);

  stato = 90;



}






void Attesa() {
Serial.println("Pausa 10 minuti");
  delay(pausa);

  stato = 0;
}

void reset_tutto() {

  motore_gesu_indietro();

  delay(15000);
  motore_porta_chiudi();
  motore_fiori_chiudi();
    motore_braccio_indietro();

  stato_fp = 1;
  stato_ff = 1;
  stato_fg = 1;
  stato_fb = 1;

  while (stato_fp != 0 || stato_ff != 0 || stato_fg != 0 || stato_fb != 0) {
    if (digitalRead(FPC) == 0) {
      motore_porta_stop();
      stato_fp = 0;
    }
    if (digitalRead(FFC) == 0) {
      motore_fiori_stop();
      stato_ff = 0;
    }
    if (digitalRead(FGA) == 0) {
      motore_gesu_stop();
      stato_fg = 0;
    }
    if (digitalRead(FBC) == 0) {
      motore_braccio_stop();
      stato_fb = 0;
    }
  }
}

void motore_porta_stop() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
}

void motore_fiori_stop() {

  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, HIGH);
}

void motore_porta_apri() {

  digitalWrite(MPA, LOW);
  digitalWrite(MPI, HIGH);
}

void motore_fiori_apri() {

  digitalWrite(MFA, LOW);
  digitalWrite(MFI, HIGH);
}

void motore_porta_chiudi() {

  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, LOW);
}

void motore_fiori_chiudi() {

  digitalWrite(MFA, HIGH);
  digitalWrite(MFI, LOW);
}

void led_spento() {

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
}

void elettrovalvole_spento() {

  digitalWrite(EV1, HIGH);
  digitalWrite(EV2, HIGH);
  digitalWrite(EV3, HIGH);
}


void motore_braccio_avanti() {

  digitalWrite(MBA, LOW);
  digitalWrite(MBI, HIGH);
}


void motore_braccio_indietro() {

  digitalWrite(MBA, HIGH);
  digitalWrite(MBI, LOW);
}


void motore_braccio_stop() {

  digitalWrite(MBA, HIGH);
  digitalWrite(MBI, HIGH);
}

void motore_gesu_avanti() {

  digitalWrite(MGA, HIGH);
  digitalWrite(MGI, LOW);
}

void motore_gesu_indietro() {

  digitalWrite(MGA, LOW);
  digitalWrite(MGI, HIGH);
}

void motore_gesu_stop() {

  digitalWrite(MGA, HIGH);
  digitalWrite(MGI, HIGH);
}

Dallo stato 10 salta allo stato 20, poi al 30, al 40, al 50 e al 60... Non c'è nulla che lo fermi.
Lo stato 30 deve essere di attesa, poi c'è il 40, il 50 di attesa, il 60, il 70 di attesa...
MainLoop(), poi, che significa?... Dal nome sembra che il resto del programma giri lì dentro! Forse è lo stato di riposo?

MainLoop() l'avevo messo come primo step ma poi l'ho lasciato solo per l'attivazione del relè della musica...
"Lo stato 30 deve essere di attesa..." che significa. Come si mette in attesa?

Non riesco a fare delle deduzioni dalle abbreviazioni FBC, FGI ecc, possibile che l'errore sia li. Analizza le condizioni if che se vere modificano il valore di istate.

case 0:
     stampa("Quinto Step")
     motore_gesu(AVANTI)
     motore_braccio(AVANTI)
     t0 = millis()
     istate = 1

Viene eseguito in un solo ciclo di loop, al prossimo viene eseguito in loop il case 1, qui ci sono entrambe i motori alimentati, questa porzione di codice ferma il braccio:

                dt = millis() - t0;
                if ( dt >= PAUSA_BRACCIO ) {
                    motore_braccio_stop();
                }

Le altre due if(... se vere cambiano lo stato, specie la if in case 2: che seleziona il case 60.

Ciao.

:grinning: :grinning:
FBC Finecorsa Braccio Chiuso.
FGI Finecorsa Gesù Indietro

Sono stato un pò creativo nel dare i nomi... :rofl: :rofl:

Ora provo un pò a vedere se capisco. Grazie comunque

Quando arriva a quello stato, ne esce solo quando è trascorso il tempo previsto:

case 20:
//...
t0=millis();
stato=30;
break;

case 30: // = delay (TEMPO30);
if (millis()-t0>=TEMPO30) stato=40;
break;

Guarda che lettere e parole nel codice sorgente sono gratis.... :upside_down_face:

Adesso ti ricordi cosa significano, ma dubito che sarà ancora vero tra 6 mesi ad esempio...

Solitamente scrivo tutto nei commenti...

#define FGA 8              //Finecorsa2 gesu Apertura
#define FFA 4               //Finecorsa3 fiori Apertura
#define FPC 5               //Finecorsa1 porta Chiusura
#define FGI 3              //Finecorsa2 gesu Chiusura
#define FFC 6               //Finecorsa3 fiori Chiusura
#define FBC 45              //Finecorsa braccio chiuso
#define MPA 47              //Relè Motore avanti porta
#define MPI 10              //Relè Motore indietro porta
#define MFA 11              //Relè Motore avanti fiori
#define MFI 12              //Relè Motore indietro fiori
#define MBA 22              //Motore braccio avanti
#define MBI 24              //Motore braccio indietro

Si ma va bene come hai fatto con i commenti, del resto tu hai davanti il progetto fisico e adesso io ho capito che pedana girevole su cui c'è gesu è abbreviato FGI. Sono io che ho difficoltà mie, per me la pedana gira a destra o sinistra poi cosa ci metto su non importa, quindi FC_PL fine corsa pedana left, come vedi anche io tendo a fare ciò che non andrebbe fatto, cioè mischiare le lingue. Ok, vedi se Serial.println() può esserti di aiuto per capire cosa accade con il codice in corsa. Puoi anche fargli stampare millis(), o dt o qualuque cosa ti pare. Anche un display alle volte aiuta a trovare il problema.

Ciao.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.