funzione reset programmato

Buon Giorno

avrei bisogno di un comando, se c'è... , di programmazione, con il quale far ripartire uno sketch da capo, spiego meglio: ho bisogno al terzo azionamento di un pulsante, di attivare una funzione che azzeri tutto e ricominci da capo il mio intero sketch.
so come fare per fargli contare gli azionamenti ma non sono a conoscenza se ci sia la possibilità di fare ciò di cui ho bisogno...

Ripartire da zero o resettare? Sono 2 cose completamente differenti.

Per ripartire da zero puoi semplicemente racchiudere nel loop 2 funzioni in sequenza: la prima inizializza tutte le variabili, la seconda esegue il codice principale. Quando esci dalla seconda, il loop si ripete e quindi viene richiamata la funzione che inizializza tutto e poi il codice principale.

void loop() {
  inizializza();
  esecuzione();
}

Se vuoi davvero resettare l'Arduino, va usato il watchdog. Devi attivarlo e poi infilarti in un loop infinito (tipo un while(1)). Il watchdog resetterà materialmente l'Arduino, facendo ripartire la scheda (quasi) come fosse stata data alimentazione.

questo è il mio programma, come devo inserire quella funzione "inizializza" etc?

int inter1;
int giri=0;
int inter2;
int inter3;
int pas=0;

