Problema con codigo [SOLUCIONADO]

el problema es el siguiente, tengo conectado dos, una pantalla lcd y un modulo micro sd, ahora la pantalla lcd me muestra los datos de los sensores cada 2.5 segundos, pero no logro hacer que se almacenen los datos en la micro sd cada 5 minutos sino que se graban cada 0.5 segundos
su ayuda por favor

#include <LiquidCrystal.h>
#include <SD.h>

LiquidCrystal lcd(9, 8, 5, 4, 3, 2);
//Hardware pin definitions


int UVOUT = A0; //Output from the sensor
int REF_3V3 = A1; //3.3V power on the Arduino board

  int muestreo = A2; // Pin analógico para el pin Vo del sensor GP2Y10
  int IRED = 10; // Pin digital para el IRED
   // Tiempos constantes para el pulso de control del IRED
  int retardo_1 = 280;
  int retardo_2 = 40;
  int retardo_3 = 9680;
   // Variables auxiliares del programa
  int valor = 0;
  float ppm = 0;
  float voltaje = 0;
  float densidad_polvo = 0;
  float ppm_real = 0;
  int i=0;

File myFile;
void setup()
{
  lcd.begin(20, 4);
  pinMode(UVOUT, INPUT);
  pinMode(REF_3V3, INPUT);
  
 //inicio
    pinMode(IRED,OUTPUT); 
    pinMode(muestreo,INPUT);// Pin digital 2 como salida
 //fin gp2y0f
 
Serial.begin(9600);
Serial.print("Iniciando SD ...");
  if (!SD.begin(6)) {
    Serial.println("No se pudo inicializar");
    return;
  }
  Serial.println("inicializacion exitosa");

   if(!SD.exists("datalog.csv"))
  {
      myFile = SD.open("datalog.csv", FILE_WRITE);
      if (myFile) {
        Serial.println("Archivo nuevo, Escribiendo encabezado(fila 1)");
        myFile.println("Tiempo(ms),Sensor uv,Densidad,PPM");
        myFile.close();
      } else {

        Serial.println("Error creando el archivo datalog.csv");
      }
  }
}
 
void loop()
{

   myFile = SD.open("datalog.csv", FILE_WRITE);//abrimos  el archivo
  
   if (myFile) { 
        Serial.print("Escribiendo SD: ");
        
  int uvLevel = averageAnalogRead(UVOUT);
  int refLevel = averageAnalogRead(REF_3V3);
    //Use el pin de alimentación de 3.3V como referencia para obtener un valor de salida muy preciso del sensor
  float outputVoltage = 3.3 / refLevel * uvLevel;
  float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convierta el voltaje a un nivel de intensidad UV

  
    lcd.clear();
    lcd.print("Intensidad Rayos UV");
    lcd.setCursor(0, 1);
    lcd.print(uvIntensity);
    lcd.print(" mW/cm^2");
      Serial.println();
  

  
    i=i+1; // Contador de pulsos de control
    // El IRED se va a activar con LOW y se desactiva con HIGH según las conexiones internas del sensor
    digitalWrite(IRED,LOW); // LED activado
    delayMicroseconds(retardo_1); // Retardo de 0,28ms
    valor = analogRead(muestreo); // Se muestrea el valor de Vo a través del pin analógico A0
    ppm = ppm + valor; // Media ponderada de Vo
    delayMicroseconds(retardo_2); // Retardo de 0,04ms
    digitalWrite(IRED,HIGH); // LED desactivado
    delayMicroseconds(retardo_3); // Retardo de 9,68ms
    // retardo_1 + retardo_2 + retardo_3 = 10ms
   
    // Fórmulas matemáticas para el cálculo de los valores del sensor GP2Y10
    voltaje = ppm/i*0.0049; // Voltaje en voltios (media de los valores ppm obtenidos)
    densidad_polvo = 0.17*voltaje-0.1; // Densidad de partículas de polvo en mg/m³
    ppm_real = (voltaje-0.0356)*120000; // Concentración de partículas de polvo en ppm
    if (ppm_real < 0)
      ppm_real = 0;
    if (densidad_polvo < 0 )
      densidad_polvo = 0;
    if (densidad_polvo > 0.5)
      densidad_polvo = 0.5;



    // Presentamos la densidad de partículas de polvo a través del LCD 1602
    
    lcd.setCursor(0,2);
    lcd.print("Densidad de polvo");
    lcd.setCursor(0,3);
    lcd.print(densidad_polvo,2); // Tres decimales
    lcd.print(" mg/m3");
    delay(2500);
   
    // Presentamos la concentración de partículas de polvo a través del LCD 1602
   
    lcd.setCursor(0,2);
    lcd.print("Concentracion PPM");
    lcd.setCursor(0,3);
    lcd.print(ppm_real,2); // Tres decimales
    lcd.print(" PPM  ");
    delay(2500);  
     

//fin


        myFile.print(millis());
        myFile.print(",");

       
        myFile.print(uvIntensity);
        myFile.print(",");
     
        myFile.print(densidad_polvo);
        myFile.print(",");
        myFile.println(ppm_real);
       
 
    myFile.close(); //cerramos el archivo // sd
         Serial.print("ML8511 output: ");
         Serial.print(uvLevel);
         Serial.print(" / ML8511 voltage: ");
         Serial.print(outputVoltage);
         Serial.print(" / Intensidad UV (mW/cm^2): ");
         Serial.print(uvIntensity);  
         Serial.println();

         Serial.print(" / GP2Y10F output: ");
         Serial.print(muestreo);
         Serial.print(" / GP2Y10F voltage: ");
         Serial.print(voltaje);
         Serial.print(" / Densidad de polvo (mg/m3): ");
         Serial.print(densidad_polvo);
         Serial.println(); 
          
         Serial.print(" / GP2Y10F output: ");
         Serial.print(muestreo);
         Serial.print(" / GP2Y10F voltage: ");
         Serial.print(voltaje);
         Serial.print(" / Concentracion PPM (PPM): ");
         Serial.print(ppm_real);
         Serial.println(); 

       
} else {
    Serial.println("Error al abrir el archivo");

  }
  delay(100);
  
}
 
