Problema con mas de una tarea en arduino

Hola buenas noches, soy un estudiante de ingeniería que está realizando el proyecto de un hinvernadero, la cosa está en que quiero medir cada 30 seg la temperatura y humedad . Dependiendo de una serie de condiciones que haga una función u otra, El programa tiene que encender y apagar un extractor cada 10 minutos y al utilizar los delay no mide la temperatura en esos instantes y puede desfavorecer las condiciones de la instalación es por eso que quería ponerlo de alguna forma para poder actuar en funcion de la temperatura esté donde esté el programa.
Codigo:

const int sensorPin = A0;   // seleccionar la entrada para el sensor
int sensorValue;         // variable que almacena el valor raw (0 a 1023)
float value;            // variable que almacena el voltaje (0.0 a 5.0)
int umbral = 25 ;

#include "DHT.h"  
#define DHTTYPE DHT11   

const int DHTPin = 5;     // Pin del sensor de temperatura y humedad
DHT dht(DHTPin, DHTTYPE);

int extractor = 2;

void setup() {

 Serial.begin(9600);
  
pinMode(extractor, OUTPUT);

Serial.println("Iniciando sensor!");

dht.begin();

}
// cambio de escala entre floats
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void loop() {

delay(6000);
// tiempo cada cuanto mide en milisegundos
     //Leer temperatura y humedad
  float h = dht.readHumidity();
  float t = dht.readTemperature();


  if (isnan(h) || isnan(t)) {
     Serial.println("Fallo en el sensor");
     return;
  }
  
 sensorValue = analogRead(sensorPin);          // realizar la lectura
 value = fmap(sensorValue, 0, 1023, 0.0, 5.0);   // cambiar escala a 0.0 - 5.0

  Serial.println("Valor de luz: ");
  Serial.println(value);                     // mostrar el valor por serial
  Serial.println("Humedad: ");
  Serial.print(h);
  Serial.println(" %\t");
  Serial.println("Temperatura: ");
  Serial.print(t);
  Serial.println(" *C ");

if (value > 0.5){
  if (( t >= 21 ) &&(t<=27))
  {
 digitalWrite(extractor,HIGH);
 delay(600000);
 digitalWrite (extractor,LOW);
 delay(600000);
 
}
 if (t>28) {
   digitalWrite(extractor,HIGH);
 }
}
if (value < 0.2){
 if ((t>18)&&(t<24)){
 digitalWrite(extractor,HIGH);
 delay(600000);
 digitalWrite (extractor,LOW);
 delay(600000);
}
}

}

Gracias a todos de antemano.
Jonathan.

If I am understanding you correctly, you want to read the temperature during the 10 minute waiting period for the extractor. Two choices, maybe you might want to look into “interrupts” to read the temperature while the main code is doing its job. Or, instead of using a really long delay, break up your delay with a for loop. Make each loop delay a preset time (say 1 minute). In the middle of the loop, take a temperature measurement. This is not an advanced technique (called polling) but it may suffice for your project.

No uses delay() nunca si no lo tienes muy claro. Lo mejor es que el programa esté siempre corriendo. Declara una variable UnisignedLong=millis() (Tiempo en ms desde el último réset) y condiciona la lectura de la sonda y encendido del extractor cada 6000ms.

Ej:

void setup() {
unsigned long Tim1;
bool Clock1=false;
}
void loop() {
if ((Tim1 + 6000) > millis())
 {
   Clock1 = true;
   Tim1=millis();
 }
else
{
   Clock1 = false;
}
if (Clock1==true)
{
// Aquí pones lo que quieras hacer (Una sola vez) cada 10 minutos 
}