problema con funcion millis

muy buenas tardes compañeros de foro y de tareas jejeje, lo siguiente estoy realizando un control on off por el puerto serial, cuando mando el comando PUERTA1_ON O PUERTA2_ON el entra el cambia el estado lógico de los pines 7 y 8 a LOW para activar los reles y hasta aqui va todo bien, el proble esta en una rutina que tengo que se encarga de apargarlos transcurrido 5s esto lo a¿hago con millis(); pero no fe esta funcionando muy bien, cada dos segundos aproximadamente entra en el blucle pero no deberia ser asi y esto hace que el temporizado falle.

///////////////////////////////////////////////////////////////////
// Interface serial para control de puerta por medio de comandos //
// Parametros configurados:                                      //
// Velocidad de comunicacion 115200 / 8 / N / 1                  //
// Comando a recibir por el puerto serial PUERTA_ON.             //
// Tiempo de apertura puerta 5 segundos.                         //
// Retorna informacion de procesamiento del comando.             //
///////////////////////////////////////////////////////////////////

int MAX_CMD_LENGTH = 10;
int cmdIndex = 0;
char cmd[10];
char incomingByte;

#define led1     5
#define led2     6
#define puerta1  7
#define puerta2  8

unsigned long currentMillis;
unsigned long previousMillis1 = 0;    //Variable que se usara para saber la ultima vez que se ejecuto el if
unsigned long previousMillis2 = 0;    //Variable que se usara para saber la ultima vez que se ejecuto el if
const long interval1 = 5000;          //El intervalo que determina cada cuanto se entra al if
const long interval2 = 5000;          //El intervalo que determina cada cuanto se entra al if
boolean puertaState1 = false;
boolean puertaState2 = false;

///////////////////////////////////////////////////////////////////
//              Configuracion del Dispositivo                    //
///////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);
  pinMode(puerta1, OUTPUT);
  digitalWrite(puerta1, HIGH);
  pinMode(puerta2, OUTPUT);
  digitalWrite(puerta2, HIGH);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  Serial.println(F("SISTEMA LISTO Y ESPERANDO COMANDO ....."));
  Serial.println();
}

///////////////////////////////////////////////////////////////////
//                        Programa Principal                     //
///////////////////////////////////////////////////////////////////
void loop() {
  serialcom();
  statusoff();
}

///////////////////////////////////////////////////////////////////
//RUTINA QUE SE ENCARGA DE RECIBIR EL COMANDO POR EL PUERTO SERIE//
///////////////////////////////////////////////////////////////////
void serialcom() {
  if (incomingByte = Serial.available() > 0) {
    char byteIn = Serial.read();
    cmd[cmdIndex] = byteIn;
    if (byteIn == '\n') {
      //command finished
      cmd[cmdIndex] = '\0';
      Serial.print("El Comando recibido fue ");
      Serial.println(cmd);
      cmdIndex = 0;
      if (strcmp(cmd, "PUERTA1_ON")  == 0) {
        digitalWrite(puerta1, LOW);
        digitalWrite(led1, LOW);
        puertaState1 = true;
      }
      else if (strcmp(cmd, "PUERTA2_ON")  == 0) {
        digitalWrite(puerta2, LOW);
        digitalWrite(led2, LOW);
        puertaState1 = true;
      } else {
        Serial.println(F("Comando Desconcocido!"));
        Serial.println();
      }
    } else {
      if (cmdIndex++ >= MAX_CMD_LENGTH) {
        cmdIndex = 0;
      }
    }
  }
}

