Funzione Millis()

Buongiorno amici di arduino vorrei tramite la funzione Mills()
creare piu stati quando parte la funzione Millis() dopo 5000ms ho lo
stato1 poi dopo 8000ms lo stato2 ,di seguito dopo 12000ms lo stato3.
Il tutto deve scorrere nel ciclo di loop() una sola volta fino allo stato 2
ci sono riuscito pero non riesco ad fare funzionare lo stato 3
grazie attendo vostra risposta.

#include <Arduino.h>
int x=0;
unsigned long Timer1 = 0;
unsigned long Timer2 = 0;
void setup()
{
	Serial.begin(9600);
        pinMode(13, OUTPUT);
}

void loop()

{

 if (Timer1 == 0) {
    Timer1 = millis();
}

 if (Timer2 == 0) {
 if (millis() - Timer1 > 5000)
    while(x<1)
  {
x=x+1;
 Serial.println("stato1"); // solo per vedere se funziona 

Timer2 = millis();
      }
  }



  else {
    if (millis() - Timer2 > 3000) {


      // spegnimento LED
     Serial.println("stato2"); // solo per vedere se funziona 

      //digitalWrite(pin, LOW);

      Timer1 = 0;
      Timer2 = 0;

// come posso attivare lo stato3 devo creare altri Timer?

    }
  }


}

Te ne basta uno solo. Lo metti uguale a millis() come ultima operazione del setup() e poi nel loop confronti questa variabile con millis(), se la differenza è fra 5000 ed 8000 allora stato1, se è fra 8000 e 12000 allora stato 2, se è maggiore di 12000 allora stato3.
Una volta giunti allo stato3 puoi anche smettere di fare i confronti quindi potresti portare i confronti in una funzione esterna al void loop() e richiamarla solo se stato diverso da 3.

grazie per risposta qualcosa sbaglio ancora

#include <Arduino.h>





int x=0;
unsigned long Timer1 = 0;
unsigned long Timer2 = 0;
unsigned long Timer3 = 0;

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


	pinMode(13, OUTPUT);
}






void loop()

{

 if (Timer1 == 0) {
    Timer1 = millis();


}




  if (Timer2 == 0) {
    if (millis() - Timer1 > 5000)
        while(x<1)

        {



 x=x+1;



  Serial.println("stato1");


    Timer2 = millis();
      }
  }



  else {
    if (millis() - Timer2 > 3000) {


      // spegnimento LED
     Serial.println("stato2");
      //digitalWrite(pin, LOW);





      Timer1 = 0;
      Timer2 = 0;
     Timer3 = millis();

   if (millis() - Timer3 > 12000) {


      // spegnimento LED
     Serial.println("stato3");
      //digitalWrite(pin, LOW);





      Timer3 = 0;



    }


    }



  }


}

Non l'ho provato, ma in teoria dovrebbe funzionare.

unsigned long T0;
int stato;

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  T0 = millis();
  stato = 0;
}

void loop() {
  switch (stato) {
    case 0:
      if (millis() - T0 > 5000) stato++; // passa alla stato successivo
      break;

    case 1:
      Serial.println("stato 1");
      if (millis() - T0 > 8000) stato++;
      break;

    case 2:
      Serial.println("stato 2");
      if (millis() - T0 > 12000) stato++;
      break;

    case 3:
      Serial.println("stato 3");
      break;

    default:
      break;
  }
} // End Loop

:slight_smile: grazie funziona a meraviglia

ma e pure possibbile creare piu switch(stato) allo stesso tempo ad esempio switch(stato1)

fra di loro non si confondono con la funzione millis()

lo chiedo ad esempio se voglio fare partire lo switch(stato1) all venuta di un evento
indipendetemente dallo switch(stato)

non so se sono stato chiaro

grazie

ma e pure possibbile creare piu switch(stato) allo stesso tempo ad esempio switch(stato1)
fra di loro non si confondono con la funzione millis()
non so se sono stato chiaro

Con qualche punto di domanda sarebbe stato più chiaro :stuck_out_tongue:

Ogni switch deve avere una personale variabile di stato e una personale variabile tempo. Come ci sarà 'stato' e 'stato1', così ci sarà una 'TO' e una 'TO1'. millis() si limita a leggere un contatore comune con cui fare il confronto.

Permettimi un consiglio sull'indentazione del codice come riportato in questa pagina a partire da: "E a margine ma non meno importante se si vuole che altri leggano il proprio codice".

Puoi aumentare i casi oppure aggiungere quanti switch vuoi, ma sempre nei limiti di memoria dell'Arduino.

:slight_smile: salve grazie PaoloP vorrei fare il controllo del dempo non in partenza
ma quando ad esempio questo e condizionato ad esempio con un if davanti
come posso fare perche in questo modo mi parte subito
non so se spiego il problema
i due timer timer1 e timer2 funzionano col ciclo while vengono eseguiti una sola volta
nel ciclo di loop() ho fatto la prova quando passano i 5000ms del timer2
ha chiamare lo switch (stato)
per fare gli alri confronti ma non mi riesce ho postato un pezzo di codice

grazie

