Bluetooth y millis()

Hola, compre un arduino UNO y un bluetooth HC-06, conecte un motor y un led, utilizo una app que manda texto por bluetooth, y en arduino utilizo Serial.read() para poder ejecutar las ordenes, el motor y el led pueden prender y apagar independientemente sin interrumpirse, pero quise hacer otro boton para el led para que cuando lo pulsara el led entrara en intermitente, primero lo intente con delay, pero ese frena todo el programa, no puedo usar el motor hasta que la secuencia del delay acaba, despues lo intente con millis pero solo me funciono si lo ponia fuera del bluetooth, el led se mantiene parpadeando, puedo controlar el motor con el bluethoot, tambien prender y apagar el led, pero las intermitentes siempre estan, cuando meto la misma orden dentro del if que uso para leer el texto que recibo de la app solo prende el led, sin intermitentes, queria saber si hay alguna forma de hacer que entre en intermitente sin que pierda el control del motor y que se pueda prender y apagar recibiendo texto del bluetooth. use este codigo

int ledPin = 6;   // el número del pin conectado al LED
int der_a = 8;
//  variables que cambiarán de valor.
int ledState = LOW;   // ledState se usará para establecer el estado del LED

long previousMillis = 0;   // almacenará la última vez que el estado del LED
//se actualizó

// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
long interval = 1000;   // intervalo del parpadeo (en milisegundos)

void setup() 
{
// establece el pin digital como salida:
Serial.begin (9600);
pinMode(ledPin, OUTPUT);
pinMode (der_a, OUTPUT);
}

void loop()
{
// Aquí es donde pondríamos el código que debe ejecutarse durante todo el
// tiempo.
char dato = Serial.read();
  //encender
 if (dato == 'a')
  {
    digitalWrite (der_a, HIGH);
  }
  if (dato == 'b')
  {
    digitalWrite (der_a, LOW);
  }
   if (dato == 'c')
  {
    digitalWrite (ledPin, HIGH);
  }
  if (dato == 'd')
  {
    digitalWrite (ledPin, LOW);
  }
 
if (dato == 'w')
  {
unsigned long currentMillis = millis();    // Se toma el tiempo actual

// se comprueba si el tiempo actual menos el tiempo en que el LED cambió
// de estado por última vez es mayor que el intervalo.
if (currentMillis - previousMillis > interval){

// Si se cumple la condición se guarda el nuevo tiempo
// en el que el LED cambia de estado
previousMillis = currentMillis;

// Y ahora cambiamos de estado el LED, si está encendido a
// apagado o viceversa.
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;

// Hacemos que el contenido de la variable llegue al LED
digitalWrite(ledPin, ledState);
}
}
}

Prueba esto

const byte ledPin = 6;   // el número del pin conectado al LED
const byte der_a = 8;
//  variables que cambiarán de valor.
bool ledState = LOW;   // ledState se usará para establecer el estado del LED

unsigned long previousMillis = 0;   // almacenará la última vez que el estado del LED
//se actualizó

// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
unsigned long interval = 1000;   // intervalo del parpadeo (en milisegundos)

void setup() {
  // establece el pin digital como salida:
  Serial.begin (9600);
  pinMode(ledPin, OUTPUT);
  pinMode (der_a, OUTPUT);
}

void loop()
{
  // Aquí es donde pondríamos el código que debe ejecutarse durante todo el
  // tiempo.
  if (Serial.available() >0) {


      char dato = Serial.read();
      if (dato != '\r' || dato != '\n')
          char comando = dato;
      //encender
      switch(comando) {
        case 'a': digitalWrite (der_a, HIGH);
                  break;
        case 'b': digitalWrite (der_a, LOW);
                  break;
        case 'c': digitalWrite (ledPin, HIGH);
                  break;
        case 'd': digitalWrite (ledPin, LOW);
                  break;
        case 'w': // se comprueba si el tiempo actual menos el tiempo en que el LED cambió
                  // de estado por última vez es mayor que el intervalo.
                  if (millis() - previousMillis > interval){
                      // Si se cumple la condición se guarda el nuevo tiempo
                      // en el que el LED cambia de estado
                      previousMillis = millis();

                      // Y ahora cambiamos de estado el LED, si está encendido a
                      // apagado o viceversa.
                      ledState = !ledState;
                      // Hacemos que el contenido de la variable llegue al LED
                      digitalWrite(ledPin, ledState);
                  }
                  break;
      }
  }
}

Si necesitas que los comandos a,b,c,d, se ejecuten una vez coloca un comando = 0; antes de cada break

Hola, muchas gracias por la respuesta, cuando quise verificar el programa me mando error que decia comando was not declared in the scope, lo agregue como int comando,cuando puse el comando = 0; antes de los break; me funciono igual que cuando meti los millis en el if del primer programa solo prende y apaga el led, no parpadea, no se si tenga que ver con el int que puse, de antemano gracias por la atencion, este es el codigo que use.