///////////////////////////////////////////////////////////////////
//            RUTINA QUE SE ENCARGA DE APAGAR LOS RELEVOS        //
///////////////////////////////////////////////////////////////////
void statusoff() {
  currentMillis = millis();
  if ((puertaState1 = true) && (currentMillis - previousMillis1 > interval1))
  {
    digitalWrite(puerta1, HIGH);
    digitalWrite(led1, HIGH);
    puertaState1 = false;
    Serial.println(F("Cerrando Puerta 1"));
    Serial.println();
    Serial.println("Contenido de las variables currentMillis, previousMillis1, interval1");
    Serial.println(currentMillis);
    Serial.println(previousMillis1);
    Serial.println(interval1);
    previousMillis1 = currentMillis;
  }

  if ((puertaState2 = true) && (currentMillis - previousMillis2 > interval2))
  {
    digitalWrite(puerta2, HIGH);
    digitalWrite(led2, HIGH);
    puertaState2 = false;
    Serial.println(F("Cerrando Puerta 2"));
    Serial.println();
    Serial.println("Contenido de las variables currentMillis, previousMillis1, interval1");
    Serial.println(currentMillis);
    Serial.println(previousMillis2);
    Serial.println(interval2);
    previousMillis2 = currentMillis;
  }
}

porfavor, delay(5000U); y delay(5000UL);

tu no habla mucho español, sorry :frowning:

En el comando que reconoce PUERTA2_ON dice

