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
}
}