millis()....maledetto millis()

Salve a tutti
Premesso che il mio schetc che metto giusto per farvi inorridire dalla mia scrittura
funziona correttamente sia in teoria che in pratica il motore parte da fermo se schiaccio il pulsante la prima volta gira in un senso,la seconda volta gira nell'altro, la terza si fema e mantiene la posizione (il conteggiopassi lo avevo messo per saper in che posizione si trova il motore.....anche se adesso non serve

byte pulsante=2;
int bobina1=8;
int bobina2=9;
byte bobina3=10;
byte bobina4=11;

byte bob1=0;
byte bob2=0;
byte bob3=0;
byte bob4=0;

int conteggiopassi=0;
int girocompleto=512;
int ciclo=0;
int rotazione=0;
int partenza=0;
unsigned velocita=50;
unsigned tempo=0;

void setup()
{
//Assegno i pin
pinMode(pulsante,INPUT);  
pinMode(bobina1,OUTPUT);
pinMode(bobina2,OUTPUT);
pinMode(bobina3,OUTPUT);
pinMode(bobina4,OUTPUT);
Serial.begin(9600);
}

void loop()
{
 //Letture serial monitor
 Serial.print("Ciclo  ");
 Serial.println(ciclo);
 Serial.println(""); 
 Serial.print(bob1);
 Serial.print(bob2);
 Serial.print(bob3);
 Serial.print(bob4);
 Serial.println("");
 
  
 if(ciclo==0){Serial.println("Motore Fermo");}
 Serial.println(""); 
 if(digitalRead(pulsante)){Serial.println("Motore Pronto");}
 Serial.println("");
 if(ciclo!=0)
   {
    if(partenza==1){Serial.println("Partenza");}
    if(rotazione==0){Serial.println("Senso Orario");} 
    if(rotazione==1){Serial.println("Senso Antiorario");}
    Serial.print("Passi  ");
    Serial.println(conteggiopassi);
   }
  
 //Comandi bobine
 if(bob1==1){digitalWrite(bobina1,HIGH);}else{digitalWrite(bobina1,LOW);}
 if(bob2==1){digitalWrite(bobina2,HIGH);}else{digitalWrite(bobina2,LOW);}
 if(bob3==1){digitalWrite(bobina3,HIGH);}else{digitalWrite(bobina3,LOW);}
 if(bob4==1){digitalWrite(bobina4,HIGH);}else{digitalWrite(bobina4,LOW);}

 //Condizione pulsante
 if((digitalRead(pulsante))&&(rotazione==0))//Dice Avanti
   {
    while(digitalRead(pulsante)){}
    rotazione=1;
   }
  
  if((digitalRead(pulsante))&&(rotazione==1))//Dice Indietro
   {
    while(digitalRead(pulsante)){}
    rotazione=2;
   }
  
  if((digitalRead(pulsante))&&(rotazione==2))//Dice Stop
   {
    while(digitalRead(pulsante)){}
    rotazione=0; 
   }
   
 //Senso di rotazione
 
 if(rotazione==1)// Esegue Avanti
   {
    if(millis()>=tempo+velocita)
      {
       conteggiopassi++;
       ciclo++;
       tempo=millis();
      }
     if(ciclo>8){ciclo=1;} 
   } 
  
  if(rotazione==2)//Esegue Indietro
    {
     if(millis()>=tempo+velocita)
       {
        conteggiopassi--;
        ciclo--;
        tempo=millis();
       }
     if(ciclo<1){ciclo=8;} 
    }  
  else //Esegue Stop
    {
     digitalRead(ciclo);
     digitalRead(conteggiopassi);
     ciclo=ciclo;
    }
     
 
 //Sequenza fasi
 if(ciclo==0){bob1=0;bob2=0;bob3=0;bob4=0;} 
 if(ciclo==1){bob1=1;bob2=0;bob3=0;bob4=0;}
 if(ciclo==2){bob1=1;bob2=1;bob3=0;bob4=0;}
 if(ciclo==3){bob1=0;bob2=1;bob3=0;bob4=0;}
 if(ciclo==4){bob1=0;bob2=1;bob3=1;bob4=0;}
 if(ciclo==5){bob1=0;bob2=0;bob3=1;bob4=0;}
 if(ciclo==6){bob1=0;bob2=0;bob3=1;bob4=1;}
 if(ciclo==7){bob1=0;bob2=0;bob3=0;bob4=1;}
 if(ciclo==8){bob1=1;bob2=0;bob3=0;bob4=1;} 
}

