Arduino MEGA 2560 detiene su transmisión serial despues de 20 minutos

Buen día,

Estoy realizando un proyecto donde se tienen conectados 13 MAX6675 en los puertos digitales, con la finalidad de medir la temperatura a partir de termopares tipo K, y después de esto realizar la transmisión bluetooth, con un módulo HC-05, usando el puerto serie un dispositivo Android.

Además de esto se tiene un LCD conectado para observar los valores obtenidos, y se guardará la información en una tarjeta SD usando el módulo correspondiente.

Los distintos módulos usados están siendo alimentados directamente con los pines de 5V del Arduino.

Adjunto el código en el post debido a que superaba los caracteres permitidos en el foro.

El problema es que el Arduino detiene la transmisión serie, y por ello la transmisión por bluetooth al ejecutar el código durante 20 minutos, por lo que mi duda es si es debido a que se satura el puerto serie o por alguna otra razón que no logro encontrar.

El dispositivo debería funcionar por un periodo de 2 horas y transmitir continuamente través de una aplicación, la cual pierde la conexión bluetooth con el módulo HC-05.

Les agradezco su ayuda.

datos_09_conSD_2.ino (33.2 KB)

Alguien debió haberte enseñado a usar ciclos o loops y vectores o arrays.
Tu código es muy repetitivo pero espero que puedas dar un salto de calidad luego de la ayuda de este foro en ese sentido.
voy a reescribir y seguramente alguno de los profesores de programación (mejores que yo) tendrán versiones mejores aún.

Eso ayudará a entender mas fácilmente todo. Se paciente y en unas horas tendras algo y tal vez alguna respuesta a tu problema de los 20 min.

Hi,
Estoy de acuerdo con el consejo de surbyte. Debes de aprender a usar el "for loop" y tambien como hausrr un loop usando el "do/while" con una variable como contador. Adjunto un skecht que te demuestra como hacerlo. El primero te va a leer los TC del uno y te va salvar el contador en el array con un valor flotante de la localizacion. Si lo corres veras que cada localizacion del array. El segundo va a usar un array de 36 localizacion y te guarda el numero de localizacion de los valores del tc del unu , dos y los del tres. El ejemplo es para que veas cuanto te economizas usando el "for loop". otra cosa que te aconsejo es que hagas las cosa por pequenas rutinas. Ejemplo una rutina para leer el reloj , otra para leer los tc , otra para printear los valores, otra para escribir el la memoria y otra para leer la memoria. Usa el ejemplo de mi sketch. Otro consejo es de mandar mesajes a la pantalla de la computadora atraves del programa para que te indique mas/menos donde se te esta deteniendo con el problema. Ejemplo manda un mesaje Serial,.println (" mesaje 1"); Serial,.println (" mesaje 2"); Cuando tengas el problema mira ver cual fue el ultimo mesaje que envio y te va a dar una idea donde tienes el problema. Perdoma mi atrevimiento por el consejo pues se que haz pasado muco tiempo escribiendolo pero aveces hay mejores formas de hacer el programa mas eficiente, Suerte.

float t1uno = 0;
float t2uno = 0;
float t3uno = 0;
float t4uno = 0;
float t5uno = 0;
float t6uno = 0;
float t7uno = 0;
float t8uno = 0;
float t9uno = 0;
float t10uno = 0;
float t11uno = 0;
float t12uno = 0;


float tuno[13];//<Aqui se guardan la lecturas de los termocouplos tuno
float tdos[13];//<Aqui se guardan la lecturas de los termocouplos tdos
float ttres[13];//<Aqui se guardan la lecturas de los termocouplos ttres

float tc[38];//<Aqui se guardan las  lecturas de los termocouplos uno,dos,tres

