Buenos días,
Estoy realizando un proyecto el cual consta de 2 fotocélulas que, dependiendo del estado de estas (según detectan o no) tiene que encender unas luces u otras. Van conectadas a unos relés para encender luces de 24V pero estoy probando el código con LEDs (verde, ámbar, rojo) que, a priori, debería de ser más que suficiente.
La señal que sale de las fotocélulas la envío previamente desde el Arduino y solo cuando el relé interno de la fotocélula actúa recibo de vuelta dicha señal y con eso es con lo que trabajo.
Usando un Arduino R4 Wifi con dos fotocélulas (P1 y P2) y los estados deseables son los siguientes:
- Si P1 = detecta Y P2 = detecta --> LED verde = 1 | LED ámbar = 0 | LED rojo = 0
- Si P1 = detecta Y P2 = NO detecta --> LED verde = 1 | LED ámbar = 1 | LED rojo = 1
- Si P1 = NO detecta Y P2 = detecta --> LED verde = 0 | LED ámbar = 1 | LED rojo = 0
- Si P1 = NO detecta Y P2 = NO detecta --> LED verde = 0 | LED ámbar = 0 | LED rojo = 1
El código que utilizo es el siguiente:
void setup() {
Serial.begin(9600);
connectWifi();
setupEmail();
smtp.debug(1);
smtp.callback(smtpCallback); // Activar callback
// sendEmail(); // Enviar email al iniciar
// configuracion INICIAL de los pines
pinMode(OUT_P1, OUTPUT); // Configura el pin 2 como salida
pinMode(IN_P1, INPUT_PULLDOWN); // Configura el pin 3 como entrada con resistencia pull-down
pinMode(GREEN_LED, OUTPUT); // Configura el pin 4 como salida
pinMode(OUT_P2, OUTPUT); // Configura el pin 5 como salida
pinMode(IN_P2, INPUT_PULLDOWN); // Configuracion el pin 6 como entrada con resistencia pull-down
pinMode(AMBAR_LED, OUTPUT); // Configura el pin 7 como salida
pinMode(RED_LED, OUTPUT); // Configura el pin 8 como salida
digitalWrite(OUT_P1, HIGH); // Envía señal HIGH por el pin 2
digitalWrite(OUT_P2, HIGH); // Envía señal HIGH por el pin 5
Serial.println("OUT_P1 (2) and OUT_P2 (5) set to HIGH at startup"); // Mensaje para indicar el estado inicial
}
#define OUT_P1 2
#define IN_P1 3
#define GREEN_LED 13
#define OUT_P2 5
#define IN_P2 6
#define AMBAR_LED 7
#define RED_LED 8 // Definir el pin para RED_LED
void loop() {
if (digitalRead(IN_P1) == HIGH && digitalRead(IN_P2) == HIGH) {
pinMode(GREEN_LED, OUTPUT);
digitalWrite(GREEN_LED, HIGH); // Enciende el LED verde
digitalWrite(AMBAR_LED, LOW);
digitalWrite(RED_LED, LOW);
} else if (digitalRead(IN_P1) == HIGH && digitalRead(IN_P2) == LOW) {
pinMode(GREEN_LED, OUTPUT);
digitalWrite(GREEN_LED, HIGH); // Enciende el LED verde
digitalWrite(AMBAR_LED, HIGH);
digitalWrite(RED_LED, HIGH);
} else if (digitalRead(IN_P1) == LOW && digitalRead(IN_P2) == HIGH) {
pinMode(GREEN_LED, INPUT); // Apaga y desconecta el LED verde
digitalWrite(AMBAR_LED, HIGH);
digitalWrite(RED_LED, LOW);
} else if (digitalRead(IN_P1) == LOW && digitalRead(IN_P2) == LOW) {
pinMode(GREEN_LED, INPUT); // Apaga y desconecta el LED verde
digitalWrite(AMBAR_LED, LOW);
digitalWrite(RED_LED, HIGH);
}
}
Veréis en el código que, además de cambiar los estados digitalWrite de cada PIN entre LOW y HIGH, existen unas líneas que cambian el pin "GREEN_LED" a INPUT. Esto es el último intento que he realizado para solventar el problema que ahora describiré (con esto quiero decir que sin esas líneas y solo usando digitalWrite HIGH/LOW tampoco funciona correctamente).
Problema:
1- En el primer estado el LED verde se enciende correctamente mientras el ámbar y el rojo permanecen apagados. (esto es lo que tiene que ocurrir y ahora ocurre)
2- En el segundo estado aparece los problemas: el LED ámbar se enciende correctamente, el LED rojo se mantiene apagado (correcto) pero el LED verde se atenúa, no se apaga del todo, sigue recibiendo voltaje (y no es un voltaje continuo, sino oscilante, como que tintinea, esto lo he verificado adeemás porque al conectarlo a un relé este se apaga y se enciende rapidísimo)
3- En el tercer estado el LED verde continua igual cuando tendría que estar apagado desde antes, el LED ámbar se apaga correctamente del todo y el LED rojo se enciende correctamente.
He probado a conectarle una resistencia pull-down por si hubiese algo de ruido o interferencia o alguna cosa que continuase enviando corriente al LED verde pero no encuentro nada. Y lo más curioso de todo es lo que os indicaba en el código: a pesar de cambiar el estado del pin de OUTPUT a INPUT sigue haciendo que el LED verde se encienda, lo cual me rompe ya todos los esquemas.
Espero haber expresado correctamente el problema y todo lo necesario para que me puedan ayudar, de no ser así, háganmelo saber y les proporcionare toda la información necesaria para encontrar la solución.
Muchas gracias.
Saludos.