compliazione programma, 3 pulsanti indipendenti che funzionano allo stesso tempo

salve a tutti, sono nuovo del mondo arduino e chiedo aiuto a voi.
Praticamente devo comandare 3 led, con 3 pulsanti indipendeti con l'uno dall'altro, che facciano accendere e spegnere il led che desidero .
Il programma di cui sono in possesso è questo, compilato dal mio professore :

/*
Assegnazione variabili
*/
int M1; // Memoria 1: Led spento e dopo avere rilasciato S
int M2; // Memoria 2: Led acceso dopo aver premuto S
int M3; // Memoria 3: Led acceso dopo aver rilasciato S
int M4; // Memoria 4: Led spento dopo aver premuto S

int P = 5; // Pulsante di apertura

int M_P; // Memoria su cui viene memorizzato il valore del pulsante S

int LED1 = 8; // Led

void setup () {
  
 pinMode (P, INPUT);
  
 pinMode (LED1, OUTPUT);
 
 M1 = 1; // Attiva la memoria 1
  }

void loop () {
 M_P = digitalRead(P); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M1 == 1) && (M_S == 1)) {  
   M2 = 1;  // Attiva la memoria 2
   M1 = 0; // Disattiva la memoria 1
   digitalWrite (LED1, HIGH); // Accende il Led
  }  
  if ((M2 == 1) && (M_S == 0)) {  
   M3 = 1;  // Attiva la memoria 3
   M2 = 0; // Disattiva la memoria 2
    }
   if ((M3 == 1) && (M_S == 1)) {
   M4 = 1;  // Attiva la memoria 4
   M3 = 0; // Disattiva la memoria 3
   digitalWrite (Ka, LOW); // Spegne il Led
  }
  if ((M4 == 1) && (M_S == 0)) {  
   M1 = 1;  // Attiva la memoria 1
   M4 = 0; // Disattiva la memoria 4

  } 
  }

Il problema sta nel fatto che così per come è scritto posso comandare soltanto un led, visto che quando cerco di compliare il programma con le altre variabili non fa altro che darmi mille errori il void T.T Ho cercato diverse soluzioni in rete ma nessuna funzionante. Spero possiate aiutarmi Grazie in anticipo :slight_smile:

dacci lo sketch che da gli errori e gli errori.
Ciao Uwe

Ciao, intanto grazie per avermi risposto subito :slight_smile:

Ecco lo sketch "finale " che ho elaborato seguendo il primo :

/*
Assegnazione variabili
*/
int M1; // Memoria 1: Led spento e dopo avere rilasciato S
int M2; // Memoria 2: Led acceso dopo aver premuto S
int M3; // Memoria 3: Led acceso dopo aver rilasciato S
int M4; // Memoria 4: Led spento dopo aver premuto S

int P = 5; // Pulsante di apertura

int M_P; // Memoria su cui viene memorizzato il valore del pulsante S

int LED1 = 8; // Led

void setup () {
  
 pinMode (P, INPUT);
  
 pinMode (LED1, OUTPUT);
 
 M1 = 1; // Attiva la memoria 1
  }

void loop () {
 M_P = digitalRead(P); // Legge il valore del pulsante di avvio motore e lo conserva

  if ((M1 == 1) && (M_P == 1)) { 
   M2 = 1;  // Attiva la memoria 2
   M1 = 0; // Disattiva la memoria 1
   digitalWrite (LED1, HIGH); // Accende il Led
  }  
  if ((M2 == 1) && (M_P == 0)) {  
   M3 = 1;  // Attiva la memoria 3
   M2 = 0; // Disattiva la memoria 2
    }
   if ((M3 == 1) && (M_P == 1)) {
   M4 = 1;  // Attiva la memoria 4
   M3 = 0; // Disattiva la memoria 3
   digitalWrite (LED1, LOW); // Spegne il Led
  }
  if ((M4 == 1) && (M_P == 0)) {  
   M1 = 1;  // Attiva la memoria 1
   M4 = 0; // Disattiva la memoria 4

  } 
  } 
  
int M5; // Memoria 5: Led spento e dopo avere rilasciato S
int M6; // Memoria 6: Led acceso dopo aver premuto S
int M7; // Memoria 7: Led acceso dopo aver rilasciato S
int M8; // Memoria 8: Led spento dopo aver premuto S

int P1 = 9; // Pulsante di apertura

