int sal_multi_01;
int sal_multi_02;
// Definimos las salidas de los multiplexores:
// Multiplexor 1
const int r1a = 1; // salida 1
const int r1c = 2; // salida 2
const int r2a = 4; // salida 3
const int r2c = 8; // salida 4
const int r3a = 16; // salida 5
const int r3c = 32; // salida 6
const int r4a = 64; // salida 7
const int r4c = 128; // salida 8
// Multiplexor 2
int lc1 = 1; // salida 1
int lc2 = 2; // salida 2
int lc3 = 4; // salida 3
int lc4 = 8; // salida 4
int lc5 = 16; // salida 5
int lc6 = 32; // salida 6
int lc7 = 64; // salida 7
int lc8 = 128; // salida 8
const int S0 = 2;
const int S1 = 4;
const int S2 = 5;
const int S3 = 18;
const int SIG = 19;
const int latchPin = 21; //STCP o RCLK pin 12 del multiplexor 74HC595. 21
const int clockPin = 22; //SHCP o SRCLK pin 11 del multiplexor 74HC595. 22
const int dataPin = 23; //DS o SER pin 14 del multiplexor 74HC595. 23
//int outputEnablePin = 3; // PWM del esp al OE pin 13 del multiplexor 74HC595.
//definimos los estados para control.
String estadoR1 = "OFF";
String estadoR2 = "OFF";
String estadoR3 = "OFF";
String estadoR4 = "OFF";
//String estado = "";
bool rejilla1Abierta = false;
bool rejilla2Abierta = false;
bool rejilla3Abierta = false;
bool rejilla4Abierta = false;
// Definimos los tiempos de Apertura y cierre.
int tiempoApertura = 1000; // Tiempo para Abrir.
int tiempoCierre = 1000; // Tiempo para Cerrar.
// Tiempo para volver a conectarse cuando se pierde la conexión.
int wait30 = 30000;
int sal_multi_01_Ant, sal_multi_02_Ant;
//int estadoMul, estadoMulAntes = 0;
int estadoMul[16] = {0};
int estadoMulAntes[16] = {0};
void setup() {
// Definimos estado pines del 74HC595 como OUTPUT.
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
//pinMode(outputEnablePin, OUTPUT);
// Definimos estado pines del 74HC595 como en estado bajo.
digitalWrite(latchPin, LOW);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
// Iniciamos el puerto serie.
Serial.begin(115200);
Serial.println("Valor de salida sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida sal_multi_02: " + String(sal_multi_02));
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(SIG, INPUT_PULLUP);
}
////////////////////////////////////////////////////////////////////////////
//****** Inicio void loop ******//
////////////////////////////////////////////////////////////////////////////
void loop() {
String req;
// Definimos estado pines del 74HC595 como en estado bajo.
digitalWrite(latchPin, LOW);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, LOW);
if (sal_multi_01 != sal_multi_01_Ant)
Serial.println("Valor de sal_multi_01: " + String(sal_multi_01));
if (sal_multi_02 != sal_multi_02_Ant)
Serial.println("Valor de sal_multi_02: " + String(sal_multi_02));
sal_multi_01_Ant = sal_multi_01;
sal_multi_02_Ant = sal_multi_02;
if (Serial.available() > 0) {
req = Serial.readStringUntil('\r');
Serial.println(req);
////////////////////////////////////////////////////////////////////////////
// Realizar la solicitud del cliente. //
////////////////////////////////////////////////////////////////////////////
if (req.indexOf("on1") != -1) {
abrir_1(); // Llama a la función abrir_1()
}
if (req.indexOf("off1") != -1) {
cerrar_1(); // Llama a la función abrir_1()
}
if (req.indexOf("on2") != -1) {
abrir_2(); // Llama a la función abrir_1()
}
if (req.indexOf("off2") != -1) {
cerrar_2(); // Llama a la función abrir_1()
}
if (req.indexOf("on3") != -1) {
abrir_3(); // Llama a la función abrir_1()
}
if (req.indexOf("off3") != -1) {
cerrar_3(); // Llama a la función abrir_1()
}
if (req.indexOf("on4") != -1) {
abrir_4(); // Llama a la función abrir_1()
}
if (req.indexOf("off4") != -1) {
cerrar_4(); // Llama a la función abrir_1()
}
}
leo_multiplexor();
}
void leo_multiplexor() {
int tmp;
for (int i= 0; i<16; i++) {
digitalWrite(S0, i & 0x01 );
digitalWrite(S1, i & 0x02 );
digitalWrite(S2, i & 0x04 );
digitalWrite(S3, i & 0x08 );
if (i%16 == 0)
Serial.println();
estadoMul[i] = digitalRead(SIG);
Serial.printf("%d ", estadoMul[i]);
}
}
void abrir_1() {
delay(200);
if (estadoR1 == "ON") {
Serial.println("LA REJILLA 1 YA ESTABA ABIERTA");
} else {
if (!rejilla1Abierta) {
// enciende la salida 1 mientras mantiene encendida la salida 9.
sal_multi_01 = sal_multi_01 += r1a ; // Sumar r1a (1) a sal_multi_01.
sal_multi_02 = sal_multi_02 += lc1; // Sumar lc1 (1) a sal_multi_02.
Serial.println("Valor de salida ENCENDIDO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida ENCENDIDO sal_multi_02: " + String(sal_multi_02));
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
delay(tiempoApertura);
// Apaga la salida 1 y vuelve a mantiene encendida la salida 9
sal_multi_01 = (sal_multi_01 -= r1a); // Apaga la salida 1.
sal_multi_02 = sal_multi_02; // Mantiene encendida la salida 9.
Serial.println("Valor de salida APAGADO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida MANTIENE LED sal_multi_02: " + String(sal_multi_02));
//digitalWrite(latchPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
rejilla1Abierta = true; // Actualizar el estado.
estadoR1 = "ON"; // Actualizar el estado.
}
}
}
void cerrar_1() {
delay(200);
if (estadoR1 == "OFF") {
Serial.println("LA REJILLA 1 YA ESTABA CERRADA");
} else {
// if (!rejilla1Abierta) {
// enciende la salida 2 mientras mantiene encendida la salida 9.
sal_multi_01 = (sal_multi_01 += r1c) ; // Sumar r1C (2) a sal_multi_01 y mantener encendida la salida 9.
sal_multi_02 = sal_multi_02;
Serial.println("");
Serial.println("ESTAS CERRANDO LA REJILLA 1, ENCENDIENDO LED 2 MUX 1" );
Serial.println("");
Serial.println("Valor de salida ENCENDIDO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida ENCENDIDO sal_multi_02: " + String(sal_multi_02));
Serial.println("");
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
delay(tiempoCierre);
// Apaga las salidas 2 y 9
sal_multi_01 = (sal_multi_01 - r1c); // Apaga la salida 1.
sal_multi_02 = (sal_multi_02 - lc1); // Apaga la salida 9.
Serial.println("");
Serial.println("ESTAS CERRANDO LA REJILLA 1, APAGANDO LED 1 Y 9" );
Serial.println("");
Serial.println("Valor de salida APAGADO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida MANTIENE LED sal_multi_02: " + String(sal_multi_02));
//digitalWrite(latchPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
rejilla1Abierta = false; // Actualizar el estado.
estadoR1 = "OFF"; // Actualizar el estado.
// }
}
}
void abrir_2() {
delay(200);
if (estadoR2 == "ON") {
Serial.println("LA REJILLA 2 YA ESTABA ABIERTA");
} else {
if (!rejilla2Abierta) {
// enciende la salida 2 mientras mantiene encendida la salida 10.
sal_multi_01 = sal_multi_01 += r2a ; // Sumar r2a (4) a sal_multi_01.
sal_multi_02 = sal_multi_02 += lc2; // Sumar lc2 (2) a sal_multi_02.
Serial.println("Valor de salida ENCENDIDO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida ENCENDIDO sal_multi_02: " + String(sal_multi_02));
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
delay(tiempoApertura);
// Apaga la salida 2 y mantiene encendida la salida 10
sal_multi_01 = (sal_multi_01 -= r2a); // Apaga la salida 2.
sal_multi_02 = sal_multi_02; // Mantiene encendida la salida 10.
Serial.println("Valor de salida APAGADO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida MANTIENE LED sal_multi_02: " + String(sal_multi_02));
//digitalWrite(latchPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
rejilla2Abierta = true; // Actualizar el estado.
estadoR2 = "ON"; // Actualiza el estado.
}
}
}
void cerrar_2() {
delay(200);
if (estadoR2 == "OFF") {
Serial.println("LA REJILLA 2 YA ESTABA CERRADA");
} else {
// if (!rejilla2Abierta) {
// enciende la salida 4 mientras mantiene encendida la salida 10.
sal_multi_01 = (sal_multi_01 += r2c) ; // Sumar r2C (8) a sal_multi_01 y mantener encendida la salida 10.
sal_multi_02 = sal_multi_02;
Serial.println("");
Serial.println("ESTAS CERRANDO LA REJILLA 2, ENCENDIENDO LED 4 MUX 1" );
Serial.println("");
Serial.println("Valor de salida ENCENDIDO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida ENCENDIDO sal_multi_02: " + String(sal_multi_02));
Serial.println("");
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
delay(tiempoCierre);
// Apaga las salidas 4 y 10
sal_multi_01 = (sal_multi_01 - r2c); // Apaga la salida 4.
sal_multi_02 = (sal_multi_02 - lc2); // Apaga la salida 10.
Serial.println("");
Serial.println("ESTAS CERRANDO LA REJILLA 2, APAGANDO LED 4 Y 10" );
Serial.println("");
Serial.println("Valor de salida APAGADO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida MANTIENE LED sal_multi_02: " + String(sal_multi_02));
//digitalWrite(latchPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
rejilla2Abierta = false; // Actualizar el estado.
estadoR2 = "OFF"; // Actualiza el estado.
// }
}
}
void abrir_3() {
delay(200);
if (estadoR3 == "ON") {
Serial.println("LA REJILLA 3 YA ESTABA ABIERTA");
} else {
if (!rejilla3Abierta) {
// enciende las salidas 5 y 11
sal_multi_01 = sal_multi_01 += r3a ; // Sumar r3a (16) a sal_multi_01.
sal_multi_02 = sal_multi_02 += lc3; // Sumar lc3 (4) a sal_multi_02.
Serial.println("Valor de salida ENCENDIDO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida ENCENDIDO sal_multi_02: " + String(sal_multi_02));
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
delay(tiempoApertura);
// Apaga la salida 5 y mantiene encendida la salida 11.
sal_multi_01 = (sal_multi_01 -= r3a); // Apaga la salida 5.
sal_multi_02 = sal_multi_02; // Mantiene encendida la salida 11.
Serial.println("Valor de salida APAGADO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida MANTIENE LED sal_multi_02: " + String(sal_multi_02));
//digitalWrite(latchPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
rejilla3Abierta = true; // Actualiza el estado.
estadoR3 = "ON"; // Actualiza el estado.
}
}
}
void cerrar_3() {
delay(200);
if (estadoR3 == "OFF") {
Serial.println("LA REJILLA 2 YA ESTABA CERRADA");
} else {
// if (!rejilla3Abierta) {
// enciende la salida 6 mientras mantiene encendida la salida 11.
sal_multi_01 = (sal_multi_01 += r3c) ; // Sumar r3C (32) a sal_multi_01.
sal_multi_02 = sal_multi_02; // Mantener encendida la salida 11.
Serial.println("");
Serial.println("ESTAS CERRANDO LA REJILLA 3, ENCENDIENDO LED 6 MUX 1" );
Serial.println("");
Serial.println("Valor de salida ENCENDIDO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida ENCENDIDO sal_multi_02: " + String(sal_multi_02));
Serial.println("");
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
delay(tiempoCierre);
// Apaga las salidas 6 y 11
sal_multi_01 = (sal_multi_01 - r3c); // Apaga la salida 6.
sal_multi_02 = (sal_multi_02 - lc3); // Apaga la salida 11.
Serial.println("");
Serial.println("ESTAS CERRANDO LA REJILLA 3, APAGANDO LED 6 Y 11" );
Serial.println("");
Serial.println("Valor de salida APAGADO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida MANTIENE LED sal_multi_02: " + String(sal_multi_02));
//digitalWrite(latchPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
rejilla3Abierta = false; // Actualizar el estado
estadoR3 = "OFF";
// }
}
}
void abrir_4() {
delay(200);
if (estadoR4 == "ON") {
Serial.println("LA REJILLA 4 YA ESTABA ABIERTA");
} else {
if (!rejilla4Abierta) {
// enciende las salidas 7 y 12
sal_multi_01 = sal_multi_01 += r4a ; // Sumar r4a (64) a sal_multi_01.
sal_multi_02 = sal_multi_02 += lc4; // Sumar lc4 (8) a sal_multi_02.
Serial.println("Valor de salida ENCENDIDO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida ENCENDIDO sal_multi_02: " + String(sal_multi_02));
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
delay(tiempoApertura);
// Apaga la salida 7 y mantiene encendida la salida 12.
sal_multi_01 = (sal_multi_01 -= r4a); // Apaga la salida 7.
sal_multi_02 = sal_multi_02; // Mantiene encendida la salida 12.
Serial.println("Valor de salida APAGADO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida MANTIENE LED sal_multi_02: " + String(sal_multi_02));
//digitalWrite(latchPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
rejilla4Abierta = true; // Actualiza el estado.
estadoR4 = "ON"; // Actualiza el estado.
}
}
}
void cerrar_4() {
delay(200);
if (estadoR4 == "OFF") {
Serial.println("LA REJILLA 4 YA ESTABA CERRADA");
} else {
// if (!rejilla4Abierta) {
// enciende la salida 8 mientras mantiene encendida la salida 11.
sal_multi_01 = (sal_multi_01 += r4c) ; // Sumar r4C (128) a sal_multi_01.
sal_multi_02 = sal_multi_02; // Mantener encendida la salida 12.
Serial.println("");
Serial.println("ESTAS CERRANDO LA REJILLA 4, ENCENDIENDO LED 8 MUX 1" );
Serial.println("");
Serial.println("Valor de salida ENCENDIDO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida ENCENDIDO sal_multi_02: " + String(sal_multi_02));
Serial.println("");
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
delay(tiempoCierre);
// Apaga las salidas 8 y 12
sal_multi_01 = (sal_multi_01 - r4c); // Apaga la salida 8.
sal_multi_02 = (sal_multi_02 - lc4); // Apaga la salida 12.
Serial.println("ESTAS CERRANDO LA REJILLA 3, APAGANDO LED 8 Y 12" );
Serial.println("");
Serial.println("Valor de salida APAGADO sal_multi_01: " + String(sal_multi_01));
Serial.println("Valor de salida MANTIENE LED sal_multi_02: " + String(sal_multi_02));
//digitalWrite(latchPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_02);
shiftOut(dataPin, clockPin, MSBFIRST, sal_multi_01);
digitalWrite(latchPin, HIGH);
rejilla4Abierta = false; // Actualizar el estado
estadoR4 = "OFF";
// }
}
}
////////////////////////////////////////////////////////////////////////////
// Fin Comandos abrir y cerrar compuertas //
////////////////////////////////////////////////////////////////////////////
Loading
cd74hc4067
cd74hc4067