[SOLUCIONADO]Varios Sketch juntos manejados con millis no consigo que funcione

Buenas a todos, me he atrevido a hacer un sketch algo extenso para mi nivel y tengo algún que otro problema.

Por separado funciona todo muy bien pero cuando lo uno todo empiezan los problemas.

El proyecto consta de:

  • Una pantalla HMI tactil.
  • 13 led que encenderemos desde la pantalla.
  • 6 potenciometros que veremos reflejado el movimiento en la pantalla.
  • 1 Ina219
  • 1 procesador Can.

Lo que hice es mandar un print “caracter” desde la pantalla y en arduino con un Serial2.available y Serial.read activo la salida que deseo.

Pero son tantos print que envió desde la pantalla que se me satura el puerto o eso creo y no funciona nada, así que estuve leyendo y leyendo soluciones en este foro e hice tres void: loop, data y can, y los gestione con millis.

Pues funciono todo muy bien y rápido, menos el void can.

Y ese es el problema que tengo, no se que hice mal que el Void Can no funciona nada de lo que hay en el.

Como el codigo tiene unas 200 lineas lo hice en pestañas para que se entienda mejor.

Os subo el codigo ya que es muy extenso para escribirlo aqui.

Gracias

Codigo_prueba.zip (4.67 KB)

En tu función de usuario CAN... imagino que la variable dato es publica así que contendrá el ultimo valor leido y si llamas a CAN() y no hay un byte en Serial2 volverá a ejecutar nuevamente según el ultimo valor de la variable dato. Asi lo necesitas ?

Si solo vas a evaluar la variable dato es recomendable usar un switch, asi no tendrás la doble ejecución.

Por ejemplo si dato='6' se ejecutan: el 1er if y todos los else.

Si solo quiero evaluar la variable dato, voy a probar con switch como me dices y comentare el resultado.

Lo que no entiendo es que en el Void loop tengo echo lo mismo Serial2.available y funciona bien, por eso pense que estaba haciendo algo mal con millis en el void loop.

Bueno voy a probar lo que me dices que en el enlace que me has dejado esta muy bien explicado.

Muchas Gracias

Buenas Kike_GL, he echo lo que me dijiste y sigue sin funcionar el Void CAN, he cambiado también y todo el Void Loop y lo he echo con switch e incluso asín no funciona el código del Void Can.

Me he dado cuenta que si cojo el codigo del Void can y lo pego en el Void Loop (borro el void can) funciona, con lo cual no entiendo porque no funciona dentro del Void can.

No lo entiendo, podéis decirme si esta bien echo el tema de millis, yo creo que si porque el Void data funciona

Asin hice millis:

// variables para millis
unsigned long transcurrido;
unsigned long tiempo;

void loop() {

  tiempo = millis();
  if (tiempo > transcurrido + 200) {
    transcurrido = tiempo;
    data();
  }

  if (tiempo > transcurrido + 300) {
    transcurrido = tiempo;
    can();
  }

// Aqui hay mas codigos, que se puede ver en el adjunto

}

Os dejo el adjunto con el archivo completo

Codigo__prueba_2.zip (4.52 KB)

En el loop() deberias independisar las variable asi:

tiempo = millis();
if (tiempo > transcurrido1 + 200) {
   transcurrido1 = tiempo;
   data();
}
if (tiempo > transcurrido2 + 300) {
   transcurrido2 = tiempo;
   can();
}
//Continua

Luego no respondiste a mi pregunta. Te explicaba que como tienes dos veces Serial2.read() y esta instrucción borra el buffer, asi que luego de ejecutar can() ya no entrar al if(Serial2.available()) del loop() porque estará vacio el buffer hasta que vuelvas a enviar algo.

Perdón por tardar en contestar he estado algo liado.

Entiendo lo que me dices del Serial2.read(), así que he eliminado el Void CAN y metido todo lo de este en el Void Loop y todo con switch, y funciona todo perfectamente.

Gracias