int M_P1; // Memoria su cui viene memorizzato il valore del pulsante S

int LED2 = 4; // Contattore avvio motore

void setup (int P1, int LED2) {
  
 pinMode (P1, INPUT);
  
 pinMode (LED2, OUTPUT);
 
 M5 = 1; // Attiva la memoria 1
  }

void loop (int M5, int M6, int M7, int M8) {
 M_P1 = digitalRead(P1); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M5 == 1) && (M_P1 == 1)) {  
   M6 = 1;  // Attiva la memoria 2
   M5 = 0; // Disattiva la memoria 1
   digitalWrite (LED2, HIGH); // Accende il Led
  }  
  if ((M6 == 1) && (M_P1 == 0)) {  
   M7 = 1;  // Attiva la memoria 3
   M6 = 0; // Disattiva la memoria 2
    }
   if ((M7 == 1) && (M_P1 == 1)) {
   M8 = 1;  // Attiva la memoria 4
   M7 = 0; // Disattiva la memoria 3
   digitalWrite (LED2, LOW); // Spegne il Led
  }
  if ((M8 == 1) && (M_P1 == 0)) {  
   M5 = 1;  // Attiva la memoria 1
   M8 = 0; // Disattiva la memoria 4

  } 
  } 
  
  
int M9; // Memoria 5: Led spento e dopo avere rilasciato S
int M10; // Memoria 6: Led acceso dopo aver premuto S
int M11; // Memoria 7: Led acceso dopo aver rilasciato S
int M12; // Memoria 8: Led spento dopo aver premuto S

int P2 = 10; // Pulsante di apertura

int M_P2; // Memoria su cui viene memorizzato il valore del pulsante S

int LED3 = 3; // Contattore avvio motore

void setup (int P1, int LED2) {
  
 pinMode (P2, INPUT);
  
 pinMode (LED3, OUTPUT);
 
 M9 = 1; // Attiva la memoria 1
  }

void loop (int M5, int M6, int M7, int M8) {
 M_P2 = digitalRead(P2); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M5 == 1) && (M_P2 == 1)) {  
   M10 = 1;  // Attiva la memoria 2
   M9 = 0; // Disattiva la memoria 1
   digitalWrite (LED3, HIGH); // Accende il Led
  }  
  if ((M6 == 1) && (M_P2 == 0)) {  
   M11 = 1;  // Attiva la memoria 3
   M10 = 0; // Disattiva la memoria 2
    }
   if ((M7 == 1) && (M_P2 == 1)) {
   M12 = 1;  // Attiva la memoria 4
   M11 = 0; // Disattiva la memoria 3
   digitalWrite (LED3, LOW); // Spegne il Led
  }
  if ((M8 == 1) && (M_P2 == 0)) {  
   M9 = 1;  // Attiva la memoria 1
   M12 = 0; // Disattiva la memoria 4

  } 
  }

ed ecco gli errori che mi da quando lo compilo:

Pulsante_led_2_0.ino: In function 'void setup(int, int)':
Pulsante_led_2_0:104: error: redefinition of 'void setup(int, int)'
Pulsante_led_2_0:59: error: 'void setup(int, int)' previously defined here
Pulsante_led_2_0.ino: In function 'void loop(int, int, int, int)':
Pulsante_led_2_0:113: error: redefinition of 'void loop(int, int, int, int)'
Pulsante_led_2_0:68: error: 'void loop(int, int, int, int)' previously defined here

Aspetto tua risposta :slight_smile:

Ps Il programma per come è scritto, se si toglie soltanto la terza parte, lo compila bene il programma e non da alcun errore.. però sul pratico, ovvero quando lo carico su arduino, il primo led con il primo pulsante funziona egregiamente, mentre il secondo non ne vuole sapere Ti allego il programma già pronto senza la terza parte

/*
Assegnazione variabili
*/
int M1; // Memoria 1: Led spento e dopo avere rilasciato S
int M2; // Memoria 2: Led acceso dopo aver premuto S
int M3; // Memoria 3: Led acceso dopo aver rilasciato S
int M4; // Memoria 4: Led spento dopo aver premuto S

int P = 5; // Pulsante di apertura

int M_P; // Memoria su cui viene memorizzato il valore del pulsante S

int LED1 = 8; // Led

void setup () {
  
 pinMode (P, INPUT);
  
 pinMode (LED1, OUTPUT);
 
 M1 = 1; // Attiva la memoria 1
  }