//Toma un promedio de lecturas en un pin dado
//Devuelve el promedio
int averageAnalogRead(int pinToRead)
{
  byte numberOfReadings = 8;
  unsigned int runningValue = 0; 
 
  for(int x = 0 ; x < numberOfReadings ; x++)
    runningValue += analogRead(pinToRead);
  runningValue /= numberOfReadings;
 
  return(runningValue);
}
 
float mapfloat(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;
}

En ningún lado de tu código se ve donde está el temporizador de 5 minutos, así que es imposible que se grabe cinco minutos.

Por otro lado te recomiendo que huyas de usar delay para hacer retrasos, usa millis en su lugar. En la sección de DOCUMENTACION hay varios tutoriales.

En tu caso te sugiero dos temporizadores: uno para la pantalla y otro para escribir en la SD. Y el código debería lucir a algo como esto:

unsigned long t25;
unsigned long t5;

void setup() {
  
}

void loop() {
  // Lee los sensores solamente.
  leer_datos(); 

  // Cada 2.5 segundos actualizas la información en el LCD.
  if ( millis()-t25 >=2500 ) {
    informacion_lcd();
    t25 = millis();  
  }

  // Cada 5 minutos guarda los datos en la SD.
  if ( millis()-t5 >= 5*60*1000 ) {
    escribe_sd();
    t5 = millis();
  }

}

PD. Por favor edita tu post para que el código vaya entre etiquetas de codigo.

ya probé el codigo con millis, me compila y lo sube sin errores, pero no me graba nada en la sd, no se si estoy haciendo algo mal con el codigo

#include <LiquidCrystal.h>
#include <SD.h>

LiquidCrystal lcd(9, 8, 5, 4, 3, 2);
//Hardware pin definitions


int UVOUT = A0; //Output from the sensor
int REF_3V3 = A1; //3.3V power on the Arduino board

  int muestreo = A2; // Pin analógico para el pin Vo del sensor GP2Y10
  int IRED = 10; // Pin digital para el IRED
   // Tiempos constantes para el pulso de control del IRED
  int retardo_1 = 280;
  int retardo_2 = 40;
  int retardo_3 = 9680;
   // Variables auxiliares del programa
  int valor = 0;
  float ppm = 0;
  float voltaje = 0;
  float densidad_polvo = 0;
  float ppm_real = 0;
  int i=0;
  
