Funcion millis() complicada

En un proyecto quiero enviar una serie de comandos al arduino a través del puerto serie para que ejecute una serie de acciones.

const int mydireccion = 101;
const int Buzzer = 8;
const int LEDR = 5;
const int LEDG = 6;
const int LEDB = 7;
int Tblue = 30;  // tiempo que esta el LED Azul
int Tgreen = 500; // tiempo led verde
long Tred = 500; //Tiempo led rojo
unsigned long tiempoAnterior = 0;

void setup() {
  Serial.begin(9600);
  pinMode(Buzzer , OUTPUT);
  pinMode(LEDR , OUTPUT);
  pinMode(LEDG , OUTPUT);
  pinMode(LEDB , OUTPUT);
  digitalWrite(Buzzer , LOW);
  digitalWrite(LEDR , LOW);
  digitalWrite(LEDG , LOW);
  digitalWrite(LEDB , LOW);
}


void(* resetFunc) (void) = 0; //declare reset function @ address 0


void loop() {
  
  unsigned long tiempoActual = millis();
  
  if(Serial.available()){
      char valor = Serial.read();
      switch (valor){
        
        case 'R':
        resetFunc();
        break;   
        
        case 'I':
        int direccion=Serial.parseInt(); //recibimos la direccion 
        if(direccion==mydireccion) //Si direccion es la nuestra
            {
              char comando=Serial.read();
              switch (comando){
                case 'P':
                digitalWrite(LEDB , HIGH);
                delay(1);
                digitalWrite(LEDB , LOW);
                break;
                
                case 'V':
                digitalWrite(LEDG , HIGH);
                digitalWrite(Buzzer , HIGH);
                delay(100);
                digitalWrite(LEDG , LOW);
                digitalWrite(Buzzer , LOW);
                break;
                
                case 'X':
                digitalWrite(LEDR , HIGH);
                digitalWrite(Buzzer , HIGH);
                delay(500);
                if(tiempoActual - tiempoAnterior >= Tred){
                  tiempoAnterior = tiempoActual;
                  digitalWrite(LEDR , LOW);
                  digitalWrite(Buzzer , LOW);
                  }
                break;
              } 
            }
        break;    
         
      }
             
   }
}
    

El problema es que estoy intentando sustituir los delays por millis pero no soy capaz.
Si introduzco el código I101V se enciende el led y el buzzer durante el tiempo del delay.
Per si introduzco I101X no hace nada, y no se si tengo bien metida la función de millis.

¿Alguna ayuda?

1 Like

No se puede pasar del formato delay al formato millis() y con ello quiero expresar que son formas de programar diferentes sin leer buenos tutoriales.
Debes leer máquina de estados y debes leer mas hacerca de millis(). Tal vez sepas usar millis() pero no puedes introducirlo como se usa delay() porque delay() interrumpe el código y lo detiene por el tiempo que tu le digas en cambio millis() no.
millis() se usa de otro modo, con el concepto que yo debo estar mirando si el tiempo ha pasado para hacer algo y mientras sigo permitiendo que el código preste atención a todo lo demás asi que no es lo mismo.
Mira un simple código como blink.ino de tu IDE.
Blink.ino de tu ide pone un led en ON le pone un delay de 1000 mseg y luego en OFF y listo lo repite hasta el cansancio.
Ahora mira BlinkWithoutDelay.ino y entenderás de lo que hablo.