Programar dos pulsadores que cambien el valor de una variable

Cordial Saludo.

De antemano muchas gracias por la colaboración que ustedes me puedan brindar.

Me encuentro realizando un proyecto universitario que consiste en el siguiente sistema:

A través del micro-contralor arduino UNO y la adaptación de dos sensores, el primero y más importante el sensor DHT11 que detecta humedad relativa y medida aproximada de temperatura y el segundo un sensor de humedad relativa del suelo. Además verifiqué con pruebas que la conexión del circuito entre la proto-board y el arduino está correcta y pude adaptar un módulo de 4 relay conectados a dos fan-cooler de pc.

De todo este trabajo, pude lograr que los fan-cooler se activaran automáticamente, solo si la temperatura tomada por el sensor DHT11 sobrepasa un umbral definido en la programación, como temperatura de control. Adicionalmente logré que los valores tomados aparecieran en una pantalla LCD de 20*4 caracteres.

No obstante, para no depender de un pc con el IDE de arduino UNO, deseo que dos pulsadores con conexión pull up de resistencias de 10k cada uno, cambien el valor de la temperatura de control (uno sumando grados celcius y el otro restando grados celcius) para que así el usuario pueda adaptar esta temperatura de control manualmente de acuerdo a la lectura de temperatura del sensor DHT11 y se activen los fan-cooler.

Con respecto a la conexión en el circuito de los pulsadores, estoy seguro de que están bien conectados por que con un código pude hacer que con un pulsador se prendiera el led del pin 13 del arduino UNO y con el otro pulsador se apagara. Entonces en teoría creo que mi error está en la programación.

Soy novato programando en Arduino, pero todo el código que hice, después de mucho investigar, cumple con las funciones de mostrar los valores en la pantalla LCD y activar los fan-cooler si se sobrepasa la temperatura umbral, pero sinceramente con los pulsadores no he podido.

Sobre la programación de los pulsadores, el conocimiento que tengo es:

Se hace con condicionales if y else.

Debe haber un contador.

Debe haber Booleanos.

Para que se cumpla la acción de sumar o restar a la variable de temperatura de control cuando se presiona un pulsador, ésto se debe acompañar con la acción de encendido y apagado de un led.
En mi caso el led del pin 13 del arduino.

Espero que me haya hecho entender e insisto muchas gracias por su colaboración.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"

const int botonMasPin = 5; // pin desde el boton mas
const int botonMenosPin = 16; // pin desde el boton menos

// variables para trabajar con los botones
boolean lastBotonMas = LOW;  
boolean currentBotonMas = LOW; 
boolean lastBotonMenos = LOW;  
boolean currentBotonMenos = LOW;


 
//                     Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity
LiquidCrystal_I2C lcd( 0x27, 2,   1,  0,  4,  5,  6,  7, 3, POSITIVE );
 
#define DHTPIN 2     // Pin del Arduino al cual esta conectado el pin 2 del sensor
 
// Descomentar segun el tipo de sensor DHT usado
#define DHTTYPE DHT11   // DHT 11
 
unsigned long tAntes = 0;
unsigned long tAhora = 0;
unsigned long tEjecucion = 1000;
 
 
int Valor;
 
int porcentaje;
 
DHT dht(DHTPIN, DHTTYPE);

int Control=25;                         // Ref es la variable entera que define el limite, si la temp sube mas que la referencia se activa el  ventilador    


// Inicio LCD
 byte flechas[8] = {
  B00100,
  B01110,
  B11111,
  B00000,
  B00000,
  B11111,
  B01110, 
  B00100,
};

byte barra[8] {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,  
};

void setup()
{
Serial.begin(9600);
pinMode(8,OUTPUT);                 // Pin 8 digital como salida
pinMode(botonMasPin, INPUT);
pinMode(botonMenosPin, INPUT);
   
//Serial.println("Failed to configure Ethernet using DHCP");
//Valor = analogRead(1);
//Serial.print(Valor);
 
lcd.begin(20,4); //Inicia LCD
lcd.backlight();
 
//lcd.setCursor(0,0);
//lcd.print("Tiempo");
 
dht.begin();

// Inicio LCD
lcd.createChar(1, flechas);
lcd.createChar(4, barra);
// barra de progreso inicializar da tiempo para que el sensor se estabilize
  lcd.setCursor(0,0);
  lcd.print("Inicializando...");
  for (int i = 0; i <= 15; i++) {
    lcd.setCursor(i, 1);
    lcd.write((byte)4);
    delay(250);  
  }
  delay(250);
  lcd.clear();
  delay(500); 
}
// Inicio LCD 
 