Ho provato a mettere fuori dal LOOP giusto per renderlo piu semplice alcuni argomenti,come ad esempio "sequenza fasi"oppure"letture serial monitor",,,,,,ma non mi è ben chiaro il concetto di come richiamarle nel LOOP.

Le funzioni "inventate" si dichiarano esattamente come le altre. Ad un certo punto della loop(), o della setup(), o di un'altra funzione (si, una funzione può richiamare un'altra funzione, e il ciclo può avere lunghezze paurose, basta che sia finito, ovvero che una funzione chiamata da una chiamata da una chiamata... dia un risultato che possa far funzionare la funzione precedente e via così)
Una funzione la puoi richiamare tutte le volte che vuoi e puoi buttare via o meno il valore di ritorno. In pratica una funzione tua é uguale ad una funzione esistente. Chiaro?

Puso:
funziona correttamente sia in teoria che in pratica

Fino a 50 giorni, poi millis() torna a zero.

Il controllo millis()>x+y può fallire in diversi modi, in un caso (se x+y<2^32-1 e millis è tornato a zero) il programma potrebbe bloccarsi per sempre (tocca aspettare altri 50 giorni per scoprirlo), nell'altro (se millis()<2^32-1 e x+1>=2^32) invece non attende il tempo previsto (finché sia millis() che x+y non hanno superato lo zero, poi torna a funzionare regolarmente).

Se ne era già parlato qui.

La soluzione era già stata detta il primo Agosto, qualche post prima.

Per le funzioni inventate ancora non le ho chiare di mio ci devo ancora studiare, ci ho provato un pò poi ho fatto un gran casino è mi è venuto il nervoso, credo di aver capito come dichiararle ma non come richiamarle.

Per la fine del millis() dopo i 50 giorni me lo ricordavo ed un pò me lo sono studiato ma non ci avevo dato peso nello schetc perche non mi serviva ti ringrazio comunque per la correzione è giusto farlo diventare un'abitudine.

Giuro che la prossima volta che mi trovo un hobby.....faccio il pensionato che va ha guardare i lavoratori in cantiere

Puso:
Per le funzioni inventate ancora non le ho chiare di mio ci devo ancora studiare, ci ho provato un pò poi ho fatto un gran casino è mi è venuto il nervoso, credo di aver capito come dichiararle ma non come richiamarle.

Guarda, è veramente banale ...
... facciamo un caso semplice semplice ... prima di loop() e di setup(), crei una tua funzione :

void miaFunzione(void) {
   Serial.print("Messaggio dalla mia funzione");
}

... dentro il tuo programma, DOVE VUOI, quando la vuoi richiamare basta che scrivi : miaFunzione();

Esempio

void setup() {
   Serial.begin(9600);
   miaFunzione();
}

... qui è stata chiamata nel setup() (quindi una sola volta). Se ti serve di chiamarla da altre parti, basta che ripeti quella riga. :smiley:

Guglielmo

Grazie ancora.....mo ci riprovo

appena riesco lo posto cosi potete autoflagellarvi leggendo i miei tentativi

:grin:
Ecco fatto che ve ne pare?

Qui ho messo le variabili che dorebbero essere quelle più adatte, ed il setup

//VARIABILI PER RICORDARE I PIN
byte pulsante=2;
byte bobina1=8;
byte bobina2=9;
byte bobina3=10;
byte bobina4=11;

//VARIABILI PER COMANDARE I PIN
byte bob1=0;
byte bob2=0;
byte bob3=0;
byte bob4=0;

//VARIABILI PER RICORDARE LA POSIZIONE
int conteggiopassi=0;
int girocompleto=512;

//VARIABILI PER I COMANDI
int ciclo=0;
int rotazione=0;
int partenza=0;

//VARIABILI PER GESTIRE IL MILLIS()
unsigned velocita=50;
unsigned tempo=0;
extern unsigned long timer0_millis;