else if (strcmp(cmd, "PUERTA2_ON")  == 0) {
        digitalWrite(puerta2, LOW);
        digitalWrite(led2, LOW);
        puertaState1 = true; // ERROR

debe decir

else if (strcmp(cmd, "PUERTA2_ON")  == 0) {
        digitalWrite(puerta2, LOW);
        digitalWrite(led2, LOW);
        puertaState2 = true;

Hola amigos gracias por tan pronta respuesta, ya he corregido el error tipográfico que tenia en el código y he realizado algunos cambios al codigo, pero sigo teniendo pequeños problemas con este pequeño trabajo.

  1. cuando envió el comando PUERTA1_ON y PUERTA2_ON por primera vez aveces no hace el siclo del temporizador de los 5000ms solo enciende medio segundo y se apagan, nuevamente envió los comando y si hace el siclo de temporizado, mejor dicho aveces funciona y aveces, no se que pueda ser por que en la lógica del programa parece estar bien.
///////////////////////////////////////////////////////////////////
// Interface serial para control de puerta por medio de comandos //
// Parametros configurados:                                      //
// Velocidad de comunicacion 115200 / 8 / N / 1                  //
// Comando a recibir por el puerto serial PUERTA_ON.             //
// Tiempo de apertura puerta 5 segundos.                         //
// Retorna informacion de procesamiento del comando.             //
///////////////////////////////////////////////////////////////////

int MAX_CMD_LENGTH = 10;
int cmdIndex = 0;
char cmd[10];
char incomingByte;

#define led1     5
#define led2     6
#define puerta1  7
#define puerta2  8

unsigned long currentMillis;
unsigned long previousMillis1 = 0;    //Variable que se usara para saber la ultima vez que se ejecuto el if
unsigned long previousMillis2 = 0;    //Variable que se usara para saber la ultima vez que se ejecuto el if
const long interval1 = 7000;          //El intervalo que determina cada cuanto se entra al if
const long interval2 = 7000;          //El intervalo que determina cada cuanto se entra al if
boolean puertaState1 = false;
boolean puertaState2 = false;

///////////////////////////////////////////////////////////////////
//              Configuracion del Dispositivo                    //
///////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);
  pinMode(puerta1, OUTPUT);
  digitalWrite(puerta1, HIGH);
  pinMode(puerta2, OUTPUT);
  digitalWrite(puerta2, HIGH);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  Serial.println(F("SISTEMA LISTO Y ESPERANDO COMANDO ....."));
  Serial.println();
}

///////////////////////////////////////////////////////////////////
//                        Programa Principal                     //
///////////////////////////////////////////////////////////////////
void loop() {
  serialcom();
  statusoff();
}

///////////////////////////////////////////////////////////////////
//RUTINA QUE SE ENCARGA DE RECIBIR EL COMANDO POR EL PUERTO SERIE//
///////////////////////////////////////////////////////////////////
void serialcom() {
  if (incomingByte = Serial.available() > 0) {
    char byteIn = Serial.read();
    cmd[cmdIndex] = byteIn;
    if (byteIn == '\n') {
      //command finished
      cmd[cmdIndex] = '\0';
      Serial.print("El Comando recibido fue ");
      Serial.println(cmd);
      cmdIndex = 0;
      if (strcmp(cmd, "PUERTA1_ON")  == 0) {
        digitalWrite(puerta1, LOW);
        digitalWrite(led1, LOW);
        puertaState1 = true;
      }
      else if (strcmp(cmd, "PUERTA2_ON")  == 0) {
        digitalWrite(puerta2, LOW);
        digitalWrite(led2, LOW);
        puertaState2 = true;
      } else {
        Serial.println(F("Comando Desconcocido!"));
        Serial.println();
      }
    } else {
      if (cmdIndex++ >= MAX_CMD_LENGTH) {
        cmdIndex = 0;
      }
    }
  }
}

///////////////////////////////////////////////////////////////////
//            RUTINA QUE SE ENCARGA DE APAGAR LOS RELEVOS        //
///////////////////////////////////////////////////////////////////
void statusoff() {
  if ((puertaState1 = true) && (millis() - previousMillis1 > interval1))
  {
    digitalWrite(puerta1, HIGH);
    digitalWrite(led1, HIGH);
    puertaState1 = false;
    /*Serial.println(F("Cerrando Puerta 1"));
    Serial.println();
    Serial.println("Contenido de las variables currentMillis, previousMillis1, interval1");
    Serial.println(currentMillis);
    Serial.println(previousMillis1);
    Serial.println(interval1);
    */
    previousMillis1 = millis();
  }

  if ((puertaState2 = true) && (millis() - previousMillis2 > interval2))
  {
    digitalWrite(puerta2, HIGH);
    digitalWrite(led2, HIGH);
    puertaState2 = false;
    /*Serial.println(F("Cerrando Puerta 2"));
    Serial.println();
    Serial.println("Contenido de las variables currentMillis, previousMillis1, interval1");
    Serial.println(currentMillis);
    Serial.println(previousMillis2);
    Serial.println(interval2);
    */
    previousMillis2 = millis();
  }
}

Eso ocurre porque para mi gusto previousMillis1 o 2 no deben estar donde los pusiste. Con la acción que inicia el timer o retardo ajustas previousMillis1 o 2 asi

void serialcom() {

  if (incomingByte = Serial.available() > 0) {
    char byteIn = Serial.read();
    cmd[cmdIndex] = byteIn;
    if (byteIn == '\n') {
      //command finished
      cmd[cmdIndex] = '\0';
      Serial.print("El Comando recibido fue ");
      Serial.println(cmd);
      cmdIndex = 0;
      if (strcmp(cmd, "PUERTA1_ON")  == 0) {
        digitalWrite(puerta1, LOW);
        digitalWrite(led1, LOW);
        puertaState1 = true;
        previousMillis1 = millis();
      }
      else if (strcmp(cmd, "PUERTA2_ON")  == 0) {
        digitalWrite(puerta2, LOW);
        digitalWrite(led2, LOW);
        puertaState2 = true;
        previousMillis2 = millis();
      } else {
        Serial.println(F("Comando Desconcocido!"));
        Serial.println();
      }
    } else {
      if (cmdIndex++ >= MAX_CMD_LENGTH) {
        cmdIndex = 0;
      }
    }
  }
}

///////////////////////////////////////////////////////////////////
//            RUTINA QUE SE ENCARGA DE APAGAR LOS RELEVOS        //
///////////////////////////////////////////////////////////////////
void statusoff() {
  if ((puertaState1 = true) && (millis() - previousMillis1 > interval1))  {
    digitalWrite(puerta1, HIGH);
    digitalWrite(led1, HIGH);
    puertaState1 = false;
  }

  if ((puertaState2 = true) && (millis() - previousMillis2 > interval2))  {
    digitalWrite(puerta2, HIGH);
    digitalWrite(led2, HIGH);
    puertaState2 = false;
  }
}

Hola hermano surbyte, estas es todo lo correcto mil gracias por ayudarme y aclarar estas pequeñas dudas, por el momento todo esta trabajando como debería ser pego el código para quienes lo necesiten.

///////////////////////////////////////////////////////////////////
// Interface serial para control de puerta por medio de comandos //
// Parametros configurados:                                      //
// Velocidad de comunicacion 115200 / 8 / N / 1                  //
// Comando a recibir por el puerto serial PUERTA_ON.             //
// Tiempo de apertura puerta 5 segundos.                         //
// Retorna informacion de procesamiento del comando.             //
///////////////////////////////////////////////////////////////////

int MAX_CMD_LENGTH = 10;
int cmdIndex = 0;
char cmd[10];
char incomingByte;

#define led1     5
#define led2     6
#define puerta1  7
#define puerta2  8

unsigned long currentMillis;
unsigned long previousMillis1 = 0;    //Variable que se usara para saber la ultima vez que se ejecuto el if
unsigned long previousMillis2 = 0;    //Variable que se usara para saber la ultima vez que se ejecuto el if
const long interval1 = 15000;          //El intervalo que determina cada cuanto se entra al if
const long interval2 = 5000;          //El intervalo que determina cada cuanto se entra al if
boolean puertaState1 = false;
boolean puertaState2 = false;

///////////////////////////////////////////////////////////////////
//              Configuracion del Dispositivo                    //
///////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);
  pinMode(puerta1, OUTPUT);
  digitalWrite(puerta1, HIGH);
  pinMode(puerta2, OUTPUT);
  digitalWrite(puerta2, HIGH);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  Serial.println(F("SISTEMA LISTO Y ESPERANDO COMANDO ....."));
  Serial.println();
}