void loop () {
 M_P = digitalRead(P); // Legge il valore del pulsante di avvio motore e lo conserva

  if ((M1 == 1) && (M_P == 1)) { 
   M2 = 1;  // Attiva la memoria 2
   M1 = 0; // Disattiva la memoria 1
   digitalWrite (LED1, HIGH); // Accende il Led
  }  
  if ((M2 == 1) && (M_P == 0)) {  
   M3 = 1;  // Attiva la memoria 3
   M2 = 0; // Disattiva la memoria 2
    }
   if ((M3 == 1) && (M_P == 1)) {
   M4 = 1;  // Attiva la memoria 4
   M3 = 0; // Disattiva la memoria 3
   digitalWrite (LED1, LOW); // Spegne il Led
  }
  if ((M4 == 1) && (M_P == 0)) {  
   M1 = 1;  // Attiva la memoria 1
   M4 = 0; // Disattiva la memoria 4

  } 
  } 
  
int M5; // Memoria 5: Led spento e dopo avere rilasciato S
int M6; // Memoria 6: Led acceso dopo aver premuto S
int M7; // Memoria 7: Led acceso dopo aver rilasciato S
int M8; // Memoria 8: Led spento dopo aver premuto S

int P1 = 9; // Pulsante di apertura

int M_P1; // Memoria su cui viene memorizzato il valore del pulsante S

int LED2 = 4; // Contattore avvio motore

void setup (int P1, int LED2) {
  
 pinMode (P1, INPUT);
  
 pinMode (LED2, OUTPUT);
 
 M5 = 1; // Attiva la memoria 1
  }

void loop (int M5, int M6, int M7, int M8) {
 M_P1 = digitalRead(P1); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M5 == 1) && (M_P1 == 1)) {  
   M6 = 1;  // Attiva la memoria 2
   M5 = 0; // Disattiva la memoria 1
   digitalWrite (LED2, HIGH); // Accende il Led
  }  
  if ((M6 == 1) && (M_P1 == 0)) {  
   M7 = 1;  // Attiva la memoria 3
   M6 = 0; // Disattiva la memoria 2
    }
   if ((M7 == 1) && (M_P1 == 1)) {
   M8 = 1;  // Attiva la memoria 4
   M7 = 0; // Disattiva la memoria 3
   digitalWrite (LED2, LOW); // Spegne il Led
  }
  if ((M8 == 1) && (M_P1 == 0)) {  
   M5 = 1;  // Attiva la memoria 1
   M8 = 0; // Disattiva la memoria 4

  } 
  }

Una sola funzione loop() e una sola funzione setup() sono permesse, cambia nome o se proprio vuoi usare lo stesso nome (sconsigliato) fa in modo che abbiano un numero di parametri differente, altrimenti il compilatore C++ non è in grado di capire la differenza tra loop(int a) e loop(byte b).

Se devi ripetere n volte una porzione di codice usa l'istruzione for, oppure sfrutta la funzione loop() principale che al termine riparte e così per sempre.

Ti prego non dirmi che quel codice l'ho ha realmente scritto un professore.
PS: si capisce che è scritto da un principiante.

Ciao.

Ciao, Grazie della risposta, vediamo se ho capito bene quello che vuoi dirmi, invece del void loop dovrei mettere 3 cicli For oppure delle funzioni loop dopo il void loop? Io so proprio l'essenziale di C++, e conosco fino al ciclo For (printf, scanf, if, do, do while, else). Infatti sia il void che il loop sono ancora due estranei, non è che potresti almeno scrivermi la funzione elementare di queste funzioni così provo a compilarlo? :slight_smile:

Altra domanda, cosa vuoi dire con cambia nome o se vuoi usare lo stesso nome cambia/aggiungi numeri alle variabili? È simile a come ho fatto Io? Aspetto vostra risposta :slight_smile:

Ps si l'ha scritto un professore che si diletta con Arduino, si a voglia se è un principiante xD anche se a dire il vero questo programma era stato creato per l' avviamento di un motore xD.

Non vai molto lontano senza le basi del C++.

I nomi di funzione, variabili ecc, per il compilatore sono simboli che deve risolvere in indirizzi di memoria, se dai lo stesso nome a due funzioni, il compilatore non è in grado di risolvere i simboli in indirizzi.