void setup()
{
 //ASSEGNO TIPO DI PIN
 pinMode(pulsante,INPUT);  
 pinMode(bobina1,OUTPUT);
 pinMode(bobina2,OUTPUT);
 pinMode(bobina3,OUTPUT);
 pinMode(bobina4,OUTPUT);
  
 //ASSEGNO VELOCITA SERIAL MONITOR 
 Serial.begin(9600);
}

Subito dopo ho "inventato" le funzioni cosi da vedere meglio se c'erano errori, compresa quella per resettare il millis.

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void  LEGGI_MONITOR()
{
 Serial.print("MILLIS ");
 Serial.println(millis());
  
 Serial.print("TEMPO ");
 Serial.println(tempo);
  
 Serial.print("CICLO  ");
 Serial.println(ciclo); 
 Serial.print(bob1);
 Serial.print(bob2);
 Serial.print(bob3);
 Serial.print(bob4);
 Serial.println("");
 
 if(rotazione==0)
   {
    Serial.println("");
    Serial.println("FERMO");
   }
 if(rotazione==1)
   {
    Serial.println("");
    Serial.println("AVANTI");
   }
 if(rotazione==2)
   {
    Serial.println("");
    Serial.println("INDIETRO");
   }
 Serial.print("PASSI  ");
 Serial.println(conteggiopassi);
}


//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void LEGGI_PULSANTE()
{   
 if((digitalRead(pulsante))&&(rotazione==0))//Dice Avanti
   {
    while(digitalRead(pulsante)){}
    rotazione=1;
   }
  
  if((digitalRead(pulsante))&&(rotazione==1))//Dice Indietro
   {
    while(digitalRead(pulsante)){}
    rotazione=2;
   }
  
  if((digitalRead(pulsante))&&(rotazione==2))//Dice Stop
   {
    while(digitalRead(pulsante)){}
    rotazione=0; 
   }
}

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void DECIDI_ROTAZIONE()
{
 //COMANDA AVANTI 
 if(rotazione==1)
   {
    if(millis()>=tempo+velocita)
      {
       conteggiopassi++;
       ciclo++;
       tempo=millis();
      }
    if(ciclo>8){ciclo=1;} 
   }
  
 //COMANDA INDIETRO
 if(rotazione==2)
   {
    if(millis()>=tempo+velocita)
      {
       conteggiopassi--;
       ciclo--;
       tempo=millis();
      }
    if(ciclo<1){ciclo=8;} 
   }
  
 //COMANDA STOP
 //MANTIENE LA POSIZIONE
 //RICORDA LA POSIZIONE 
 else
    {
     digitalRead(ciclo);
     digitalRead(conteggiopassi);
     ciclo=ciclo;
    }
}     

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void ISTRUISCI_BOBINE()
{
 if(ciclo==0){bob1=0;bob2=0;bob3=0;bob4=0;} 
 if(ciclo==1){bob1=1;bob2=0;bob3=0;bob4=0;}
 if(ciclo==2){bob1=1;bob2=1;bob3=0;bob4=0;}
 if(ciclo==3){bob1=0;bob2=1;bob3=0;bob4=0;}
 if(ciclo==4){bob1=0;bob2=1;bob3=1;bob4=0;}
 if(ciclo==5){bob1=0;bob2=0;bob3=1;bob4=0;}
 if(ciclo==6){bob1=0;bob2=0;bob3=1;bob4=1;}
 if(ciclo==7){bob1=0;bob2=0;bob3=0;bob4=1;}
 if(ciclo==8){bob1=1;bob2=0;bob3=0;bob4=1;} 
}

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void COMANDA_BOBINE()
{
 if(bob1==1){digitalWrite(bobina1,HIGH);}else{digitalWrite(bobina1,LOW);}
 if(bob2==1){digitalWrite(bobina2,HIGH);}else{digitalWrite(bobina2,LOW);}
 if(bob3==1){digitalWrite(bobina3,HIGH);}else{digitalWrite(bobina3,LOW);}
 if(bob4==1){digitalWrite(bobina4,HIGH);}else{digitalWrite(bobina4,LOW);}
}

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void RESETTA_MILLIS() 
{
  timer0_millis=0;
  tempo=millis();
}

