Duda con funcion delay

Hola, soy nuevo en el mundo Arduino y estoy haciendo un ventilador controlado por Bluetooth. Mi problema radica en que quiero hacer que se pueda programar para apagar a tiempos pre establecidos (30 m, 1 h, 2 h, 3 h y 6 h) y al alctivar, por ejemplo, el apagado en 6 horas no lo puedo cancelar, ni cambiar a un apagado a menos tiempo o directamente apagar el ventilador (ya que con la funcion delay se me "congela" la placa por el tiempo que dure el delay). ¿Como podria solucionar esto?. Desde ya muchas gracias.

si pones "arduino millis()" en el buscador de esta web o en google encontraras miles de post con informacion.es un tema que se ha tratado hasta la saciedad en este foro .Ademas tienes el ejemplo del ide "Blynk without delay" para estudiarlo.

Gracias por responder. Ya habia estado viendo la función millis(), pero no pude adaptarla a mi programa, y ademas no se si me permite, por ejemplo, una vez que se activo determinado tiempo para el apagado, cambiarlo por otro tiempo o apagarlo directamente.

Lo puedes enfocar de varias maneras....puedes almacenar los diferentes tiempos en un array y que cada vez que le des a un pulsador cambies el tiempo con una variable cuyo valor vaya del minimo al maximo del array y usarla como su indice.Luego dos pulsadores mas ,uno para iniciar conteo de tiempo y otro para parar/anular.Si no tienes lcd,puedes pasar por serial monitor que tiempo estas usando,cuanto llevas contando,etc

Ok, gracias. voy a probar lo que me dices. Si vien el proyecto no cuanta con un lcd, los daros del puerto serie los lee la aplicacion del celular que controla el proyecto, asi que eso no deberia ser problema.

algo como esto?

unsigned long tiempo0=0;
unsigned long tiempo1=5000;

void setup() {
 pinMode(1,OUTPUT); 
  digitalWrite(1, HIGH);
}

void loop()
{
unsigned int transcurrido = millis();

if (transcurrido - tiempo0 >= tiempo1) {
  
    tiempo0 = transcurrido;  //guarda el tiempo actual como referencia
     digitalWrite(1, LOW);
Serial.println("apagando");
    
    }

La verdad que me he dado la cabeza contra la pared, no encuentro forma de hacerlo funcionar (la aplicación Bluetooth, el encendido de las distintas velocidades y el apagado andan). Les pego el código del programa con el uso del delay, a ver si a alguien se le ocurre algo. Desde ya muchas gracias, y disculpen las molestias.

#define RELAY_ON 0
#define RELAY_OFF 1

void setup()
{
Serial.begin(9600); //Iniciar el serial
digitalWrite (3, RELAY_OFF);
digitalWrite (4, RELAY_OFF);
digitalWrite (5, RELAY_OFF);
pinMode(3, OUTPUT); //Establecer el pin 3 como salida
pinMode(4, OUTPUT); //Establecer el pin 4 como salida
pinMode(5, OUTPUT); //Establecer el pin 5 como salida
}


void loop()
{
if(Serial.available()>=1)
{
  char entrada = Serial.read(); //Leer un caracter

  if(entrada == '1') //Si es '1', encender velocidad 1
  {
     Serial.println("Velocidad 1");
     digitalWrite(4, RELAY_OFF);
     digitalWrite(5, RELAY_OFF);
     delay (20);
     digitalWrite(3, RELAY_ON);       
  }
  if(entrada == '2') //Si es '2', encender velocidad 2
  {
     Serial.println("Velocidad 2");
     digitalWrite(3, RELAY_OFF);
     digitalWrite(5, RELAY_OFF);
     delay (20);
     digitalWrite(4, RELAY_ON);
     }
  if(entrada == '3') //Si es '3', encender velocidad 3
  {
     Serial.println("Velocidad 3");
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);
     delay (20);
     digitalWrite(5, RELAY_ON);       
  }
  if(entrada == '4') //Si es '4', apagar todo
  {
     Serial.println("Apagado");
     digitalWrite(5, RELAY_OFF);
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);       
  }
  if(entrada == '5') //Si es '5', activar funcion dormir
  {
     Serial.println("Funcion dormir");
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);
     delay (20);
     digitalWrite(5, RELAY_ON);       
     delay (1800000);
     digitalWrite(3, RELAY_OFF);
     digitalWrite(5, RELAY_OFF);
     delay (20);
     digitalWrite(4, RELAY_ON);
     delay (3600000);
     digitalWrite(4, RELAY_OFF);
     digitalWrite(5, RELAY_OFF);
     delay (20);
     digitalWrite(3, RELAY_ON);
     delay (5400000);
     digitalWrite(5, RELAY_OFF);
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);    
  }
  if(entrada == '6') //Si es '6', apagar en 30 minutos
  {
     Serial.println("Apagar en 30 minutos");       
     delay (1800000);
     digitalWrite(5, RELAY_OFF);
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);       
  }
  if(entrada == '7') //Si es '7', apagar en 1 hora
  {
     Serial.println("Apagar en 1 hora");       
     delay (3600000);
     digitalWrite(5, RELAY_OFF);
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);      
  }
  if(entrada == '8') //Si es '8', apagar en 2 horas
  {
     Serial.println("Apagar en 2 horas");       
     delay (7200000);
     digitalWrite(5, RELAY_OFF);
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);       
  }
  if(entrada == '9') //Si es '9', apagar en 3 horas
  {
     Serial.println("Apagar en 3 horas");       
     delay (10800000);
     digitalWrite(5, RELAY_OFF);
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);      
  }
  if(entrada == '0') //Si es '0', apagar en 6 horas
  {
     Serial.println("Apagar en 6 horas");       
     delay (21600000);
     digitalWrite(5, RELAY_OFF);
     digitalWrite(3, RELAY_OFF);
     digitalWrite(4, RELAY_OFF);       
  }


  
}
}

