Programación de menu

Buenas tardes, estoy creando un programa para el control del proceso de elaboración de cerveza. He creado un menú en pantalla lcd 16x2 que controla con un infrarrojo para ahorrarme botones y entradas. También le he incluido un control pid con salida a rele para mantener la temperatura y lm 35 para medicion. Aunque aun me falta ir añadiendo algunas cositas, el problema que estoy viendo es el programa va un poco lento, en el movimiento a traves del menú y lectura de codigo IR. Haber si algún experto puede opinar si es cuestion de la estructura del programa, que puede mejorar para que vaya más fluido, es demasiada carga para un arduino uno o simplemente la respuesta de pantalla y receptor IR es asi.

Adjunto una copia del programa completo porque no me deja mostrarlo por tener mas de 9000 caracteres

Gracias de antemano.

menu.txt (14.5 KB)

Por si a alguien le sirve de ayuda he conseguido optimizar la respuesta del infrarrojos y que vaya mas fluido, he cambiado la libreria ilremote que estaba usando por la NEC que parece que es más rápida además de obtener solo un código por tecla, la ilremote a veces obtenia codigos diferentes para la misma tecla.

Ahora tengo otro problema, haber si alguien puede dar una solución… Necesito medir el tiempo transcurrido desde que alcanzo el valor fijado como consigna, utilizando:

If (temperatura =consigna)
{
x= millis
}

Tiempo transcurrido = millis - x

el problema es que no consigo dar el valor millis a x solo una vez, cuando se cumpla la condición,pues dicha condición se sigue manteniendo en el tiempo y cada ciclo se actualiza el valor.
Utilizando un bucle for con un solo ciclo tampoco lo consigo, pues cuando comienza el ciclo la variable interna del bucle for se vuelve a reiniciar.

No se si me explico bien y me habéis conseguido entender…

Hola, empezando por esta parte:

"el problema es que no consigo dar el valor millis a x solo una vez"

respondiendo con una pregunta, ¿qué condición te hace saber que ya pasó "solo una vez"?, es decir, si tienes una forma de saber que ya pasó, usa una bandera.
Por cierto para hacer una comparación se ocupa "==" y no solo "=".

If (temperatura == consigna && bandera==1)
{
x= millis();
bandera=0;
}

Tiemptranscurrido = millis() - x;

Así solo realizará la asignación a x cuando la bandera sea igual a 1.
Suerte.

Tienes toda la razon. Estaba dandole vueltas al for... habia pensado en probar una variable general en lugar de la clasica i local, incluso he estado a punto de hacer lo que propones pero no se porque lo he intentado complicar con un if anidado no se ni como, :confused: :confused: :confused: pero en ningún momento he caido en algo tan simple y efectivo como tu has hecho....es mas revisando me doy cuenta que he hecho lo mismo que tu en las llamadas a las funciones de cada pantalla para que solo las llame una vez y no produsca parpadeo.....creo que llevo demasiadas horas y tengo que despejar un poco la mente porque la tengo bastante saturada ya...... :o :o :o :o

Muchas gracias por la propuesta.

Mañana subo el codigo completo con todas las modificaciones por si a alguien le interesa o le puede ayudar.

Esto es todo lo que llevo de codigo, aun quedan cosas por terminar como las comparaciones para finalizar los procesos cuando se cumplan los tiempos, pero puede servir por si alguien le puede ayudar cin los menus o alguna otra funcion.

menu_temperaturas.zip (4.69 KB)