Infine lancio il LOOP veramente cortissimo.

//SCRIVO IL LOOP()
void loop()
{
 LEGGI_MONITOR();
 LEGGI_PULSANTE();
 DECIDI_ROTAZIONE();
 ISTRUISCI_BOBINE();
 COMANDA_BOBINE();
 RESETTA_MILLIS();
}

Sembra funzionare tutto correttamente,che dite sono sulla strada giusta????????

le rotazioni le ho messe appositamente fuori dalle graffe,per evitare di dover mettere un delay in attesa di levare il dito dal pulsante, ho voluto dire apposta

finche lo senti premuto non fare nulla,,poi rotazione= ect

La dichiarazione di queste due variabili mi sembra un po' strana

Puso:

unsigned velocita=50;

unsigned tempo=0;

Questa parte cosa fa?

 //COMANDA STOP

//MANTIENE LA POSIZIONE
//RICORDA LA POSIZIONE
else
   {
    digitalRead(ciclo);
    digitalRead(conteggiopassi);
    ciclo=ciclo;
   }
}

Sembra funzionare tutto correttamente,che dite sono sulla strada giusta????????

Vediamo... se fossi il committente del lavoro guarderei con soddisfazione il motore che gira, ma a questo punto chiederei una piccola e davvero insignificante modifica, vorrei vedere anche il led on board (pin 13) che lampeggia costante a 1 Hz, per avere l'indicazione visiva del sistema in funzione anche a motore fermo. Si può fare vero?

Per la fine del millis() dopo i 50 giorni me lo ricordavo ed un pò me lo sono studiato ma non ci avevo dato peso nello schetc perche non mi serviva ti ringrazio comunque per la correzione è giusto farlo diventare un'abitudine.

Ma perseverare nell' "errore"... :smiling_imp:

Perché continuare a scrivere:

if(millis() >= tempo + velocita)

che richiede alchimie come l'azzeramento del contatore millis e impedisce di usare millis per qualsiasi altra operazione?

Quando basta scrivere come detto qui?

if(millis() - tempo >= velocita)

Questa parte l'ho utilizzata per dare più o meno velocità al motore

unsigned velocita=50;
unsigned tempo=0;

Qui invece ho voluto il motore fermo in una posizione qualsiasi con le bobine attive in modo che l'albero mantenga quella posizione e non sia libero di girare per inerzia, in più ho voluto ricordare in quale posizione "PASSO" si trova per poterlo sfruttare come un encoder

 //COMANDA STOP
 //MANTIENE LA POSIZIONE
 //RICORDA LA POSIZIONE
 else
    {
     digitalRead(ciclo);
     digitalRead(conteggiopassi);
     ciclo=ciclo;
    }
}

Effettivamente mi sono scervellato un po col millis, comunque adesso provo ad aggiungere il led 13 che lampeggia per ogni secondo anzi 2 volte al secondo(2Hz) cosi provo di capire la differenza con if(millis() - tempo >= velocita)

Puso:
Questa parte l'ho utilizzata per dare più o meno velocità al motore

unsigned velocita=50;

unsigned tempo=0;

Ho capito a cosa servono, è la dichiarazione del tipo che non è corretta (quindi funziona per pura fortuna).

Qui invece ho voluto il motore fermo in una posizione qualsiasi con le bobine attive in modo che l'albero mantenga quella posizione e non sia libero di girare per inerzia, in più ho voluto ricordare in quale posizione "PASSO" si trova per poterlo sfruttare come un encoder

else

{
    digitalRead(ciclo);
    digitalRead(conteggiopassi);
    ciclo=ciclo;
   }
}

Quelle istruzioni vengono eseguite per qualsiasi condizione diversa da 2 (quindi anche mentre il motore gira con condizione == 1), e (per il momento) non fanno assolutamente niente.

cosi provo di capire la differenza con if(millis() - tempo >= velocita)

Se ne sta parlando anche qui.

:fearful: mi hai fregato con quel led, è più complicato del previsto per me, ci metto un pò ma ci riuscirò

Claudio_FF:
La dichiarazione di queste due variabili mi sembra un po' strana

se ne è parlato nel post 7, rara ma non errata.
Comunque potrebbe indurre in confusione