const byte ledPin = 6;   // el número del pin conectado al LED
const byte der_a = 8;
//  variables que cambiarán de valor.
bool ledState = LOW;   // ledState se usará para establecer el estado del LED

unsigned long previousMillis = 0;   // almacenará la última vez que el estado del LED
//se actualizó

// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
unsigned long interval = 1000;   // intervalo del parpadeo (en milisegundos)

void setup() {
  // establece el pin digital como salida:
  Serial.begin (9600);
  pinMode(ledPin, OUTPUT);
  pinMode (der_a, OUTPUT);
}

void loop()
{
  // Aquí es donde pondríamos el código que debe ejecutarse durante todo el
  // tiempo.
  if (Serial.available() >0) {


      char dato = Serial.read();
      if (dato != '\r' || dato != '\n')
          char comando = dato;
          int comando = dato;
      //encender
      switch(comando) {
        case 'a': digitalWrite (der_a, HIGH);
        comando = 0;
                  //break;
        case 'b': digitalWrite (der_a, LOW);
        comando = 0;
                  break;
        case 'c': digitalWrite (ledPin, HIGH);
        comando = 0;
                  break;
        case 'd': digitalWrite (ledPin, LOW);
        comando = 0;
                  break;
        case 'w': // se comprueba si el tiempo actual menos el tiempo en que el LED cambió
                  // de estado por última vez es mayor que el intervalo.
                  if (millis() - previousMillis > interval){
                      // Si se cumple la condición se guarda el nuevo tiempo
                      // en el que el LED cambia de estado
                      previousMillis = millis();

                      // Y ahora cambiamos de estado el LED, si está encendido a
                      // apagado o viceversa.
                      ledState = !ledState;
                      // Hacemos que el contenido de la variable llegue al LED
                      digitalWrite(ledPin, ledState);
                  }
                  comando = 0;
                  //break;
      }
  }
}

POr lo visto no me expliqué bien o no me comprendiste bien porque yo escribí

surbyte:
Si necesitas que los comandos a,b,c,d, se ejecuten una vez coloca un comando = 0; antes de cada break

Te dije que pusieras comando = 0 en a,b,c,d pero no en w o sea el intermitente.
Sino lo bloqueas.

hola amigo, gracias por la ayuda, ya lo intente quitando el comando=0; de la opción w, al principio pensé que solo prendía y apagaba, pero tenia que apretar el botón "w" 2 o 3 veces para que prendiera y apagara, después me di cuenta que si lo apretaba varias veces seguidas si es como si estuviera en intermitente, no se si hay forma de solo pulsarlo una vez. a si puse el codigo.

const byte ledPin = 6;   // el número del pin conectado al LED
const byte der_a = 8;
//  variables que cambiarán de valor.
bool ledState = LOW;   // ledState se usará para establecer el estado del LED

unsigned long previousMillis = 0;   // almacenará la última vez que el estado del LED
//se actualizó

// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
unsigned long interval = 1000;   // intervalo del parpadeo (en milisegundos)

void setup() {
  // establece el pin digital como salida:
  Serial.begin (9600);
  pinMode(ledPin, OUTPUT);
  pinMode (der_a, OUTPUT);
}

void loop()
{
  // Aquí es donde pondríamos el código que debe ejecutarse durante todo el
  // tiempo.
  if (Serial.available() >0) {


      char dato = Serial.read();
      if (dato != '\r' || dato != '\n')
          char comando = dato;
          int comando = dato;
      //encender
      switch(comando) {
        case 'a': digitalWrite (der_a, HIGH);
        comando = 0;
                  break;
        case 'b': digitalWrite (der_a, LOW);
        comando = 0;
                  break;
        case 'c': digitalWrite (ledPin, HIGH);
        comando = 0;
                  break;
        case 'd': digitalWrite (ledPin, LOW);
       comando =0;
                  break;
        case 'w': // se comprueba si el tiempo actual menos el tiempo en que el LED cambió
                  // de estado por última vez es mayor que el intervalo.
                  if (millis() - previousMillis > interval){
                      // Si se cumple la condición se guarda el nuevo tiempo
                      // en el que el LED cambia de estado
                      previousMillis = millis();

                      // Y ahora cambiamos de estado el LED, si está encendido a
                      // apagado o viceversa.
                      ledState = !ledState;
                      // Hacemos que el contenido de la variable llegue al LED
                      digitalWrite(ledPin, ledState);
                  }
               
                  break;
      }
  }
}

Bueno supuse que no tendrías que presionarlo mas de 1 vez pero algo no salió bien.
Déjame ver que esta mal.

Muchas gracias por la ayuda, ten una excelente tarde. =)