//**********************************
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}
//*************************************************
void loop() {
  leer_tc_uno();
  delay(3000);
  leer_36_tc();
  delay(3000);
}
//****************leer 12 uno tc   *****************
void leer_tc_uno() {
  // put your main code here, to run repeatedly:
  //En este loop se guarda las lecturas de los termocouples
  for (byte cuenta_tc = 1; cuenta_tc <= 12; cuenta_tc ++) {
    tuno[cuenta_tc] = cuenta_tc ; //guarda las lectura de los TC
  }
  Serial.println("--------------- print valores ----------------");
  for (byte cuenta_tc = 1 ; cuenta_tc <= 12; cuenta_tc ++) {
    Serial.print("temperatura t");
    Serial.print(cuenta_tc); Serial.print("uno = ");
    Serial.println(tuno[cuenta_tc]);
  }
  Serial.println();
}
//****************** leer 36 tc un0/dos/tres en una sola array *********
void leer_36_tc() {
  byte cnt = 1;

  for (byte repite = 1; repite <= 36; repite++) {
    if (cnt > 12) {
      cnt = 1;
    }
    tc[repite] = cnt ; //guarda las lectura de los TC
    cnt++;
  }
  Serial.println("--------------- print valores ----------------");

  for (byte cuenta_tc = 1 ; cuenta_tc <= 36; cuenta_tc ++) {
    Serial.print("temperatura ");
    Serial.print(cuenta_tc); Serial.print("  tc = ");
    Serial.println(tc[cuenta_tc]);
  }
  Serial.println();

}
//******************************************************

Ya lo he simplificado pero tengo errores que supongo ya estaban. Intento resolverlos y lo posteo.

EDITO: acabo de bajar nuevamente el código y no tiene errores, asi que son mios.

Adjunto el código mejorado pero con fallas que no puedo resolver.

Los errores estan localizados aparentemente en esta linea

Serial.println(".");

Errores. Las lineas no se corresponden con el código. Un drama de mi compilador.

D:/Dropbox/Arduino/Foro/MAX6675/Multiples/Modificado.ino: In function 'void loop()':
D:/Dropbox/Arduino/Foro/MAX6675/Multiples/Modificado.ino:351:78: error: invalid use of non-static member function
D:/Dropbox/Arduino/Foro/MAX6675/Multiples/Modificado.ino:369:78: error: invalid use of non-static member function
D:/Dropbox/Arduino/Foro/MAX6675/Multiples/Modificado.ino:389:78: error: invalid use of non-static member function
D:/Dropbox/Arduino/Foro/MAX6675/Multiples/Modificado.ino:435:82: error: invalid use of non-static member function
D:/Dropbox/Arduino/Foro/MAX6675/Multiples/Modificado.ino: In function 'void visualizo_contador(byte)':
D:/Dropbox/Arduino/Foro/MAX6675/Multiples/Modificado.ino:541:67: error: invalid use of non-static member function

Modificado.ino (11.6 KB)

Buen día,

Les agradezco su apoyo.

SURBYTE al intentar compilar el programa me aparecen los siguientes errores:

Modificado:57:19: error: no matching function for call to 'MAX6675::MAX6675(<brace-enclosed initializer list>)'

                   };

                   ^

In file included from C:\Users\rodrigo_guiza\Downloads\Modificado\Modificado.ino:3:0:

C:\Users\rodrigo_guiza\Documents\Arduino\libraries\MAX6675_library/max6675.h:12:3: note: candidate: MAX6675::MAX6675(int8_t, int8_t, int8_t)

   MAX6675(int8_t SCLK, int8_t CS, int8_t MISO);

   ^

C:\Users\rodrigo_guiza\Documents\Arduino\libraries\MAX6675_library/max6675.h:12:3: note:   candidate expects 3 arguments, 0 provided