E certo vale come indizio di non chiarezza nel modo di programmare

ecco fatto
ho tolto il reset e conteggiato il millis() in maniera corretta, poi ho aggiunto e modificato questo

//VARIABILI PER I COMANDI MOTORE
int ciclo=0;
int rotazione=0;
int partenza=0;

//VARIABILE PER I COMANDI LAMPEGGIO SISTEMA
int lampeggio=0;

//VARIABILI PER LA VELOCITA LAMPEGGIO SISTEMA
unsigned long lampeggio_sistema=500;
unsigned long tempo_sistema=0;

//VARIABILI PER LA VELOCITA DEL MOTORE
unsigned long velocita=50;
unsigned long tempo=0;

//VARIABILE PER EVENTUALE RESET DI MILLIS()
extern unsigned long timer0_millis;

poi ho fatto una Funzione apposita

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void VERIFICA_SISTEMA()
{
  if(lampeggio==0){digitalWrite(led_sistema,LOW);}
  if(lampeggio==1){digitalWrite(led_sistema,HIGH);}

  
  if(ciclo!=0)
    {
     digitalRead(lampeggio);
    
     if(millis()-tempo_sistema>=lampeggio_sistema)
       {
        lampeggio++;
        tempo_sistema=millis();
       }
     if(lampeggio>1){lampeggio = 0;}
     }
}

e l'ho richiamata nel LOOP togliendo i Reset Millis

//SCRIVO IL LOOP()
void loop()
{
 LEGGI_MONITOR();
 LEGGI_PULSANTE();
 VERIFICA_SISTEMA();
 DECIDI_ROTAZIONE();
 ISTRUISCI_BOBINE();
 COMANDA_BOBINE();
 }

Ora funziona anche il Led

se come clienti avete altre richieste chiedete pure che a me fa solo bene per esercitarmi,ovviamente il prezzo aumenta ;D 8) :grinning:

Prossimo passo

Ripasso le variabili.
Evito le righe inutili(anche se le metto per mia più facile comprensione)
Vi uso come"Comittenti" fatemi pure richieste aggiuntive sul mio progetto cosi mi alleno.

Prossimo progetto appena mi sento pronto usare un joystick al posto del pulsante,anche se non lo trovo sul simulatore di tinkercad ,se no ci avevo gia fatto prove, proverò col potenziometro.

Ma per ora mi devo esercitare quindi fate pure richieste e corregetemi se sbaglio.

Intanto, come suggerimento generico, puoi risparmiare variabili (e memoria) evitando di usare delle unsigned long per metterci dentro solo il valore dei ritardi ed altra roba simile ... anzi, a meno che il tuo programma poi in fase di funzionamento non debba modificare quei valori, puoi proprio evitare di usare delle variabili, e scrivere semplicemente quei valori nello sketch ... memoria risparmiata e meno complicazioni :wink:

Grazie per il suggerimento,ma data la mia poca esperienza le ho messe apposta in attesa di "clienti" che mi chiedano modifiche all'ultimo momento,,,,,,diciamo che l'ho pensato come un progetto modificabile velocemente per ogni esigenza senza dover rivedere tutto,comunque ho capito il tuo concetto e ti ringrazio.

Puso:

digitalRead(lampeggio);

Un grosso dubbio... cosa dovrebbe fare per te questa istruzione che hai scritto? (considera anche i valori che può assumere la variabile lampeggio)

se come clienti avete altre richieste chiedete pure

Il cliente è parzialmente soddisfatto... voleva un LED che lampeggiasse sempre costantemente in ogni momento, invece si è accorto che se tiene premuto a lungo il pulsante, per tutto il tempo della pressione il LED non lampeggia più :wink:

l'ho pensato come un progetto modificabile velocemente per ogni esigenza senza dover rivedere tutto

È cosa buona e giusta parametrizzare il programma, in modo da non dover modificare ogni volta qui e la con il rischio di dimenticare qualcosa o sbagliare, però per non consumare memoria andrebbe appunto fatto con costanti e/o define.

scusate il ritardo nel rispondere ho un po di problemi col PC

Il digitalRead lo avevo messo per sapere in stato fosse il led sicuramente ora è inutile,ma lo tengo perche magari potrebbe tornarmi comodo durante le richieste della clientela pignola

