Hola, no se si alguien de aqui podria ayudarme pero estoy intentando hacer que la pantalla de mi lcd muestre lecturas de mi sensor dht11 cuando presionas el botón power del control remoto y deje de mostrar dichas lecturas cuando presionas func/stop de dicho control. Estoy utilizando componentes de un kit elegoo incluido el control remoto que trae.
Aquí os dejo mi codigo:
#include <DHT.h> // Esto se hace para agregar la libraría que tendrá el control del sensor
#include <IRremote.h> // Esto se hace para agregar la libraría que hace funcionar el control remoto
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int RECV_PIN = 5;
IRrecv irrecv(RECV_PIN);
decode_results results;
int PinRojo = 13; // Led rojo conectado al Pin digital 13
int Pinamarillo = 6; // Led amarillo conectado al Pin digital 6
int PinAzul = 4; // Led azul conectado al Pin digital 4
void setup() {
Serial.begin(9600);
dht.begin();
lcd.begin(16, 2);
pinMode(PinRojo, OUTPUT); // Establece los pines de salida del led
pinMode(Pinamarillo, OUTPUT); // Establece los pines de salida del led
pinMode(PinAzul, OUTPUT); // Establece los pines de salida del led
irrecv.enableIRIn(); //establece el funcionamiento del control remoto.
}
void loop() {
// Esperamos 5 segundos entre medidas de cada loop
delay(5000);
// Leemos la humedad relativa
float h = dht.readHumidity();
// Leemos la temperatura en grados centígrados (por defecto)
float t = dht.readTemperature();
// Comprobamos si ha habido algún error en la lectura
if (isnan(h) || isnan(t)) {
Serial.print("Error obteniendo los datos del sensor DHT11");
return;
}
// Calcular el índice de calor en grados centígrados
float hic = dht.computeHeatIndex(t, h);
Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print("Indice de calor: ");
Serial.print(hic);
Serial.println(" *C ");
//Preparamos el la pantalla liquida para que se encienda al presionar el boton del control remoto y muestre lecturas del sensor
if (IrReceiver.decode()) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" *C ");
lcd.setCursor(0,1);
lcd.print("Humedad: ");
lcd.print(h);
lcd.print(" %");
}
if((t) >= 26) // Si la temperatura sobrepasa los 26 grados
{
digitalWrite(PinAzul, LOW);
digitalWrite(Pinamarillo, LOW);
digitalWrite(PinRojo, HIGH); // Led Rojo se enciende y los otros led permanecen apagados
}
if(((t) < 25) && ((t) >= 10))
{
digitalWrite(PinRojo, LOW);
digitalWrite(Pinamarillo, HIGH); // Led amarillo se enciende y los otros led permanecen apagados
digitalWrite(PinAzul, LOW);
}
if((t) <= 9)
{
digitalWrite(PinAzul, HIGH); // Led azul se enciende y los otros led permanecen apagados
digitalWrite(Pinamarillo, LOW);
digitalWrite(PinRojo, LOW);
}
}
Ahora mismo sencillamente muestra las lecturas cuando presionas cualquier botón del control remoto nada más y yo solo quiero que funcionen esos dos que mencione.
El control remoto funciona, cuando presiono cualquier botón empieza a mostrarme las lecturas de temperatura. Pero lo que yo quiero es que solamente funcione con esos dos botones específicos que dije.
Aca muestro el antes de presionar cualquier botón:
He estado buscando por la red y creo que se puede hacer utilizando un "case" junto con el codigo "0xFD00FF" que representaría el botón ON..... pero no se como poner eso en mi codigo.
Cambia el trozo de codigo que maneja el IR por este otro:
//Preparamos el la pantalla liquida para que se encienda al presionar el boton del control remoto y muestre lecturas del sensor
if (IrReceiver.decode(&results)) {
int nueva = results.value;
if (neva == /*codigo de la teclan on*/||nueva == 0xFFFFFFFF) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" *C ");
lcd.setCursor(0, 1);
lcd.print("Humedad: ");
lcd.print(h);
lcd.print(" %");
}
}
Y ya vas jugando, ponle algunos serial.print a la variale nueva para ver que estas recibiendo y obras en conseguencia.
//Preparamos la pantalla LCD para que se encienda al presionar el boton del control remoto y muestre lecturas del sensor
if (IrReceiver.decode(&results)) {
int nueva = results.value;
if (nueva == 0xBA45FF00 ||nueva == 0xFFFFFFFF){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" *C ");
lcd.setCursor(0, 1);
lcd.print("Humedad: ");
lcd.print(h);
lcd.print(" %");
}
}
Moderador
Edita tu post#5 sin usar capturas.
Edita y usa etiquetas omo bien has hecho en el post#1.
Cuando te pregunté si habias probado tu código con el IR me dijiste que si, pero es evidente que no entendiste mi pregunta.
Lo que yo te pregunté tenía por respuesta que tanto el botón ON como el que hayas elegido para terminar la operación funcionaran en un ejemplo modificado donde hayas determinado en cada caso que código Hexa requieres.
Ahora que trabajas con todo el código resulta que no te funciona pero la forma de trabajar cuando estas comenzando es ir resolviendo tareas en ambientes controlados.
Una cosa es el manejo IR y los dos códigos que responden a Power y a STOP
Asi que te recomiendo que hagas una pausa y lo veas en otro código para no marearte y tener un ambiente mas comodo.
Si crees que puedes seguir como estas no me hagas caso.
He editado mi post. Mis disculpas.
Y respecto a lo que comentas, si es que te he entendido bien, probe un código de mapeo de botones para el control remoto y funcionaban correctamente.
De ahí obtuve el código "BA45FF00" que es para el botón power y el "B847FF00" que es para el botón func/stop. Y ambos funcionaban y respondian.
//Preparamos la pantalla LCD para que se encienda al presionar el boton del control remoto y muestre lecturas del sensor
define presento como global antes de setup()
// defino como global
type or paste code here
aca la modificación
if (IrReceiver.decode(&results)) {
int nueva = results.value;
if (nueva == 0xBA45FF00) { // POWER ON
presento = true;
}
if (nueva == 0xB847FF00) {
presento = false;
}
}
if (presento) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" *C ");
lcd.setCursor(0, 1);
lcd.print("Humedad: ");
lcd.print(h);
lcd.print(" %");
}
Ojo a los dos que a uno se le pasan por alto algunas cositas , como en el post #7:
El "IF"
if (IrReceiver.decode(&results)) {
Se ha de cerrar con la instrucción:
irrecv.resume();
Luego el Código perfectamente propuesto por @Surbyte debería quedar así:
if (IrReceiver.decode(&results)) {
int nueva = results.value;
if (nueva == 0xBA45FF00) { // POWER ON
presento = true;
}
if (nueva == 0xB847FF00) {
presento = false;
}
irrecv.resume();
}