unsigned long t25;
unsigned long t5;

File myFile;
void setup()
{

  lcd.begin(20, 4);
  pinMode(UVOUT, INPUT);
  pinMode(REF_3V3, INPUT);
  
 //inicio
    pinMode(IRED,OUTPUT); 
    pinMode(muestreo,INPUT);// Pin digital 2 como salida
 //fin gp2y0f
 
Serial.begin(9600);
Serial.print("Iniciando SD ...");
  if (!SD.begin(6)) {
    Serial.println("No se pudo inicializar");
    return;
  }
  Serial.println("inicializacion exitosa");

   if(!SD.exists("datalog.csv"))
  {
      myFile = SD.open("datalog.csv", FILE_WRITE);
      if (myFile) {
        Serial.println("Archivo nuevo, Escribiendo encabezado(fila 1)");
        myFile.println("Tiempo(ms),Sensor uv,Densidad,PPM");
        myFile.close();
      } else {

        Serial.println("Error creando el archivo datalog.csv");
      }
  }
}
 
void loop()
{

   myFile = SD.open("datalog.csv", FILE_WRITE);//abrimos  el archivo
  
   if (myFile) { 
        Serial.print("Escribiendo SD: ");
        
  int uvLevel = averageAnalogRead(UVOUT);
  int refLevel = averageAnalogRead(REF_3V3);
    //Use el pin de alimentación de 3.3V como referencia para obtener un valor de salida muy preciso del sensor
  float outputVoltage = 3.3 / refLevel * uvLevel;
  float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convierta el voltaje a un nivel de intensidad UV

  
    lcd.clear();
    lcd.print("Intensidad Rayos UV");
    lcd.setCursor(0, 1);
    lcd.print(uvIntensity);
    lcd.print(" mW/cm^2");
      Serial.println();
  

  
    i=i+1; // Contador de pulsos de control
    // El IRED se va a activar con LOW y se desactiva con HIGH según las conexiones internas del sensor
    digitalWrite(IRED,LOW); // LED activado
    delayMicroseconds(retardo_1); // Retardo de 0,28ms
    valor = analogRead(muestreo); // Se muestrea el valor de Vo a través del pin analógico A0
    ppm = ppm + valor; // Media ponderada de Vo
    delayMicroseconds(retardo_2); // Retardo de 0,04ms
    digitalWrite(IRED,HIGH); // LED desactivado
    delayMicroseconds(retardo_3); // Retardo de 9,68ms
    // retardo_1 + retardo_2 + retardo_3 = 10ms
   
    // Fórmulas matemáticas para el cálculo de los valores del sensor GP2Y10
    voltaje = ppm/i*0.0049; // Voltaje en voltios (media de los valores ppm obtenidos)
    densidad_polvo = 0.17*voltaje-0.1; // Densidad de partículas de polvo en mg/m³
    ppm_real = (voltaje-0.0356)*120000; // Concentración de partículas de polvo en ppm
    if (ppm_real < 0)
      ppm_real = 0;
    if (densidad_polvo < 0 )
      densidad_polvo = 0;
    if (densidad_polvo > 0.5)
      densidad_polvo = 0.5;



    // Presentamos la densidad de partículas de polvo a través del LCD 1602
    
    lcd.setCursor(0,2);
    lcd.print("Densidad de polvo");
    lcd.setCursor(0,3);
    lcd.print(densidad_polvo,2); // Tres decimales
    lcd.print(" mg/m3");
    delay(2500);
   
    // Presentamos la concentración de partículas de polvo a través del LCD 1602
   
    lcd.setCursor(0,2);
    lcd.print("Concentracion PPM");
    lcd.setCursor(0,3);
    lcd.print(ppm_real,2); // Tres decimales
    lcd.print(" PPM  ");
    delay(2500);  
     

//fin
  // Cada 5 minutos guarda los datos en la SD.
  if ( millis()-t5 >= 5*60*1000 ) {
    t5 = millis();
        myFile.print(",");

       
        myFile.print(uvIntensity);
        myFile.print(",");
     
        myFile.print(densidad_polvo);
        myFile.print(",");
        myFile.println(ppm_real);

  }


       
 
    myFile.close(); //cerramos el archivo // sd
         Serial.print("ML8511 output: ");
         Serial.print(uvLevel);
         Serial.print(" / ML8511 voltage: ");
         Serial.print(outputVoltage);
         Serial.print(" / Intensidad UV (mW/cm^2): ");
         Serial.print(uvIntensity);  
         Serial.println();

         Serial.print(" / GP2Y10F output: ");
         Serial.print(muestreo);
         Serial.print(" / GP2Y10F voltage: ");
         Serial.print(voltaje);
         Serial.print(" / Densidad de polvo (mg/m3): ");
         Serial.print(densidad_polvo);
         Serial.println(); 
          
         Serial.print(" / GP2Y10F output: ");
         Serial.print(muestreo);
         Serial.print(" / GP2Y10F voltage: ");
         Serial.print(voltaje);
         Serial.print(" / Concentracion PPM (PPM): ");
         Serial.print(ppm_real);
         Serial.println(); 

       
} else {
    Serial.println("Error al abrir el archivo");

  }
  delay(100);
  
}
 
