Termómetro con parámetros moviles

Saludos,

He logrado desplegar en la pantalla Pantalla LCD 16x2 I2C la temperatura captada por el sensor LM335.

También he logrado que cuando la temperatura alcance unos parámetros superiores o inferiores, ya previamente establecidos como constantes, se genere un encendido de led para ambos límites.

El problema surge cuando estos parámetros deben ser variables móviles, incrementadas o disminuidas por dos pushbuttons y un cursor de selección.

Me explico: Quiero que el led encienda cuando la temperatura llegue a 40, pero luego quiero que haga eso mismo cuando la temperatura llegue a 100, aumentando el valor de 40 a 100 presionando el botón tantas veces como sea necesario para llegar el límite deseado.

Realmente yo estaría muy agradecido si alguien me pudiera ayudar

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);
float tempK = 0, tempC = 0, tempF = 0, MaxTemp = 0, MinTemp =0,;

int led_blanco=2;
int led_verde=4;
int led_azul=6;
int buzzer=8;
int led=7;
int a = 0;

void setup() {
  lcd.init();
  lcd.backlight();
  pinMode(led_blanco, OUTPUT);
  pinMode(led_verde, OUTPUT);
  pinMode(led_azul, OUTPUT);
  pinMode(led_blanco, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(led, OUTPUT);

}

void loop() {
  tempK = (analogRead(A0)) * 0.4882812;
  tempK = tempK - 273.15 ;
  tempK = (tempC * 1.8) + 32 ;

  if ( tempC <= 20) {
    digitalWrite(led_blanco, LOW);
    digitalWrite(led_verde, LOW);
    digitalWrite(led_azul, HIGH);
    digitalWrite(buzzer, LOW);
  }
  if (tempC > 20 && tempC <= 40) {
    digitalWrite(led_blanco, LOW);
    digitalWrite(led_verde, HIGH);
    digitalWrite(led_azul, LOW);
    digitalWrite(buzzer, LOW);
  }
  if (tempC > 40) {
    {
      digitalWrite(led_blanco, HIGH);
      digitalWrite(led_verde, LOW);
      digitalWrite(led_azul, LOW);
      digitalWrite(buzzer, HIGH);
    }
    //Se impreme el valor
    lcd.setCursor(0, 0);
    lcd.print("temp:");
    lcd.print(tempC);
    lcd.print(" C ");
    lcd.setCursor(0, 1);
    lcd.print(tempF);
    lcd.print(" F ");
    delay(200);
  }
  }

Hola como tienes conectados los botones?. Primero inicia probando con un botón que cada vez que lo presiones vaya sumando 1 a la variable y con el otro botón lo contrario por lo cual en esta parte
if(tempC <= 20) debes reemplazar el número 20 por alguna variableif(tempC <= tempUmbral) por lo que cada vez que presiones debes sumarle o restarle 1 a esta variable.Luego que tengas todo esto añades lo demás.

hola, muchas gracias por tu ayuda

el tema es que no se como hacer para que los botones sumen o resten a las variables
además de que tengo que crear un cursor de selección de la variable ya que son dos, tope máximo y tope mínimo.

Ejemplo:
Límite Máximo de temperatura
MaxTemp(60)

Límite Mínimo de temperatura
MinTemp(10)

Sobre tu pregunta, todavía no conecto los botones, quiero tener el codigo primero.

Un ejemplo rápido a tu consulta:

int temperatura; //variable que almacena la temperatura

if (digitalRead(1) == 1){ //compruebas el estado del botón -
temperatura--; //restas un grado
}

if (digitalRead (2) == 1){ //compruebas el estado del botón +
temperatura++; //aumentas un grado
}

:wink:

El código anterior era la base para que sumara tiempo, pero lo hace a lo loco según tienes pulsado el botón. Prueba con este código para aumentar de uno en uno. El código de resta te lo dejo a ti. :wink:

int temperatura;
byte estado1 = 1;

void setup() {
  
pinMode (12, INPUT);
Serial.begin(9600);
}

void loop() {

if (digitalRead(12) == 1 && estado1 == 1){
  temperatura++;
  estado1 = 0;
  Serial.println(temperatura);
  delay(50);

} if (digitalRead(12) == 0){
  estado1 = 1;
}

}

:wink:

La mejor manera es siempre ver transiciones o sea cambios de 0 a 1. El pulsador esta en resposo en LOW y pasa a HIGH al presionarlo.
Entonces si mantenemos el estado anterior guardado, simplemente preguntamos esto

#define pinMas    12
#define pinMenos  13
#define MAXTEMP  120
#define MINTEMP    5

bool estadoMas, estadoMasAnt = false;
bool estadoMenos, estadoMenosAnt = false;
int temperatura;

void setup() {
  pinMode (pinMas, INPUT);
  pinMode (pinMenos, INPUT);
  Serial.begin(9600);
}

void loop() {

  estadoMas = digitalRead(pinMas);
  estadoMenos= digitalRead(pinMenos);

  if (estadoMas && !estadoMasAnt) { // sección que suma o Mas
      temperatura++;
      Serial.println(temperatura);
      if (temperatura > MAXTEMP)
          temperatura = MAXTEMP;
  }

  if (estadoMenos && !estadoMenosAnt){ // sección que resta
      temperatura++;
      Serial.println(temperatura);
      if (temperatura < MINTEMP)
          temperatura = MINTEMP;
  }
}

Puse dos limites MAXTEMP y MINTEMP para que controles los extremos.
Puedes cambiar los pines con facilidad.