Il C++ permette il "sovraccarico" (il C no), questo ci permette di chiamare le funzioni tutte con lo stesso nome, solo se il numero (quantità) di argomenti è diverso, o in alcuni casi il tipo di argomento deve essere diverso.

In sostanza conoscendo le regole del C++ si possono creare 1,2,3,4 ecc funzioni con lo stesso nome, ma si deve sapere come fare per evitare ambiguità.

void loop() e setup() sono funzioni tipiche di Arduino, la funzione setup() viene eseguita solo una vola dopo il reset, poi si passa alla funzione loop(). La funzione loop cicla sempre come se fosse while (true) { // codice in loop }

Ciao.

Ciao e Grazie della risposta,
Ho notato che non si va molto lontano senza basi di C e C++, Ma putroppo per adesso mi serve farfunzionare sto programmino.

seguendo quello che mi hai detto ho modificato il programma strutturandolo così con il loop

/*
Assegnazione variabili
*/
int M1; // Memoria 1: Led spento e dopo avere rilasciato S
int M2; // Memoria 2: Led acceso dopo aver premuto S
int M3; // Memoria 3: Led acceso dopo aver rilasciato S
int M4; // Memoria 4: Led spento dopo aver premuto S
int M5; // Memoria 5: Led spento e dopo avere rilasciato S
int M6; // Memoria 6: Led acceso dopo aver premuto S
int M7; // Memoria 7: Led acceso dopo aver rilasciato S
int M8; // Memoria 8: Led spento dopo aver premuto S
int M9; // Memoria 5: Led spento e dopo avere rilasciato S
int M10; // Memoria 6: Led acceso dopo aver premuto S
int M11; // Memoria 7: Led acceso dopo aver rilasciato S
int M12; // Memoria 8: Led spento dopo aver premuto S



int P = 5; // Pulsante di apertura

int P1 = 9; // Pulsante di apertura

int P2 = 10; // Pulsante di apertura


int M_P; // Memoria su cui viene memorizzato il valore del pulsante S

int M_P1; // Memoria su cui viene memorizzato il valore del pulsante S

int M_P2; // Memoria su cui viene memorizzato il valore del pulsante S

int LED1 = 8; // Led

int LED2 = 4; // Contattore avvio motore

int LED3 = 3; // Contattore avvio motore

void setup () {
  
 pinMode (P, INPUT);
  
 pinMode (LED1, OUTPUT);
 
 M1 = 1; // Attiva la memoria 1
  
 pinMode (P1, INPUT);
  
 pinMode (LED2, OUTPUT);
 
 M5 = 1; // Attiva la memoria 1

 pinMode (P2, INPUT);
  
 pinMode (LED3, OUTPUT);
 
 M9 = 1; // Attiva la memoria 1
 
  }
  
  void loop () {
    
 
      M_P = digitalRead(P); // Legge il valore del pulsante di avvio motore e lo conserva

  if ((M1 == 1) && (M_P == 1)) { 
   M2 = 1;  // Attiva la memoria 2
   M1 = 0; // Disattiva la memoria 1
   digitalWrite (LED1, HIGH); // Accende il Led
  }  
  if ((M2 == 1) && (M_P == 0)) {  
   M3 = 1;  // Attiva la memoria 3
   M2 = 0; // Disattiva la memoria 2
    }
   if ((M3 == 1) && (M_P == 1)) {
   M4 = 1;  // Attiva la memoria 4
   M3 = 0; // Disattiva la memoria 3
   digitalWrite (LED1, LOW); // Spegne il Led
  }
  if ((M4 == 1) && (M_P == 0)) {  
   M1 = 1;  // Attiva la memoria 1
   M4 = 0; // Disattiva la memoria 4

  } 
  } 
     loop {
       M_P1 = digitalRead(P1); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M5 == 1) && (M_P1 == 1)) {  
   M6 = 1;  // Attiva la memoria 2
   M5 = 0; // Disattiva la memoria 1
   digitalWrite (LED2, HIGH); // Accende il Led
  }  
  if ((M6 == 1) && (M_P1 == 0)) {  
   M7 = 1;  // Attiva la memoria 3
   M6 = 0; // Disattiva la memoria 2
    }
   if ((M7 == 1) && (M_P1 == 1)) {
   M8 = 1;  // Attiva la memoria 4
   M7 = 0; // Disattiva la memoria 3
   digitalWrite (LED2, LOW); // Spegne il Led
  }
  if ((M8 == 1) && (M_P1 == 0)) {  
   M5 = 1;  // Attiva la memoria 1
   M8 = 0; // Disattiva la memoria 4

  } 
  } 
      loop {
   M_P2 = digitalRead(P2); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M5 == 1) && (M_P2 == 1)) {  
   M10 = 1;  // Attiva la memoria 2
   M9 = 0; // Disattiva la memoria 1
   digitalWrite (LED3, HIGH); // Accende il Led
  }  
  if ((M6 == 1) && (M_P2 == 0)) {  
   M11 = 1;  // Attiva la memoria 3
   M10 = 0; // Disattiva la memoria 2
    }
   if ((M7 == 1) && (M_P2 == 1)) {
   M12 = 1;  // Attiva la memoria 4
   M11 = 0; // Disattiva la memoria 3
   digitalWrite (LED3, LOW); // Spegne il Led
  }
  if ((M8 == 1) && (M_P2 == 0)) {  
   M9 = 1;  // Attiva la memoria 1
   M12 = 0; // Disattiva la memoria 4

  } 
  } 
   
    }

