Funciones dentro de void loop

Hola amigos este es mi primer post soy nuevo por aquí y también con Arduino. Bueno el tema es que viendo un tutorial aquí y otro ali, pude desarrollar un código( medio desordenado pero funcional), la idea de el es que coja la información del sensor la envíe al servidor donde se registra en una base de datos y luego se envía un mensaje de texto con el alerta.
todo funciona bien: el sensor recibe y envía los datos para ser procesados, se almacena en un String con los textos respectivo y después lo indico por el indice, y, como les dije funciona excepto con la muestra del resultado del sensor en la pantalla LCD.
Cuando llamo a la función para enviar los datos y la función para enviar el mensaje dentro de void loop, entoces ya no me muestra correctamente los cambios de la lectura de los ARRAYS y del sensor en la pantalla del LCD pero el sigue procesando y enviando informacion. Si quito a las funciones de dentro del void loop la informacion en pantalla se muestra bien.
Alguna manito por ai?

dejo aqui el loop

void loop() {
        envioDatos();
        envioMensaje();
        String textos[ARRAYTXT] = {"Componente nuevo ", "Desgaste inicial ", "Desgaste Normal ", "Desgaste Avanzado ", "Desgaste Critico "};
                      
       SENSOR = analogRead(pinHALL); 
       SENSOR = (5.0 * SENSOR /1024.0) * 1000 - n / m ;
       lcd.clear();                                   
       lcd.print("Her: " +String(SENSOR)+"(G)"); 
         
 
//Indicamos la instrucciones para determinar el rango de intensidad  
       
       if (SENSOR > 4200.00 ){   
          indice = 0;
            }else{                      
             if (SENSOR > 4000.00){        
                indice = 1; 
                   if (SENSOR > 3500.00){         
                     indice = 2;
                      } else{                             
                         if (SENSOR > 100.00){              
                           indice = 3;                    
                              } else{ 
                                  indice = 4;                
                         
               }
           }
       }
   }


// Escribiremos el mensaje en el LCD
      lcd.setCursor(0,1); 
      lcd.print(textos[indice]);       
      delay(43200);
      
}

aqui todo el codigo

void envioMensaje() {
    SIM900.print("AT+CMGF=1\r"); 
    delay(200);
    SIM900.println("AT + CMGS = \"+569xxxxxx\"");
    delay(200);
    SIM900.println("REPORTER SMS:");                                               
    SIM900.println("Desgaste = " +String(SENSOR)+" G");
                                
    SIM900.println("Mas informacion;");                                            
    SIM900.println("http://high-res.cl/manager/sensores/dashboard/");     
    SIM900.println("todos los derechos reservados ");                              
    delay(200);                                                                    
    SIM900.println((char)26);                                                      
    delay(200);                                                                    
    SIM900.println();                                                              
    };

void envioDatos()
{
  // inicializamos el servicio  http 
    gprsSerial.println("AT+HTTPINIT");  
    delay(2000);                        
    toSerial();                         
    
    // formateamos los valores del parametro http 
    gprsSerial.println("AT+HTTPPARA=\"URL\",\"http://high-res.cl/manager/sensores/connect.php?xxx=" +String (indice)+ "&xxx="+String(SENSOR)+"\""); 
    delay(2000);                                                                                                                   
    toSerial();                                                                             
    // formateamos la accion  http type 0 = GET, 1 = POST, 2 = HEAD
    gprsSerial.println("AT+HTTPACTION=0"); 
    delay(6000);                           
    toSerial();                            
    // leer la respuesta del servidor
    gprsSerial.println("AT+HTTPREAD");     
    delay(1000);                           
    toSerial();                           
    gprsSerial.println("");               
    gprsSerial.println("AT+HTTPTERM");    
    toSerial();                          
    delay(300);                          
    gprsSerial.println("");              
    delay(10000);                        
}

;

Hola bienvenido al foro te pido que por favor leas las nomas del foro, y coloques correctamente el código.
Ahora el problema es que tu código tiene muchos delay y lo que hace esa función es bloquear el flujo del programa hasta que pase el tiempo que le indicas, por ejemplo a lo que llamas la función envioDatos le toma 21.3 segundos, ahora en la función envioMensaje le toma 0.8 segundos entonces la información en la lcd en el primer loop le esta tomando 22.1 segundos, ahora en los demás actualizaciones le tomara mas tiempo porque al final tienes otro delay de 10 segundos, con lo cual, la información se actualiza cada 32.1 segundos, entonces para solucionar esto utiliza Millis revisa el tutorial de @victorjam Entender millis y no morir en el intento

Por favor edita tu posteo e inserta el código como corresponde (ver Normas del Foro, punto 7).

Así, a primera vista, tienes un delay de 43.2 segundos al final del loop(), 21.3 segundos de delays en envioDatos() y casi 1.segundo en envioMensaje().
O sea que tu loop "pega la vuelta" cada 65 segundos (más de un minuto).
Obviamente, muy ágil no es.

Saludos

Gracias por la pronta respuesta y disculpe por los errores en la publicación del código.

SWIFT no he podido entender a la función millis(), he seguido algunos ejemplos pero no he obtenido buenos resultados, por ejemplo si reemplazo el delay de las funciones envioDatos(); y envioMensaje(); no me funciona los envíos.
GATUL he tratado de reducir al máximo los tiempos, si lo reduzco mas no envía los mensajes ni los datos. No puede entender aun la función millis

revisare una y otra ves el tutorial de SWIFT para entenderlo.

saludos

Entiendo el tema de los tiempos necesarios para los envíos, lo que intenté explicarte es que, debido a esos tiempos, solo va a actualizar la información del display cada 65 segundos.

Y, ya que tuvimos la gentileza de responderte a pesar de no cumplir las normas, por favor, edita tu primer posteo y coloca el código como corresponde. Gracias

Moderador:

Gracias por la pronta respuesta y disculpe por los errores en la publicación del códig

Ellos te pueden disculpar y yo también pero tu no puedes seguir respondiendo sin editar el post incial usando las etiquetas de codigo.
Ve a las normas y préstale atención y luego edita.
Algo más, el código debe postearse completo, no solo el loop.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.