//Toma un promedio de lecturas en un pin dado
//Devuelve el promedio
int averageAnalogRead(int pinToRead)
{
  byte numberOfReadings = 8;
  unsigned int runningValue = 0; 
 
  for(int x = 0 ; x < numberOfReadings ; x++)
    runningValue += analogRead(pinToRead);
  runningValue /= numberOfReadings;
 
  return(runningValue);
}
 
float mapfloat(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;
}

Si usas millis() para que conservas dos delay(2500)?

He modificado una parte pero el código es largo y lo dejo para otro momento

int UVOUT = A0; //Output from the sensor
int REF_3V3 = A1; //3.3V power on the Arduino board

int muestreo = A2; // Pin analógico para el pin Vo del sensor GP2Y10
int IRED = 10; // Pin digital para el IRED
// Tiempos constantes para el pulso de control del IRED
int retardo_1 = 280;
int retardo_2 = 40;
int retardo_3 = 9680;
// Variables auxiliares del programa
int valor = 0;
float ppm = 0;
float voltaje = 0;
float densidad_polvo = 0;
float ppm_real = 0;
int i=0;
byte estado = 0;
  
unsigned long t25;
unsigned long t5;

File myFile;
void setup()
{

  lcd.begin(20, 4);
  pinMode(UVOUT, INPUT);
  pinMode(REF_3V3, INPUT);
  
 //inicio
    pinMode(IRED,OUTPUT);
    pinMode(muestreo,INPUT);// Pin digital 2 como salida
 //fin gp2y0f
 
Serial.begin(9600);
Serial.print("Iniciando SD ...");
  if (!SD.begin(6)) {
    Serial.println("No se pudo inicializar");
    return;
  }
  Serial.println("inicializacion exitosa");

   if(!SD.exists("datalog.csv"))
  {
      myFile = SD.open("datalog.csv", FILE_WRITE);
      if (myFile) {
        Serial.println("Archivo nuevo, Escribiendo encabezado(fila 1)");
        myFile.println("Tiempo(ms),Sensor uv,Densidad,PPM");
        myFile.close();
      } else {

        Serial.println("Error creando el archivo datalog.csv");
      }
  }
}
 