e compilandolo vengono fuori questi errori

sketch_jun13a:85: error: function definition does not declare parameters
sketch_jun13a:108: error: function definition does not declare parameters
sketch_jun13a:132: error: expected declaration before '}' token

Mentre compilandolo con un ciclo for infinito (;;:wink:

/*
Assegnazione variabili
*/
int M1; // Memoria 1: Led spento e dopo avere rilasciato S
int M2; // Memoria 2: Led acceso dopo aver premuto S
int M3; // Memoria 3: Led acceso dopo aver rilasciato S
int M4; // Memoria 4: Led spento dopo aver premuto S
int M5; // Memoria 5: Led spento e dopo avere rilasciato S
int M6; // Memoria 6: Led acceso dopo aver premuto S
int M7; // Memoria 7: Led acceso dopo aver rilasciato S
int M8; // Memoria 8: Led spento dopo aver premuto S
int M9; // Memoria 5: Led spento e dopo avere rilasciato S
int M10; // Memoria 6: Led acceso dopo aver premuto S
int M11; // Memoria 7: Led acceso dopo aver rilasciato S
int M12; // Memoria 8: Led spento dopo aver premuto S



int P = 5; // Pulsante di apertura

int P1 = 4; // Pulsante di apertura

int P2 = 3; // Pulsante di apertura


int M_P; // Memoria su cui viene memorizzato il valore del pulsante S

int M_P1; // Memoria su cui viene memorizzato il valore del pulsante S

int M_P2; // Memoria su cui viene memorizzato il valore del pulsante S

int LED1 = 8; // Led

int LED2 = 9; // Contattore avvio motore

int LED3 = 10; // Contattore avvio motore

void setup () {
  
 pinMode (P, INPUT);
  
 pinMode (LED1, OUTPUT);
 
 M1 = 1; // Attiva la memoria 1
  
 pinMode (P1, INPUT);
  
 pinMode (LED2, OUTPUT);
 
 M5 = 1; // Attiva la memoria 1

 pinMode (P2, INPUT);
  
 pinMode (LED3, OUTPUT);
 
 M9 = 1; // Attiva la memoria 1
 
  }
  
  void loop () {
    
 
      M_P = digitalRead(P); // Legge il valore del pulsante di avvio motore e lo conserva

  if ((M1 == 1) && (M_P == 1)) { 
   M2 = 1;  // Attiva la memoria 2
   M1 = 0; // Disattiva la memoria 1
   digitalWrite (LED1, HIGH); // Accende il Led
  }  
  if ((M2 == 1) && (M_P == 0)) {  
   M3 = 1;  // Attiva la memoria 3
   M2 = 0; // Disattiva la memoria 2
    }
   if ((M3 == 1) && (M_P == 1)) {
   M4 = 1;  // Attiva la memoria 4
   M3 = 0; // Disattiva la memoria 3
   digitalWrite (LED1, LOW); // Spegne il Led
  }
  if ((M4 == 1) && (M_P == 0)) {  
   M1 = 1;  // Attiva la memoria 1
   M4 = 0; // Disattiva la memoria 4

  } 
  } 
     for (;;;) {
       M_P1 = digitalRead(P1); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M5 == 1) && (M_P1 == 1)) {  
   M6 = 1;  // Attiva la memoria 2
   M5 = 0; // Disattiva la memoria 1
   digitalWrite (LED2, HIGH); // Accende il Led
  }  
  if ((M6 == 1) && (M_P1 == 0)) {  
   M7 = 1;  // Attiva la memoria 3
   M6 = 0; // Disattiva la memoria 2
    }
   if ((M7 == 1) && (M_P1 == 1)) {
   M8 = 1;  // Attiva la memoria 4
   M7 = 0; // Disattiva la memoria 3
   digitalWrite (LED2, LOW); // Spegne il Led
  }
  if ((M8 == 1) && (M_P1 == 0)) {  
   M5 = 1;  // Attiva la memoria 1
   M8 = 0; // Disattiva la memoria 4

  } 
  } 
       for (;;;) {
   M_P2 = digitalRead(P2); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M5 == 1) && (M_P2 == 1)) {  
   M10 = 1;  // Attiva la memoria 2
   M9 = 0; // Disattiva la memoria 1
   digitalWrite (LED3, HIGH); // Accende il Led
  }  
  if ((M6 == 1) && (M_P2 == 0)) {  
   M11 = 1;  // Attiva la memoria 3
   M10 = 0; // Disattiva la memoria 2
    }
   if ((M7 == 1) && (M_P2 == 1)) {
   M12 = 1;  // Attiva la memoria 4
   M11 = 0; // Disattiva la memoria 3
   digitalWrite (LED3, LOW); // Spegne il Led
  }
  if ((M8 == 1) && (M_P2 == 0)) {  
   M9 = 1;  // Attiva la memoria 1
   M12 = 0; // Disattiva la memoria 4

  } 
  } 
   
    }