Ho notato la richiesta del led che si blocca mentre il pulsante è premuto,,,,,,,,ci sto ragionando,pensavo fosse una cosa da poco,ma prima o poi ci salto fuori, appena riesco a non litigare col PC che in sto periodo mi fa innervosire

Per le variabili ammetto di avere ancora grosse lacune,,,,,le devo risccrivere alla lavagna :fearful: :cry:

appena risolvo il piccolo problema con il led di sistema lo posto

:frowning: ummmm dopo vari tentativi falliti ho aggiunto questo al precedente

//VARIABILE PER I COMANDI LAMPEGGIO SISTEMA
byte lampeggio=0;
byte lampeggio_attivo=0;

poi l'ho richiamato metto lo sketch completo

//VARIABILI PER RICORDARE I PIN
byte pulsante=2;
byte bobina1=8;
byte bobina2=9;
byte bobina3=10;
byte bobina4=11;
byte led_sistema=13;

//VARIABILI PER COMANDARE I PIN
byte bob1=0;
byte bob2=0;
byte bob3=0;
byte bob4=0;
byte sistema_attivo=0;

//VARIABILI PER RICORDARE LA POSIZIONE MOTORE
int conteggiopassi=0;
int girocompleto=512;

//VARIABILI PER I COMANDI MOTORE
byte ciclo=0;
byte rotazione=0;
byte partenza=0;

//VARIABILE PER I COMANDI LAMPEGGIO SISTEMA
byte lampeggio=0;
byte lampeggio_attivo=0;

//VARIABILI PER LA VELOCITA LAMPEGGIO SISTEMA
unsigned long lampeggio_sistema=500;
unsigned long tempo_sistema=0;

//VARIABILI PER LA VELOCITA DEL MOTORE
unsigned long velocita=50;
unsigned long tempo=0;

//VARIABILE PER EVENTUALE RESET DI MILLIS()
extern unsigned long timer0_millis;

void setup()
{
 //ASSEGNO TIPO DI PIN
 pinMode(pulsante,INPUT);  
 pinMode(bobina1,OUTPUT);
 pinMode(bobina2,OUTPUT);
 pinMode(bobina3,OUTPUT);
 pinMode(bobina4,OUTPUT);
 pinMode(led_sistema,OUTPUT); 
  
 //ASSEGNO VELOCITA SERIAL MONITOR 
 Serial.begin(9600);
}


//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void  LEGGI_MONITOR()
{
 Serial.print("MILLIS ");
 Serial.println(millis());
  
 Serial.print("LAMPEGGIO ");
 Serial.print(lampeggio_attivo); 
 Serial.println(lampeggio);
  
 Serial.print("TEMPO ");
 Serial.println(tempo);
  
 Serial.print("CICLO  ");
 Serial.println(ciclo); 
 Serial.print(bob1);
 Serial.print(bob2);
 Serial.print(bob3);
 Serial.print(bob4);
 Serial.println("");
 
 if(rotazione==0)
   {
    Serial.println("");
    Serial.println("FERMO");
   }
 if(rotazione==1)
   {
    Serial.println("");
    Serial.println("AVANTI");
   }
 if(rotazione==2)
   {
    Serial.println("");
    Serial.println("INDIETRO");
   }
 Serial.print("PASSI  ");
 Serial.println(conteggiopassi);
}