void loop()
{
  // leer entrada de usuario 
  currentBotonMas = digitalRead(botonMasPin);
  currentBotonMenos = digitalRead(botonMenosPin);
   
  // subir temperatura de control
  if (currentBotonMas == HIGH && lastBotonMas == LOW) {
    delay(15); // debouncing time
    if (digitalRead(botonMasPin)) {
      Control++;
      // Serial.println(temperaturaControl);   
      lastBotonMas = HIGH;
    }
  } 
  else {
    lastBotonMas = digitalRead(botonMasPin);
  }
   
  // bajar temperatura de control
  if (currentBotonMenos == HIGH && lastBotonMenos == LOW) {
    delay(15); // debouncing time
    if (digitalRead(botonMenosPin)) {
      Control--;
      //Serial.println(temperaturaControl);   
      lastBotonMenos = HIGH;
    }
  } 
  else {
    lastBotonMenos = digitalRead(botonMenosPin);
  }
   
Valor = analogRead(1);
//  Serial.print(Valor);
// tAhora = millis();
 
//  if( tAhora - tAntes >= tEjecucion )
//  {
//   tAntes = tAhora;
 
//  lcd.setCursor(0,1);
//  lcd.print(tAhora/1000);
// }
porcentaje =map(Valor-1023, 0, 1023, 0, 100);  // convertir a porcentaje
porcentaje= porcentaje*-1;
if (Valor <= 300) {
Serial.println("Encharcado");
lcd.setCursor(0,0);
lcd.print("Humedad: ");
lcd.print(porcentaje);
lcd.print("%     ");
 
lcd.setCursor(0,1);
lcd.print("Encharcado");
}
 
if ((Valor > 300) and (Valor < 700)) {
Serial.println("Humedo, no regar");
 
lcd.setCursor(0,0);
lcd.print("Humedad: ");
lcd.print(porcentaje);
lcd.print("%     ");
 
lcd.setCursor(0,1);
lcd.print("Humedo, no regar");
}
if (Valor >= 700) {
Serial.println("Seco, favor regar");
lcd.setCursor(0,0);
lcd.print("Humedad: ");
lcd.print(porcentaje);
lcd.print("%     ");
 
lcd.setCursor(0,1);
lcd.print("Seco, favor regar");
}
delay(7000);
 
float h = dht.readHumidity();
// Obtiene la Temperatura en Celsius
float t = dht.readTemperature();
 
// Control de errores, valida que se obtuvieron valores para los datos medidos
if (isnan(h) || isnan(t)) {
Serial.println("Falla al leer el sensor DHT!");
return;
}
 
Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println("C   ");
 
lcd.setCursor(0,0);
lcd.print("Humed Amb: ");
lcd.print(h);
lcd.print("%");
 
lcd.setCursor(0,1);
lcd.print("Temp:  ");
lcd.print(t);
lcd.print((char)223);
lcd.print("C   ");
delay(10000);

lcd.setCursor(0,2);
lcd.print("Temp Control: ");
lcd.print(Control);
lcd.print((char)223);
lcd.print("C");
delay(10000);

lcd.setCursor(0,3);
lcd.print("Control Invernadero");
delay(10000);

if(t>Control)              // Si y solo si temperatura es mayor que "ref"
  {
    digitalWrite(8,HIGH);                               // Pone en alto "uno" el pin digital 8 del arduino y activa LED,BUZZER y ventilador
    }
    else                                                // Si no excede el valor de "ref"
    {
      digitalWrite(8, LOW);                             // Pone en bajo "cero" el pin digital 8 del arduino y desactiva LED,BUZZER y ventilador
      }  
}

Programacion_panel_sensores_ventiladores.ino (5.07 KB)

Eres universatario y has leído mucho por eso te pregunto:

que crees que hace esto en tu código?

delay(10000);

y lo tienes varias veces!! Y tmb varias veces delay(7000);

Te lo diré de modo simple: SIN PALABRAS!!

No hay codigo que funcione con DELAY!!

Te voy a pedir que por favor, leas las normas del foro y que cada vez que postees una imagen, un código y/o error o un enlace uses etiquetas.
Ahora edita tu último post porque cometiste justamente dos faltas.
1. La imagen debe verse y 2) el enlace debe estar con etiquetas.
en tu primer post lo hice yo pero esperaba que te dieras cuenta pero no fue el caso.
1er hilo de cualquier sección.

Ahora he modificado tu código usando millis() verifica si se comporta como antes o mas o menos.
tambien observa el comportamiento de Control, no veo que muestres el valor de Control ni en el puerto Serie ni en el LCD por lo tanto, como te das cuenta si sube o baja?

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"

const int botonMasPin   = 5; // pin desde el boton mas
const int botonMenosPin = 16; // pin desde el boton menos

// variables para trabajar con los botones
boolean lastBotonMas    = LOW;  
boolean currentBotonMas = LOW; 
boolean lastBotonMenos  = LOW;  
boolean currentBotonMenos = LOW;

//                     Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity
LiquidCrystal_I2C lcd( 0x27, 2,   1,  0,  4,  5,  6,  7, 3, POSITIVE );
 
#define DHTPIN 2     // Pin del Arduino al cual esta conectado el pin 2 del sensor
 
// Descomentar segun el tipo de sensor DHT usado
#define DHTTYPE DHT11   // DHT 11
 