if(variabile1==1)


 {






   if (Timer1 == 0) {                                          
    Timer1 = millis();                                          
                                                   

}




  if (Timer2 == 0&&eingang_1==HIGH) {                                       
    if (millis() - Timer1 > 6000)
         while(b<1)
        {

 Serial.println ("acceso");

 b=b+1;


                                                   

                                        

    Timer2 = millis();
      }                                                 
  }



  else {                                    
    if (millis() - Timer2 > 5000) {


      // spegnimento LED
     Serial.println("spento");
      //digitalWrite(pin, LOW);

      Timer1 = 0;
      Timer2 = 0;
      tempotrascorso=millis();
      stato=0;
      variabile1=true;

if (variabile==true)

{
      switch (stato) {



    case 0:
      if (millis() - tempotrascorso > 5000) stato++; // passa alla stato successivo
      break;

    case 1:
      Serial.println("stato 1");
      if (millis() - tempotrascorso> 8000) stato++;
      break;

    case 2:
      Serial.println("stato 2");
      if (millis() - tempotrascorso > 12000) stato++;
      break;

    case 3:
      Serial.println("stato 3");
      break;

    default:
      break;
  }
}





    }
  }


}

la variabile tempotrascorso dovrebbe chiamarsi tempopartenza credo :frowning:

Se vuoi far partire il conteggio al verificarsi di un evento devi semplicemente mettere dentro l'if l'assegnamento della variabile che tiene conto del tempo di partenza.

if (condizione == true) tempopartenza = millis();

Lo devi inserire prima dello switch case dove effettui il controllo del tempo trascorso.

L'esempio con i due timer non l'ho capito.
Elimina tutti gli spazi tra le righe ed usa la formattazione automatica per identare il codice (Menù Strumenti --> Formattazione automatica).

:sob: :sob: :sob:
salve amici di arduino non ci sto capendo piu niente ma dove sbaglio
la condizione della variabile1==avviene correttemente lo switch mi
va al case:0 lo vedo perche invio una info alla seriale pero non mi
partono i Millis() .
grazie

if(variabile1==1)
{
tempopartenza=millis();
stato=0;
 switch (stato) {

case 0:
    Serial.println("invio informarione serial Monitor arduino");
      if (millis() - tempopartenza > 6000) stato++; // passa alla stato successivo

      break;

    case 1:

        while(a<1)
        {
      Serial.println("stato1");
      a=a+1;
        }

      if (millis() - tempopartenza> 9000) stato++;

      break;

    case 2:
        while(b<1)
        {
         Serial.println("stato2");
         b=b+1;
        }
     if (millis() - tempopartenza > 14000) stato++;
      break;

    case 3:
       while(c<1)
       {
            Serial.println("stato3");
      c=c+1;
      break;
       }

    default:
      break;

}
}

Puoi mettere lo sketch completo?
Così com'è non posso provarlo.

Devi eliminare

stato=0;

altrimenti ad ogni ciclo loop si riazzera.

:o :o
buonasera Paolo p ti posto un pezzo di codice ho levato alcune cose perche
era troppo lungo speriamo che non ti vengano le confusioni
comunica in seriale tramite Usb con Visual Basic
un Tasto che mi comanda un switch (counterPO) che mi sposta nei diversi case desiderati
dentro i case ce switch ce ne unaltro che comanda
switch (position) che controlla posizione di un motore servo
e poi ce nesarebbe unaltro quello che dovrebbe partire a tempo con millis()
quando la variabile 2 e True dove non riesco a farlo funzionare

grazie

int a=0;
int b=0;
int c=0;
int stato;
unsigned long  tempopartenza;
int variabile1;
void setup()
{
 tempopartenza=millis();
 ilmioservo.write(0);
 stato=0;
 ilmioservo.attach(2)
}

void loop()
{
    tasterStatus_1=digitalRead (S1);

 if (tasterStatus_1 ==HIGH)
 {
 tasterZeit1 = millis();
   tasterGedrueckt1  = 1;

  }
if ((millis()  -tasterZeit1 > entprellungZeit1) && tasterGedrueckt1== 1)

{
 counterPO++;
 if( counterPO>5)
counterPO = 0;
tasterGedrueckt1 = 0;
}

 switch (counterPO)

{


case 0:

break;



case 1:

{


switch (position)

{
case 0:
  ilmioservo.write(0);
break;




case 1:
ilmioservo.write(45);

break;


case 2:

  ilmioservo.write(90);

 break;


 case 3:

  ilmioservo.write(45);

 break;


}

  if(datentexbox=='U')
   {
       position=0;
  }


 else if(datentexbox=='q')
  {
     position=1;



}

else if (datentexbox=='v')

{
     position=2;
}


else if (datentexbox=='V')

{
     position=1;
}



  if(eingang_1== HIGH&&eingang_2== HIGH)
  {

 variabile2=1;
  }

 if(variabile2==1)

 {
tempopartenza=millis();
 switch (stato) {



    case 0:
      if (millis() - tempopartenza > 5000) stato++; // passa alla stato successivo

      break;

    case 1:

          while(a<1)
        {

   Serial.println("stato 1");
      a=a+1;
      }
      if (millis() - tempopartenza> 8000) stato++;




   break;

    case 2:
            while(b<1)
        {

      Serial.println("stato 2");
        b=b+1;
      }

      if (millis() - tempopartenza > 12000) stato++;
      break;

    case 3:

      while(c<1)
        {

      Serial.println("stato 3");
        c=c+1;
      }


      break;

    default:
      break;

}

}


if (eingang_1== LOW&analogwert1>600&analogwert1<1000)         
{
 Serial.println("auto");


digitalWrite(STECK1_1,LOW);

}
if (datentexbox=='S')
{

counterPO = 2;

}


}
}

break;