Tengo una llave de 3 posiciones (Pin uno al pin 6 de arduino, pin del centro a gnd y pin dos al pin 7 de la placa).
Lo que necesito es que al estar la llave de un lado, el display me muestre la leyenda "FLORACION", al estar en el centro me muestre "APAGADO" y al estar del otro lado me muestre "VEGETACION".
Logro alternar entre floracion y vegetacion pero no que se queden ambos pines en low, es decir apagados.
Comparto el codigo que estoy usando:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Configuración del sensor DHT
#define DHTPIN 2 // Pin donde está conectado el sensor
#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Inicializar el objeto DHT
DHT dht(DHTPIN, DHTTYPE);
// Inicializar el LCD con la dirección I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // Dirección 0x27, display 20x4
// Configuración de los pines de las llaves
const int pinLlave1 = 6; // Pin para la llave 1
const int pinLlave2 = 7; // Pin para la llave 2
void setup() {
// Iniciar el display LCD con 20 columnas, 4 filas
lcd.begin(20, 4);
lcd.backlight();
// Iniciar el sensor DHT
dht.begin();
// Configurar los pines de las llaves como entrada
pinMode(pinLlave1, INPUT_PULLUP); // Usar resistencia pull-up interna
pinMode(pinLlave2, INPUT_PULLUP); // Usar resistencia pull-up interna
// Mensaje inicial
lcd.setCursor(0, 0);
lcd.print("Temp y Humedad:");
}
void loop() {
// Leer la humedad y la temperatura
float humedad = dht.readHumidity();
float temperatura = dht.readTemperature();
// Revisar si la lectura es correcta
if (isnan(humedad) || isnan(temperatura)) {
lcd.setCursor(0, 1);
lcd.print("Error al leer DHT!");
return;
}
// Leer el estado de las llaves
int estadoLlave1 = digitalRead(pinLlave1);
int estadoLlave2 = digitalRead(pinLlave2);
// Mostrar la temperatura y la humedad en el LCD
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("Hum: ");
lcd.print(humedad);
lcd.print(" %");
// Mostrar el estado de las llaves en la última línea
lcd.setCursor(0, 3);
if (estadoLlave1 == HIGH && estadoLlave2 == LOW) {
lcd.print("MODO: VEGETACION");
} else if (estadoLlave1 == LOW && estadoLlave2 == HIGH) {
lcd.print("MODO: FLORACION");
} else if (estadoLlave1 == LOW && estadoLlave2 == LOW) {
lcd.print("MODO: APAGADO");
} else {
}
// Esperar 2 segundos antes de la siguiente lectura
delay(2000);
}
Moderador:
Por favor, lee las Normas del foro y publica/edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado/editado, lo cortas y click en (<CODE/>)
Te puse una simulacion con lo que YO habia interprestado.
modificala a tu gusto
No se si te interpreté, esta hecho con lo anterior, no con este código.
Como no hay switch de 3 vias puse un multiswitch de 8. Solo usé 3.
Ya diras si es asi o no.
Ajusta los estados a tu gusto.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Configuración del sensor DHT
#define DHTPIN 2 // Pin donde está conectado el sensor
#define DHTTYPE DHT22 // DHT 22 (AM2301)
// Inicializar el objeto DHT
DHT dht(DHTPIN, DHTTYPE);
// Inicializar el LCD con la dirección I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // Dirección 0x27, display 20x4
int pinled1 = 12; // red pinled 1 is connect to pin 12 in arduino
int pinled2 = 11; // yellow pinled 2 is connect to pin 11 in arduino
int pinled3 = 10; // green pinled 3 is connect to pin 10 in arduino
int sw1 = 6; // Pin para la llave 1
int sw2 = 7; // Pin para la llave 2
int estado, estadoAnt = 0;
int estadoLlave1, estadoLlave2;
unsigned long timeDHT, timeDelay;
void setup() {
// Iniciar el display LCD con 20 columnas, 4 filas
lcd.begin(20, 4);
lcd.backlight();
// Iniciar el sensor DHT
dht.begin();
Serial.begin(9600);
// Configurar los pines de las llaves como entrada
pinMode(sw1, INPUT_PULLUP); // Usar resistencia pull-up interna
pinMode(sw2, INPUT_PULLUP); // Usar resistencia pull-up interna
// Mensaje inicial
lcd.setCursor(0, 0);
lcd.print("Temp y Humedad:");
estado = 255;
estadoAnt = estado;
}
void loop() {
char buffer[20], str[6];
// Esperar 2 segundos antes de la siguiente lectura
if (millis() - timeDHT > 2000UL) {
// Leer la humedad y la temperatura
float humedad = dht.readHumidity();
float temperatura = dht.readTemperature();
// Revisar si la lectura es correcta
if (isnan(humedad) || isnan(temperatura)) {
lcd.setCursor(0, 1);
lcd.print("Error al leer DHT!");
return;
}
lcd.setCursor(0, 1);
dtostrf(temperatura, 4,1, str);
sprintf(buffer, "Temp: %s", str);
lcd.print(buffer);
Serial.println(buffer);
lcd.setCursor(0, 2);
dtostrf(humedad, 4, 1, str);
sprintf(buffer, "Hum : %s", str);
lcd.print(buffer);
Serial.println(buffer);
timeDHT = millis();
}
// Leer el estado de las llaves
estadoLlave1 = digitalRead(sw1); // switch 1 read the digital logic 1 or 0
estadoLlave2 = digitalRead(sw2); // switch 2 read the digital logic 1 or 0
// Mostrar el estado de las llaves en la última línea
estado = estadoLlave2 << 1 | estadoLlave1;
if (estado != estadoAnt) {
Serial.println("Estado1: " + String(estadoLlave1));
Serial.println("Estado2: " + String(estadoLlave2));
Serial.println("Estado : " + String(estado));
}
estadoAnt = estado;
lcd.setCursor(0, 3);
switch (estado) {
case 0:
lcd.print("MODO: APAGADO ");
break;
case 1:
lcd.print("MODO: VEGETACION");
break;
case 2:
lcd.print("MODO: FLORACION ");
break;
}
}
Tienes configurado los pines del arduino como pullup, por lo tanto, el terminal central lo tienes que alimentar desde el positivo y hacer el programa con lógica negativa.
No, no habría cambio de estado en los pines en ninguna posición, siempre estarían en HIGH.
El error de @santiagoz92 fue pensar que en estado "apagado" la llave cierra todos los contactos (y los pone en LOW) cuando eso no ocurre en ninguna llave tipo báscula.
En la posición central los contactos están abiertos.
Solo hacia los lados cierra uno o el otro.