unsigned long tAntes = 0;
unsigned long tAhora = 0;
unsigned long tEjecucion = 1000;
unsigned long tiempodht, tiempoPorCiento; 
 
int Valor;
int porcentaje;
 
DHT dht(DHTPIN, DHTTYPE);
int Control=25;                         // Ref es la variable entera que define el limite, si la temp sube mas que la referencia se activa el  ventilador    

// Inicio LCD
 byte flechas[8] = {
  B00100,
  B01110,
  B11111,
  B00000,
  B00000,
  B11111,
  B01110, 
  B00100,
};

byte barra[8] {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,  
};

void setup() {
  Serial.begin(9600);
  pinMode(8,OUTPUT);                 // Pin 8 digital como salida
  pinMode(botonMasPin, INPUT);
  pinMode(botonMenosPin, INPUT);
   
  //Serial.println("Failed to configure Ethernet using DHCP");
  //Valor = analogRead(1);
  //Serial.print(Valor);

  lcd.begin(20,4); //Inicia LCD
  lcd.backlight();

  //lcd.setCursor(0,0);
  //lcd.print("Tiempo");

  dht.begin();

  // Inicio LCD
  lcd.createChar(1, flechas);
  lcd.createChar(4, barra);
  // barra de progreso inicializar da tiempo para que el sensor se estabilize
  lcd.setCursor(0,0);
  lcd.print("Inicializando...");
  for (int i = 0; i <= 15; i++) {
      lcd.setCursor(i, 1);
      lcd.write((byte)4);
      delay(250);  
  }
  lcd.clear();
  
}
// Inicio LCD 
 
void loop() {
  
  ajuste_setpoint();
  
  if (millis() - tiempoPorCiento >  5000UL) {
      porciento();
      tiempoPorCiento = millis();
  }
  
  if (millis() - tiempodht > 10000UL) { // el DHT requiere 2 seg para una nueva lectura
      lectura_dht();  
      tiempodht = millis();
  } 
  
  if (t>Control) {             // Si y solo si temperatura es mayor que "ref"
      digitalWrite(8,HIGH);                               // Pone en alto "uno" el pin digital 8 del arduino y activa LED,BUZZER y ventilador
  }
  else {                                               // Si no excede el valor de "ref"
      digitalWrite(8, LOW);                             // Pone en bajo "cero" el pin digital 8 del arduino y desactiva LED,BUZZER y ventilador
  }  
}


void ajuste_setpoint() {
  // leer entrada de usuario 
  currentBotonMas   = digitalRead(botonMasPin);
  currentBotonMenos = digitalRead(botonMenosPin);
   
  // subir temperatura de control
  if (currentBotonMas  && !lastBotonMas) {
      delay(15); // debouncing time
      if (digitalRead(botonMasPin)) {
          Control++;
        // Serial.println(temperaturaControl);   
      }
  } 
  lastBotonMas = currentBotonMas;

  // bajar temperatura de control
  if (currentBotonMenos && !lastBotonMenos) {
      delay(15); // debouncing time
      if (digitalRead(botonMenosPin)) {
          Control--;
      }
  } 
  lastBotonMenos = currentBotonMenos;
}

void porciento() {
  Valor = analogRead(A1);
  
  porcentaje = map(Valor-1023, 0, 1023, 0, 100);  // convertir a porcentaje
  porcentaje *= -1;

  lcd.setCursor(0,0);
  lcd.print("Humedad: ");
  lcd.print(porcentaje);
  lcd.print("%     ");

  if (Valor <= 300) {
      Serial.println("Encharcado");   
      lcd.setCursor(0,1);
      lcd.print("Encharcado");
  }
 
  if (Valor > 300 && Valor < 700) {
      Serial.println("Humedo, no regar");
      lcd.setCursor(0,1);
      lcd.print("Humedo, no regar");
  }
  if (Valor >= 700) {
      Serial.println("Seco, favor regar");
      lcd.setCursor(0,1);
      lcd.print("Seco, favor regar");
  }
}

void lectura_dht() {
  float h = dht.readHumidity();
  // Obtiene la Temperatura en Celsius
  float t = dht.readTemperature();
   
  // Control de errores, valida que se obtuvieron valores para los datos medidos
  if (isnan(h) || isnan(t)) {
      Serial.println("Falla al leer el sensor DHT!");
      return;
  }
   
  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.println("C   ");
   
  lcd.setCursor(0,0);
  lcd.print("Humed Amb: ");
  lcd.print(h);
  lcd.print("%");
   
  lcd.setCursor(0,1);
  lcd.print("Temp:  ");
  lcd.print(t);
  lcd.print((char)223);
  lcd.print("C   ");

  lcd.setCursor(0,2);
  lcd.print("Temp Control: ");
  lcd.print(Control);
  lcd.print((char)223);
  lcd.print("C");
  
  lcd.setCursor(0,3);
  lcd.print("Control Invernadero");  
}

Hola amigo una pregunta, te salió bien este proyecto?
Ando buscando una finalidad igual pero he batallado con la programacion de los botones