Primero de todo repasa las normas del foro para saber como postear codigo adecuadamente y haz las correcciones oportunas.Te pongo un codigo modificado y comentado que tenia por ahi de algo parecido para activar una salida con diferentes tiempos.Puedes simular los botones con un cable haciendo contacto entre gnd y el pin de entrada correspondiente y ver lo que pasa en el serial monitor.Lo demas es adaptar a tus necesidades .

#define SALIDA 13
#define INICIO 2
#define PARO 3
#define CAMBIO_TIEMPO 4
#define REBOTE 150 // Ajustar si hay rebote en los pulsadores.

unsigned long t_inicio; // Almacena tiempo inicio de temporizador.
bool salida = false;
unsigned long tiempos[] = {60000,120000,180000,240000,300000}; // Tiempos en milisegundos para 1,2,3,4,5 minutos de ejemplo.
byte indice = 0; // Por defecto primer elemento del array(1 minuto)
byte elementos = sizeof(tiempos) / sizeof(tiempos[0]); // Obtenemos numero de elementos del array.

void setup() {
  Serial.begin(9600);
  pinMode(INICIO,INPUT_PULLUP);
  pinMode(PARO,INPUT_PULLUP);
  pinMode(CAMBIO_TIEMPO,INPUT_PULLUP);
  pinMode(SALIDA,OUTPUT);
}

void loop() {
  if(salida){ // Solo comprobamos tiempo si se ha activado la salida.
    if((millis() - t_inicio) >= tiempos[indice]){ //si el tiempo transcurrido supera el tiempo de temporizacion se apaga la salida.
      digitalWrite(SALIDA,LOW);
      salida = false; 
      Serial.println("Tiempo finalizado"); 
    }
  }
  if(digitalRead(INICIO) == LOW) { // Si se pulsa inicio activamos salida y almacenamos tiempo de inicio.
    digitalWrite(SALIDA,HIGH);
    t_inicio = millis();
    salida = true;  
    Serial.print("Iniciando tiempo:");
    Serial.println(tiempos[indice]);
    delay(REBOTE); //ajustar si hay rebote
  }
  if(digitalRead(PARO) == LOW && salida){ // Si se pulsa paro y la salida esta activada.
    digitalWrite(SALIDA,LOW); 
    salida = false;
    Serial.println("Parando tiempo");
    delay(REBOTE); //ajustar si hay rebote
  }
  if(digitalRead(CAMBIO_TIEMPO) == LOW){
    indice ++;
    if(indice == elementos) { indice = 0;}
    Serial.println(tiempos[indice]);
    delay(REBOTE); //ajustar si hay rebote
  }
}

no tengo idea si en arduino se pueden hacer retardos de tanto tiempo en realidad, quizás solo repitiendo, aun igual puedes intentar con un modulo RTC tengo entendido que se pueden programar alarmas a diferentes horas. quizás si es lo único que hace el micro pueda funcionar.

puedes hace un código que le programe alarmas al RTC según la duración que sea (obviamente que solo se repita una vez)
Es solo una idea nunca he trabajado con las alarmas del rtc. pero se me hace un poco raro poner a arduino a contar como loco, cuando podria estar dandote un plus o ahorrando energia

Veo que no miraste el código que te he posteado, solo hace falta indicar el tiempo de funcionamiento e incluso puedes programar más de un tiempo.
Ahora si lo que necesitas es el código ya implementado, este fin de semana le podría hechar una mirada

unsigned long tiempo0=0;
unsigned long tiempo1=5000;

void setup() {
 pinMode(1,OUTPUT); 
  digitalWrite(1, HIGH);
}

void loop()
{
unsigned int transcurrido = millis();

if (transcurrido - tiempo0 >= tiempo1) {
  
    tiempo0 = transcurrido;  //guarda el tiempo actual como referencia
     digitalWrite(1, LOW);
Serial.println("apagando");
    
    }