//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void LEGGI_PULSANTE()
{   
 if((digitalRead(pulsante))&&(rotazione==0))//Dice Avanti
   {
    while(digitalRead(pulsante)){lampeggio_attivo=1;}
    rotazione=1;
    lampeggio_attivo=1;
   }
  
  if((digitalRead(pulsante))&&(rotazione==1))//Dice Indietro
   {
    while(digitalRead(pulsante)){lampeggio_attivo=1;}
    rotazione=2;
    lampeggio_attivo=1;
   }
  
  if((digitalRead(pulsante))&&(rotazione==2))//Dice Stop
   {
    while(digitalRead(pulsante)){lampeggio_attivo=1;}
    rotazione=0;
    lampeggio_attivo=1;
   }
}

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void DECIDI_ROTAZIONE()
{
 //COMANDA AVANTI 
 if(rotazione==1)
   {
    if(millis()-tempo>=velocita)
      {
       conteggiopassi++;
       ciclo++;
       tempo=millis();
      }
    if(ciclo>8){ciclo=1;} 
   }
  
 //COMANDA INDIETRO
 if(rotazione==2)
   {
    if(millis()-tempo>=velocita)
      {
       conteggiopassi--;
       ciclo--;
       tempo=millis();
      }
    if(ciclo<1){ciclo=8;} 
   }
  
 //COMANDA STOP
 //MANTIENE LA POSIZIONE
 //RICORDA LA POSIZIONE 
 else
    {
     digitalRead(ciclo);
     digitalRead(conteggiopassi);
     ciclo=ciclo;
    }
}     

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void ISTRUISCI_BOBINE()
{
 if(ciclo==0){bob1=0;bob2=0;bob3=0;bob4=0;} 
 if(ciclo==1){bob1=1;bob2=0;bob3=0;bob4=0;}
 if(ciclo==2){bob1=1;bob2=1;bob3=0;bob4=0;}
 if(ciclo==3){bob1=0;bob2=1;bob3=0;bob4=0;}
 if(ciclo==4){bob1=0;bob2=1;bob3=1;bob4=0;}
 if(ciclo==5){bob1=0;bob2=0;bob3=1;bob4=0;}
 if(ciclo==6){bob1=0;bob2=0;bob3=1;bob4=1;}
 if(ciclo==7){bob1=0;bob2=0;bob3=0;bob4=1;}
 if(ciclo==8){bob1=1;bob2=0;bob3=0;bob4=1;} 
}

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void COMANDA_BOBINE()
{
 if(bob1==1){digitalWrite(bobina1,HIGH);}else{digitalWrite(bobina1,LOW);}
 if(bob2==1){digitalWrite(bobina2,HIGH);}else{digitalWrite(bobina2,LOW);}
 if(bob3==1){digitalWrite(bobina3,HIGH);}else{digitalWrite(bobina3,LOW);}
 if(bob4==1){digitalWrite(bobina4,HIGH);}else{digitalWrite(bobina4,LOW);}
}

//INVENTO FUNZIONE DA RICHIAMARE eventualmente NEL LOOP()
void RESETTA_MILLIS() 
{
  timer0_millis=0;
  tempo=millis();
  tempo_sistema=millis();
}

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void VERIFICA_SISTEMA()
{
 if(lampeggio_attivo=1)
    {
     digitalRead(lampeggio);
     if(millis()-tempo_sistema>=lampeggio_sistema)
       {
        lampeggio++;
        tempo_sistema=millis();
       }
     if(lampeggio>1){lampeggio = 0;}
     }
  if(lampeggio==0){digitalWrite(led_sistema,LOW);}
  if(lampeggio==1){digitalWrite(led_sistema,HIGH);}
  
}


//SCRIVO IL LOOP()
void loop()
{
 
 LEGGI_MONITOR();
 VERIFICA_SISTEMA();
 LEGGI_PULSANTE();
 DECIDI_ROTAZIONE();
 ISTRUISCI_BOBINE();
 COMANDA_BOBINE();
 
}

credo che il problema sia qui

//INVENTO FUNZIONE DA RICHIAMARE NEL LOOP()
void LEGGI_PULSANTE()
{   
 if((digitalRead(pulsante))&&(rotazione==0))//Dice Avanti
   {
    while(digitalRead(pulsante)){lampeggio_attivo=1;}
    rotazione=1;
    lampeggio_attivo=1;
   }
  
  if((digitalRead(pulsante))&&(rotazione==1))//Dice Indietro
   {
    while(digitalRead(pulsante)){lampeggio_attivo=1;}
    rotazione=2;
    lampeggio_attivo=1;
   }
  
  if((digitalRead(pulsante))&&(rotazione==2))//Dice Stop
   {
    while(digitalRead(pulsante)){lampeggio_attivo=1;}
    rotazione=0;
    lampeggio_attivo=1;
   }
}

in pratica legge legge il lampeggio_attivo=1,ma se tengo premuto il pulsante se ne frega,,,,,,mi sono arenato nuovamente,,,, >:( >:(