e da questi errori,

sketch_jun13a_for:85: error: expected unqualified-id before 'for'
sketch_jun13a_for:85: error: expected unqualified-id before ')' token

Sai dirmi qualcosa in più? Vi ringrazio sempre, aspetto risposta a presto :wink:

loop {

Non esiste l'istruzione loop { }.

cicli infiniti:
while (true) { // your code }
for ( ; ; ) { // your code }

Ho notato che non si va molto lontano senza basi di C e C++, Ma putroppo per adesso mi serve farfunzionare sto programmino.

Sarà un percorso in salita pieno di buche e burroni, senza segnaletica e nel buio più pesto che si possa immaginare, non intraprenderei mai un percorso simile nonostante il mio coraggio.

PS: Se il tempo che hai speso per scrivere il programma è di circa una settimana e tu lo avessi investito a
studiare le basi C, ora saresti allo stesso punto, cioè il programma non esiste ma hai le informazioni di base per scriverlo, cioè avresti a mio parere guadagnato 1 settimana per raggiungere l'obbiettivo a breve scadenza.

Ciao.

ciao, ti ringrazio della risposta, e dei tuoi suggerimenti, mi sono stati molto utili.

Infatti compliando il programma con i tuoi suggerimenti sono riuscito a creare questo :

/*
Assegnazione variabili
*/
int M1; // Memoria 1: Led spento e dopo avere rilasciato S
int M2; // Memoria 2: Led acceso dopo aver premuto S
int M3; // Memoria 3: Led acceso dopo aver rilasciato S
int M4; // Memoria 4: Led spento dopo aver premuto S
int M5; // Memoria 5: Led spento e dopo avere rilasciato S
int M6; // Memoria 6: Led acceso dopo aver premuto S
int M7; // Memoria 7: Led acceso dopo aver rilasciato S
int M8; // Memoria 8: Led spento dopo aver premuto S
int M9; // Memoria 9: Led spento e dopo avere rilasciato S
int M10; // Memoria 10: Led acceso dopo aver premuto S
int M11; // Memoria 11: Led acceso dopo aver rilasciato S
int M12; // Memoria 12: Led acceso dopo aver rilasciato S

int P = 5; // Pulsante di apertura

int P1 = 6; // Pulsante di apertura

int P2 = 3; // Pulsante di apertura

int M_P; // Memoria su cui viene memorizzato il valore del pulsante S

int M_P1; // Memoria su cui viene memorizzato il valore del pulsante S

int M_P2; // Memoria su cui viene memorizzato il valore del pulsante S

int LED1 = 8; // Led

int LED2 = 9; // Contattore avvio motore

int LED3 = 10; // Contattore avvio motore

void setup () {
  
 pinMode (P, INPUT);
  
 pinMode (LED1, OUTPUT);
 
 M1 = 1; // Attiva la memoria 1
  
 pinMode (P1, INPUT);
  
 pinMode (LED2, OUTPUT);
 
 M5 = 1; // Attiva la memoria 1

 pinMode (P2, INPUT);
  
 pinMode (LED3, OUTPUT);
 
 M9 = 1; // Attiva la memoria 1
   }
  
  void loop () {
    
 for (;;) {
 M_P = digitalRead(P); // Legge il valore del pulsante di avvio motore e lo conserva

  if ((M1 == 1) && (M_P == 1)) { 
   M2 = 1;  // Attiva la memoria 2
   M1 = 0; // Disattiva la memoria 1
   digitalWrite (LED1, HIGH); // Accende il Led
  }  
  if ((M2 == 1) && (M_P == 0)) {  
   M3 = 1;  // Attiva la memoria 3
   M2 = 0; // Disattiva la memoria 2
    }
   if ((M3 == 1) && (M_P == 1)) {
   M4 = 1;  // Attiva la memoria 4
   M3 = 0; // Disattiva la memoria 3
   digitalWrite (LED1, LOW); // Spegne il Led
  }
  if ((M4 == 1) && (M_P == 0)) {  
   M1 = 1;  // Attiva la memoria 1
   M4 = 0; // Disattiva la memoria 4

  } 
  M_P1 = digitalRead(P1); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M5 == 1) && (M_P1 == 1)) {  
   M6 = 1;  // Attiva la memoria 2
   M5 = 0; // Disattiva la memoria 1
   digitalWrite (LED2, HIGH); // Accende il Led
  }  
  if ((M6 == 1) && (M_P1 == 0)) {  
   M7 = 1;  // Attiva la memoria 3
   M6 = 0; // Disattiva la memoria 2
    }
   if ((M7 == 1) && (M_P1 == 1)) {
   M8 = 1;  // Attiva la memoria 4
   M7 = 0; // Disattiva la memoria 3
   digitalWrite (LED2, LOW); // Spegne il Led
  }
  if ((M8 == 1) && (M_P1 == 0)) {  
   M5 = 1;  // Attiva la memoria 1
   M8 = 0; // Disattiva la memoria 4

  }
  
  M_P2 = digitalRead(P2); // Legge il valore del pulsante di avvio motore e lo conserva

   if ((M9 == 1) && (M_P2 == 1)) {  
   M10 = 1;  // Attiva la memoria 2
   M9 = 0; // Disattiva la memoria 1
   digitalWrite (LED3, HIGH); // Accende il Led
  }  
  if ((M10 == 1) && (M_P2 == 0)) {  
   M11 = 1;  // Attiva la memoria 3
   M10 = 0; // Disattiva la memoria 2
    }
   if ((M11 == 1) && (M_P2 == 1)) {
   M12 = 1;  // Attiva la memoria 4
   M11 = 0; // Disattiva la memoria 3
   digitalWrite (LED3, LOW); // Spegne il Led
  }
  if ((M12 == 1) && (M_P2 == 0)) {  
   M9 = 1;  // Attiva la memoria 1
   M12 = 0; // Disattiva la memoria 4

  }

  }
  }

funziona sia al livello di compliazione sia al livello di hardware ti ringrazio tantissimo :smiley:

Ultimo consiglio.
Prima di pubblicare il codice usa la funzione di formattazione automatica presente nel menù strumenti dell'IDE. Da al codice un aspetto decisamente più leggibile. :grin:

PaoloP:
Ultimo consiglio.
Prima di pubblicare il codice usa la funzione di formattazione automatica presente nel menù strumenti dell'IDE. Da al codice un aspetto decisamente più leggibile. :grin:

Concordo in pieno e inoltre visto che il codice funziona dedica un poco di tempo a rendere il codice più leggibile.

/*
Assegnazione variabili
*/
int M1;

Non stai assegnando niente, ma dichiarando.
M1, può voler dire tutto o niente, più chiaro ed esplicito: memory1 o altro nome che inequivocabile.

int P1 = 6; // Pulsante di apertura

non esistono pin numerati negativi quindi int è un spreco di risorse e non fa capire che valore conterrà, meglio
byte buttonToOpenPin = 6; // è inequivocabile che è un pulsante che serve per aprire e 6 è il pin a cui è connesso.

Ciao.