La opción ideal sería usar interrupciones. Básicamente lo que hace una interrupción es ejecutar una función cuando se produce un determinado evento hardware (al pulsar un botón, por ejemplo), con lo que una vez asignada esa función se ejecutará cuando se produzca ese evento, y no cuando la ejecución llegue a ese punto. Esto, quizás sea un poco complicado de momento, así que podemos analizar un poco otras opciones y de paso hacemos un poco de "crítica" (por supuesto, constructiva :)) de tu código:
- En primer lugar, ¿no te parece que el código de las condiciones "suma" y "resta" es el mismo? ¿no sería más sencillo poner el código que dibuja la pantalla en una función tipo pantallasetpoint()?
- En segundo lugar, los delay, básicamente lo que hacen es "entretenter" al procesador haciéndole contar sus latidos, lo que resulta en "tiempo perdido" sin ejecutar ninguna instrucción de nuestro programa.
- En lugar de usar delay, existe una función que se llama millis(), que devuelve un número unsigned long con los milisegundos transcurridos desde que el Arduino empezó a funcionar. En lugar de hacer esperar nuestro programa en un punto determinado, podemos anotar el valor de millis al principio del programa, luego, cada vez que el programa vuelva a pasar por el loop, comparamos el valor millis actual con el guardado, y si es mayor de x milisegundos, entonces guardamos el nuevo valor para las futuras comparaciones y llamamos alternativamente la función pantallasetpoint() o la pantallatemperatura(). Ten en cuenta que de esta forma, al no hacer delays, el loop del programa se repetirá un montón de veces hasta que pasen los 150 o los 1000 milisegundos, y en cada una de ellas podrás leer los botones.
El código quedaría más o menos (lo de depurarlo te lo dejo a tí)
#include <LiquidCrystal.h>
float tempC=0 ;
int tempPin= 0;
int suma= 7;
int resta= 8;
int setpoint= 20;
unsigned long milisguardados=0;
unsigned long milisactual=0;
unsigned long milisespera=150;
byte pantallaActu=0; // si es 0 dibujamos la pantallaSetup, si es 1, pantallaTemperatura
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
pinMode(resta,INPUT_PULLUP);
pinMode(suma,INPUT_PULLUP);
lcd.begin(20, 4);
}
void pantallaSetUp()
{
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
// esta línea se comprueba en el loop setpoint++;
lcd.print("Set Point: ");
lcd.print(setpoint);
lcd.write(1);
pantallaActu=1;
milisguardados=milisactual; //comenzamos a contar diferencia de milis desde cero.
milisespera=150; //esta pantalla permanecerá 150 ms.
}
void pantallaTemperatura()
{
tempC=(5*analogRead(tempPin)*100.0)/1024.0;
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Temp Act: ");
lcd.print(tempC);
lcd.write(1);
pantallaActu=0;
milisguardados=milisactual; //comenzamos a contar diferencia de milis desde cero.
milisespera=1000; //esta pantalla permanecerá 1000 ms.
}
loop
{
milisactual=millis();
if (digitalRead(suma)==HIGH)
{
setup++;
pantallasetup();
}
if (digitalRead(suma)==HIGH)
{
setup--;
pantallasetup();
}
if ((milisactual-milisguardados)>=milisespera)
if (pantallaActu==0)
pantallaSetup();
else
pantallaTemperatura();
}
El código seguro que tiene errores, pero creo que te puede servir de guía.
Saludos.