C:\Users\rodrigo_guiza\Documents\Arduino\libraries\MAX6675_library/max6675.h:10:7: note: candidate: constexpr MAX6675::MAX6675(const MAX6675&)

 class MAX6675 {

       ^

C:\Users\rodrigo_guiza\Documents\Arduino\libraries\MAX6675_library/max6675.h:10:7: note:   candidate expects 1 argument, 0 provided

C:\Users\rodrigo_guiza\Documents\Arduino\libraries\MAX6675_library/max6675.h:10:7: note: candidate: constexpr MAX6675::MAX6675(MAX6675&&)

C:\Users\rodrigo_guiza\Documents\Arduino\libraries\MAX6675_library/max6675.h:10:7: note:   candidate expects 1 argument, 0 provided

C:\Users\rodrigo_guiza\Downloads\Modificado\Modificado.ino: In function 'void loop()':

Modificado:176:78: error: invalid use of non-static member function

                   Serial.print("#S"+String(i+1)+','+String(ktc[i].readCelsius));

                                                                              ^

Modificado:185:78: error: invalid use of non-static member function

                   Serial.print("#S"+String(i+1)+','+String(ktc[i].readCelsius));

                                                                              ^

Modificado:195:78: error: invalid use of non-static member function

                   Serial.print("#S"+String(i+1)+','+String(ktc[i].readCelsius));

                                                                              ^

Modificado:218:82: error: invalid use of non-static member function

                       Serial.print("#S"+String(i+1)+','+String(ktc[i].readCelsius));

                                                                                  ^

C:\Users\rodrigo_guiza\Downloads\Modificado\Modificado.ino: In function 'void visualizo_contador(byte)':

Modificado:271:67: error: invalid use of non-static member function

        Serial.print("#S"+String(i+1)+','+String(ktc[i].readCelsius));

                                                                   ^

exit status 1
no matching function for call to 'MAX6675::MAX6675(<brace-enclosed initializer list>)'

Realmente no logro encontrar como eliminar estos errores.

Adjunto el código correspondiente, compartido por Surbyte.

Gracias por el apoyo.

Modificado.ino (11.6 KB)

Y no dije que tenía errores?
Por favor hombre, no comprendo como reclamas que tiene errores cuando dije que tiene errores y que los estaba intentando resolver.

Adjunto la versión corregida sin errores, pero en mi compilador 3 warnings.

El error es que debe la linea que da error

Serial.print("#S"+String(i+1)+','+String(ktc[i].readCelsius));

debe ser asi

Serial.print("#S"+String(i+1)+','+String(ktc[i].readCelsius()));

NOTA: he modificado 3 veces el archivo adjunto asi que descarga este último y perdona mi exabrupto, pero para mi es obvio, tal vez no este bien el comentario, pero que se le va a hacer.

Aún no he visto el problema de los 20 min. Recien ahora que luce mas entendible para mi gusto intentaré ver que ocurre.

Lo que no me gusta es la forma con la que decides cuando guardar datos

         if (tiempolectura < millis()) {

y luego

             tiempolectura=millis()+intervalolectura;
              primlec = tiempolectura-3000;
              seglec  = tiempolectura-2000;
              terlec  = tiempolectura-1000;

supongamos un tiempo de 1m = 60000 mseg

millis() = 0
tiempolectura = 0 + 60000 = 60000
quiere decir que tu grabas datos cada vez que pasa el loop por la funcion

if (tiempolectura < millis()) {
              File dataFile = SD.open("log.txt", FILE_WRITE);
              if (dataFile) {

Explicanos esta parte o yo la mal entiendo?

Modificado.ino (11 KB)

Buen día,

Disculpa si no me supe expresar en ningún momento intente reclamar solo me surgieron nuevas dudas debido a los errores que arrojaba el compilador y mi falta de experiencia en el uso de los ciclos empleados.

Con respecto a lo que me preguntas, al inicio del código en la parte que lee la entrada analógica, dependiendo del valor de esta, se determina el valor del intervalo de lectura el cual sirve para los datos que se guardarán en la memoria SD.

Con esto se decide si el intervalo de muestreo para guardar datos en la SD será de 1 minuto, 3 , 5, 10 o 15.

Espero haber sido claro y disculpen si lo que escribí pareció un reclamo.

Les agradezco muchísimo el apoyo brindado hasta ahora.

Esa parte esta clara para eso tienes una función donde lo eliges.
Hablo de los intervalos

Me olvidé que en tu código original es imposible capturar algo porque tienes 100 lineas para hacer algo de solo 5.

Espero entiendas estas parte.

          if (primlec < millis() && millis() < seglec) 
              visualizo_t(0);

          if (seglec < millis() && millis() < terlec) 
              visualizo_t(1);

          if (terlec < millis() && millis() < tiempolectura)
              visualizo_t(2);

          if (tiempolectura < millis()) {
              File dataFile = SD.open("log.txt", FILE_WRITE);
              if (dataFile) {

Tienes esta situación en la que controlas la visualizacion de tuno tdos tres que yo ahora llamo t[0][] t[1][] y t[2][]

Tu usas esto de un modo no acostumbrado y quiero que expliques como crees que funciona.

cuantas veces se guardan datos durante el período seleccionado? 1 vez muchas veces?