///////////////////////////////////////////////////////////////////
//                        Programa Principal                     //
///////////////////////////////////////////////////////////////////
void loop() {
  serialcom();
  statusoff();
}

///////////////////////////////////////////////////////////////////
//RUTINA QUE SE ENCARGA DE RECIBIR EL COMANDO POR EL PUERTO SERIE//
///////////////////////////////////////////////////////////////////
void serialcom() {
  if (incomingByte = Serial.available() > 0) {
    char byteIn = Serial.read();
    cmd[cmdIndex] = byteIn;
    if (byteIn == '\n') {
      //command finished
      cmd[cmdIndex] = '\0';
      Serial.print("El Comando recibido fue ");
      Serial.println(cmd);
      cmdIndex = 0;
      if (strcmp(cmd, "PUERTA1_ON")  == 0) {
        digitalWrite(puerta1, LOW);
        digitalWrite(led1, LOW);
        puertaState1 = true;
        previousMillis1 = millis();
      }
      else if (strcmp(cmd, "PUERTA2_ON")  == 0) {
        digitalWrite(puerta2, LOW);
        digitalWrite(led2, LOW);
        puertaState2 = true;
        previousMillis2 = millis();
      } else {
        Serial.println(F("Comando Desconcocido!"));
        Serial.println();
      }
    } else {
      if (cmdIndex++ >= MAX_CMD_LENGTH) {
        cmdIndex = 0;
      }
    }
  }
}

///////////////////////////////////////////////////////////////////
//            RUTINA QUE SE ENCARGA DE APAGAR LOS RELEVOS        //
///////////////////////////////////////////////////////////////////
void statusoff() {
  if ((puertaState1 = true) && (millis() - previousMillis1 > interval1))
  {
    digitalWrite(puerta1, HIGH);
    digitalWrite(led1, HIGH);
    puertaState1 = false;
  }

  if ((puertaState2 = true) && (millis() - previousMillis2 > interval2))
  {
    digitalWrite(puerta2, HIGH);
    digitalWrite(led2, HIGH);
    puertaState2 = false;
  }
}

Si esta resuelto, agrega SOLUCIONADO al título asi lo cerramos.