void setup(){
  pinMode(10, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(12,INPUT);
  pinMode(2,INPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,INPUT);
  pinMode(6,OUTPUT);
}

void loop(){
inter1=digitalRead(12);
if ((inter1==HIGH)and (giri==0))
{
  digitalWrite(10,HIGH);
  delay(700);
  digitalWrite(10,LOW);
giri=1;
delay(200);
 }
 else if ((inter1==HIGH) and (giri==1))
 {
 digitalWrite(10,HIGH);
  delay(1400);
  digitalWrite(10,LOW);
 giri=2;
 delay(200);
 }
 else if ((inter1==HIGH) and (giri==2)){
 digitalWrite(10,HIGH);
 
 giri=3;
 delay(200);
 }
 else if ((inter1==HIGH) and (giri==3)){
 digitalWrite(8,HIGH);
  delay(700);
  digitalWrite(8,LOW);
 giri=4;
 delay(200);}
 
 else if ((inter1==HIGH) and (giri==4))
 {
   digitalWrite(8,HIGH);
  delay(1400);
  digitalWrite(8,LOW);
 giri=5;
 delay(200);
 }
 
 else if ((inter1==HIGH) and (giri==5))
 {
 digitalWrite(8,HIGH);
 giri=6;
 delay(200);
 }
 
 else if ((inter1==HIGH) and (giri==6))
 {
   digitalWrite(9,HIGH);
  delay(700);
  digitalWrite(9,LOW);
 giri=7;
 delay(200);
 }
 
 else if ((inter1==HIGH) and (giri==7))
 {
    digitalWrite(9,HIGH);
  delay(1400);
  digitalWrite(9,LOW);
 giri=8;
 delay(200);
 }
 
 else if ((inter1==HIGH) and (giri==8))
 {
 digitalWrite(9,HIGH);  
 giri=9;
 delay(200);
 }
 
 else if ((inter1==HIGH) and (giri==9))
 {
   digitalWrite(10,LOW);
   delay(450);
   digitalWrite(8,LOW);
   delay(450);
   digitalWrite(9,LOW);
   delay(450);
   digitalWrite(10,HIGH);
   delay(350);
   digitalWrite(8,HIGH);
   delay(350);
   digitalWrite(9,HIGH);
   delay(350);
   digitalWrite(10,LOW);
   delay(200);
   digitalWrite(8,LOW);
   delay(200);
   digitalWrite(9,LOW);
   delay(200);
   digitalWrite(10,HIGH);
   delay(100);
   digitalWrite(8,HIGH);
   delay(100);
   digitalWrite(9,HIGH);
   delay(100);
   digitalWrite(10,LOW);
   delay(75);
   digitalWrite(8,LOW);
   delay(75);
   digitalWrite(9,LOW);
   delay(40);
   digitalWrite(10,HIGH);
   delay(40);
   digitalWrite(8,HIGH);
   delay(40);
   digitalWrite(9,HIGH);
   delay(40);
   digitalWrite(10,LOW);
   delay(40);
   digitalWrite(8,LOW);
   delay(40);
   digitalWrite(9,LOW);
   delay(40);
   digitalWrite(10,HIGH);
   delay(40);
   digitalWrite(8,HIGH);
   delay(40);
   digitalWrite(9,HIGH);
   delay(40);
   digitalWrite(10,LOW);
   delay(20);
   digitalWrite(8,LOW);
   delay(20);
   digitalWrite(9,LOW);
   delay(20);
   digitalWrite(10,HIGH);
   delay(20);
   digitalWrite(8,HIGH);
   delay(20);
   digitalWrite(9,HIGH);
   delay(1500);
   digitalWrite(8,LOW);
   digitalWrite(9,LOW);
   digitalWrite(10,LOW);
 giri=0;
 delay(200);
 }
 ///fine gioco scivolo e percorso con luci led/// inizio 
 //inizio motorini mulino e estrattore pallina
 
 inter2=digitalRead(2);
if (inter2==HIGH)
{
digitalWrite(3,HIGH);
delay(2500);
digitalWrite(4,HIGH);
delay(1500);
digitalWrite(4,LOW);
delay(2000);
digitalWrite(3,LOW);
 }
///fine gioco mulino inizio gioco tunnel con led

inter3=digitalRead(5);
if ((inter3==HIGH)and(pas==0))
{
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(80);
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(80);
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(80);
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(80);
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(80);
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(80);
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(50);
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(80);
digitalWrite(6,HIGH);
delay(80);
digitalWrite(6,LOW);
delay(80);
pas=1;
delay(200);
}

else if  ((inter3==HIGH) and (pas==1))
{
digitalWrite(6,HIGH);
delay(350);
digitalWrite(6,LOW);
delay(350);
digitalWrite(6,HIGH);
delay(350);
digitalWrite(6,LOW);
delay(350);
digitalWrite(6,HIGH);
delay(350);
digitalWrite(6,LOW);
delay(350);

pas=2;
delay(200);
}
else if  ((inter3==HIGH) and (pas==2))
{
digitalWrite(6,HIGH);
delay(1500);
digitalWrite(6,LOW);
delay(200);
pas=3;
delay(200);
}
else if  ((inter3==HIGH) and (pas==3))
{
digitalWrite(6,HIGH);
pas=4;
delay(200);
}
else if  ((inter3==HIGH) and (pas==4))
{
digitalWrite(6,LOW);
pas=0;
delay(200);
}
///fine gioco del tunnel con i passaggi a luci led

 }

La funzione inizializza() non esiste in Arduino, è un nome che ho usato io di fantasia. Serviva solo a farti capire che dovevi spezzettare il codice principale in più funzioni secondarie e riorganizzare tutto.

Anzi, visto che ci sei rivedi un pò il tuo programma, mi sembra abbastanza incasinato. C'è una sfilza di "else if" tutti con 2 test, di cui uno è sempre il controllo se un input è HIGH. Potresti eliminarlo e mettere un if iniziale entro cui racchiudere tutto il resto. A questo punto, potresti usare switch..case, che è più indicato per questo genere di controlli.

intanto grazie per la tua pazienza.. XD

ho visto adesso un video che spiega il comando swich..case , più o meno ho capito, ma provo a spiegare meglio: sto costruendo un flipper di legno piccolo per mio figlio, il programma che ho postato aziona varie parti del flipper e mi funziona bene così , ai vari passaggi della pallina fa qualcosa in varie parti, volevo però mettere un pulsante fine corsa (che già uso) quando la pallina va in buca 3 volte , alla terza vorrei che tutto il programma , indipendentemente dallo stato in cui si trova , ripartisse da capo , fine partita per intendersi ... cosa mi consigli?

E poi in C mica esiste "and" devi usare && :astonished:

nid69ita:
E poi in C mica esiste "and" devi usare && :astonished:
http://arduino.cc/en/Reference/Boolean

ciao nid69ita

non lo sapevo... comunque funziona, non ho idea del perché ma questo programma è già operativo sul mio flipper e funziona perfettamente

nid69ita:
E poi in C mica esiste "and" devi usare && :astonished:
http://arduino.cc/en/Reference/Boolean

In C Ansi no, in C++ si, basta includere iso646.h per i token alternativi degli operatori logici, Arduino usa il C++ e tale direttiva è inclusa in automatico dal compilatore.

Per riprendere l'indicazione di leo72, praticamente il tuo loop di ora lo fai diventare una funzione a parte (ad esempio "esecuzione"), mentre la definizione delle variabili iniziale, la metti dentro un'altra funzione che chiamerai ad esempio "inizializza".
Ti rimane di inserire il contatore della pallina in buca, che al terzo tocco ti fa uscire dal gioco e richiama inizializza.

Poi ti conviene seguire il consiglio di utilizzare switch case, rendi il programma più leggibile e più leggero per arduino.

non è che mi potresti fare un esempio pratico? perché io ancora non ci capisco granchè ... potresti farlo sul mio sketch per favore?

Ecco l'esempio pratico

int var1=32;
int var2=16;
int PallineCadute=0;

void setup(){
  pinMode(4, OUTPUT);
  pinMode(8, INPUT);
}

void loop(){
 if (PallineCadute==3)
     inizializza();
 esecuzione();  
}

void inizializza(){
  var1=32;
  var2=16;
  PallineCadute=0;
}

void esecuzione(){
  //qui scrivo il mio programma
}

nid69ita:
E poi in C mica esiste "and" devi usare && :astonished:
http://arduino.cc/en/Reference/Boolean

vero. Ma nell'Arduino è stato inserito "and".
Prova

if (a and b)

e vedrai che non ottieni errori né malfunzionamenti.
Se ti ricordi già altri avevano scoperto questa cosa. Probabile che dipenda dall'inclusione detta da astro, ma non so dove è fatta

leo72:
Probabile che dipenda dall'inclusione detta da astro, ma non so dove è fatta

Iso646.h si trova in "..\arduino-1.0.5-r2\hardware\tools\avr\lib\gcc\avr\4.3.2\include" (percorso Windows), questa cartella include viene utilizzata in automatico da avrgcc in quanto contiene definizioni indispensabili per compilare, per questo motivo iso646.h viene utilizzato in automatico senza bisogno di includerlo nel progetto.
In tutti i casi consiglio l'utilizzo dei canonici && e || per AND e OR in modo da non andare incontro a problemi di portabilità dei sorgenti con future versioni del IDE e del compilatore.

Brado:
Ecco l'esempio pratico

int var1=32;

int var2=16;
int PallineCadute=0;

void setup(){
  pinMode(4, OUTPUT);
  pinMode(8, INPUT);
}

void loop(){
if (PallineCadute==3)
     inizializza();
esecuzione(); 
}

void inizializza(){
  var1=32;
  var2=16;
  PallineCadute=0;
}

void esecuzione(){
  //qui scrivo il mio programma
}

allora se ho capito bene: copiando il mio programma al posto di "//qui scrivo il mio programma" e dedicando un pin di INPUT per il pulsante che devo mettere con il conto fino a tre, funziona? ma perché "var1=32 e var2=16" ? e il pin 4 e 8 ?

leo72:

nid69ita:
E poi in C mica esiste "and" devi usare && :astonished:
http://arduino.cc/en/Reference/Boolean

vero. Ma nell'Arduino è stato inserito "and".
Prova

if (a and b)

e vedrai che non ottieni errori né malfunzionamenti.
Se ti ricordi già altri avevano scoperto questa cosa. Probabile che dipenda dall'inclusione detta da astro, ma non so dove è fatta

Ora rammento, ma sbaglio o nel reference non se ne parla ?

No, non se ne parla.

alespin:
ma perché "var1=32 e var2=16" ? e il pin 4 e 8 ?

Perchè era un esempio pratico.
Altrimenti ti facciamo noi lo sketch, tu fai copia/incolla senza capire ed imparare nulla. :wink:

ecco!!!

avevo intuito che era un esempio soltanto , ma essendo ignorante ancora in materia , volevo essere sicuro.
vi ringrazio tutti per i consigli utilissimi