void loop() {

  int uvLevel = averageAnalogRead(UVOUT);
  int refLevel = averageAnalogRead(REF_3V3);
  //Use el pin de alimentación de 3.3V como referencia para obtener un valor de salida muy preciso del sensor
  float outputVoltage = 3.3 / refLevel * uvLevel;
  float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convierta el voltaje a un nivel de intensidad UV

  lcd.clear();
  lcd.print("Intensidad Rayos UV");
  lcd.setCursor(0, 1);
  lcd.print(uvIntensity);
  lcd.print(" mW/cm^2");
  Serial.println();

  i=i+1; // Contador de pulsos de control
  // El IRED se va a activar con LOW y se desactiva con HIGH según las conexiones internas del sensor
  digitalWrite(IRED,LOW); // LED activado
  delayMicroseconds(retardo_1); // Retardo de 0,28ms
  valor = analogRead(muestreo); // Se muestrea el valor de Vo a través del pin analógico A0
  ppm = ppm + valor; // Media ponderada de Vo
  delayMicroseconds(retardo_2); // Retardo de 0,04ms
  digitalWrite(IRED,HIGH); // LED desactivado
  delayMicroseconds(retardo_3); // Retardo de 9,68ms
  // retardo_1 + retardo_2 + retardo_3 = 10ms

  // Fórmulas matemáticas para el cálculo de los valores del sensor GP2Y10
  voltaje = ppm/i*0.0049; // Voltaje en voltios (media de los valores ppm obtenidos)
  densidad_polvo = 0.17*voltaje-0.1; // Densidad de partículas de polvo en mg/m³
  ppm_real = (voltaje-0.0356)*120000; // Concentración de partículas de polvo en ppm
  if (ppm_real < 0)
      ppm_real = 0;
  if (densidad_polvo < 0 )
      densidad_polvo = 0;
  if (densidad_polvo > 0.5)
      densidad_polvo = 0.5;

  switch(estado) {
     case 0:  // Presentamos la densidad de partículas de polvo a través del LCD 1602
              estado = 1;
              start = millis();
              break;
     case 1:  if (millis() - start > 2500) {
                  lcd.setCursor(0,2);
                  lcd.print("Densidad de polvo");
                  lcd.setCursor(0,3);
                  lcd.print(densidad_polvo,2); // Tres decimales
                  lcd.print(" mg/m3");
                  estado = 2;
                  start = millis();
              }
              break;
      case 2: if (millis() - start > 2500) {
                  // Presentamos la concentración de partículas de polvo a través del LCD 1602
                  lcd.setCursor(0,2);
                  lcd.print("Concentracion PPM");
                  lcd.setCursor(0,3);
                  lcd.print(ppm_real,2); // Tres decimales
                  lcd.print(" PPM  ");                  
                  estado = 3;
                  start = millis();
              }
              break;
       case 3: if (millis() - start > 2500) {
                  Serial.print("ML8511 output: ");
                  Serial.print(uvLevel);
                  Serial.print(" / ML8511 voltage: ");
                  Serial.print(outputVoltage);
                  Serial.print(" / Intensidad UV (mW/cm^2): ");
                  Serial.print(uvIntensity);  
                  Serial.println();

                  Serial.print(" / GP2Y10F output: ");
                  Serial.print(muestreo);
                  Serial.print(" / GP2Y10F voltage: ");
                  Serial.print(voltaje);
                  Serial.print(" / Densidad de polvo (mg/m3): ");
                  Serial.print(densidad_polvo);
                  Serial.println();

                  Serial.print(" / GP2Y10F output: ");
                  Serial.print(muestreo);
                  Serial.print(" / GP2Y10F voltage: ");
                  Serial.print(voltaje);
                  Serial.print(" / Concentracion PPM (PPM): ");
                  Serial.print(ppm_real);
                  Serial.println();
                  estado = 0;
                }
                break;
      }
  }

  // Cada 5 minutos guarda los datos en la SD.
  if (millis()-t5 >= 300000) { // evitemos tanta cuenta por ciclo.
      myFile = SD.open("datalog.csv", FILE_WRITE);//abrimos  el archivo
      if (myFile) {
          Serial.print("Escribiendo SD: ");
          myFile.print(",");
          myFile.print(uvIntensity);
          myFile.print(",");
          myFile.print(densidad_polvo);
          myFile.print(",");
          myFile.println(ppm_real);
          myFile.close(); //cerramos el archivo // sd
      }
      else 
          Serial.println("Error al abrir el archivo");
      t5 = millis();
  }
}
 
//Toma un promedio de lecturas en un pin dado
//Devuelve el promedio
int averageAnalogRead(int pinToRead) {
  byte numberOfReadings = 8;
  unsigned int runningValue = 0;
 
  for(int x = 0 ; x < numberOfReadings ; x++)
    runningValue += analogRead(pinToRead);
  runningValue /= numberOfReadings;
 
  return(runningValue);
}
 
float mapfloat(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;
}

Acabo de ver que tienes muchos mas retardos de modo que lo que hice solo es parte de la modificación y tienes que implementar mas acciones en la máquina de estados que comencé a delinear.

Conclusión: no uses delay().

Muchas gracias, me sirvio de mucho, solo tuve que quitar los delay e implementar los millis y terminar de agregarle otro sensor
Muchas gracias