Armario de 12 cerraduras con identificación

Muy buenas, es un placer para mi formar parte de esta comunidad.

Estoy desarrollando un armario con 12 cerraduras electricas, con una pantalla LCD con I2C, cuyo acceso se hace a través de un teclado 4x4 y un código de usuario de 4 dígitos asignado a una persona. Luego te pide que elijas la puerta que quieres abrir del 1 al 12 y se activaría el relé seleccionado.
Todo ello queda registrado en un microSD, gracias a un modulo SD y un reloj DS3231.

Tengo un problema que no consigo solucionar. Compré por aliexpress un módulo de 16 reles. Cuando inicio el programa, me deja introducir el codigo, lo valida y elijo la puerta, en este punto, el multiplexor cd74hc4067 no me activa el relé que selecciono, la placa de reles no responde, no se si es un fallo de conexión o que pasa. Todo ello lo controlo con un arduino nano. La placa de reles tiene las 16 entradas, 2 VCC y 2 GND y a mayores dos conectores, DC+ y DC-. Os dejo el codigo por si estoy cometiendo un error. Incluso si mido tensión entre GND y el pin de SIG de multiplexor, me aparecen 4,7V. Eso si, si pruebo placa de reles y multiplexor por separado, funciona correctamente.

Os agradezco vuestra atención de antemano.

#include <Keypad.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>

// === CONFIGURACIÓN DEL TECLADO ===
const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {6, 7, 8, 9};
byte colPins[COLS] = {2, 3, 4, 5};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// === CONFIGURACIÓN DE LA LCD ===
LiquidCrystal_I2C lcd(0x27, 16, 2);

// === RTC ===
RTC_DS3231 rtc;

// === MÓDULO SD ===
const int SD_CS = 10;

// === PINES ===
const int relePin = 8;  // Pin de control del relé

// === CONSTANTES ===
const int NUM_CODIGOS = 25;
const int DIGITOS = 4;
const int NUM_PUERTAS = 12;
bool modoCarga = false;

// === FUNCIONES ===
void activarPuerta(byte puerta) {
  // Activación del relé
  digitalWrite(relePin, HIGH);  // El relé se activa (pin en HIGH)
  delay(10000);  // Mantener el relé activado durante 10 segundos
  digitalWrite(relePin, LOW);   // El relé se desactiva (pin en LOW)
}

bool validarCodigo(String codigo) {
  for (int i = 0; i < NUM_CODIGOS; i++) {
    String guardado = "";
    for (int j = 0; j < DIGITOS; j++) {
      guardado += String(EEPROM.read(i * DIGITOS + j));
    }
    if (codigo == guardado) return true;
  }
  return false;
}

void registrarAcceso(String codigo, byte puerta) {
  DateTime now = rtc.now();
  File log = SD.open("accesos.txt", FILE_WRITE);
  if (log) {
    log.print(now.timestamp());
    log.print(", Codigo: ");
    log.print(codigo);
    log.print(", Puerta: ");
    log.println(puerta);
    log.close();
  }
}

// === SETUP ===
void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  pinMode(relePin, OUTPUT);  // Configura el pin de control como salida
  digitalWrite(relePin, LOW);  // Inicialmente el relé está apagado

  if (!rtc.begin()) {
    lcd.print("Error RTC");
    while (1);
  }

  if (!SD.begin(SD_CS)) {
    lcd.print("Error SD");
    while (1);
  }

  lcd.setCursor(0, 0);
  lcd.print("A: Modo normal");
  lcd.setCursor(0, 1);
  lcd.print("B: Cargar codigos");

  while (true) {
    char key = keypad.getKey();
    if (key == 'A') break;
    if (key == 'B') {
      modoCarga = true;
      break;
    }
  }

  if (modoCarga) {
    lcd.clear();
    lcd.print("Cargar codigos");
    delay(1000);
    for (int i = 0; i < NUM_CODIGOS; i++) {
      lcd.clear();
      lcd.print("Codigo #");
      lcd.print(i + 1);
      lcd.setCursor(0, 1);
      String codigo = "";
      while (codigo.length() < DIGITOS) {
        char key = keypad.getKey();
        if (key && isDigit(key)) {
          codigo += key;
          lcd.print("*");
        }
      }
      for (int j = 0; j < DIGITOS; j++) {
        EEPROM.write(i * DIGITOS + j, codigo[j] - '0');
      }
      delay(500);
    }
    lcd.clear();
    lcd.print("Carga completa");
    while (1);
  }

  lcd.clear();
  lcd.print("Sistema listo");
  delay(1000);
}

// === LOOP PRINCIPAL ===
void loop() {
  lcd.clear();
  lcd.print("Codigo:");
  lcd.setCursor(0, 1);
  String codigo = "";
  while (codigo.length() < DIGITOS) {
    char key = keypad.getKey();
    if (key && isDigit(key)) {
      codigo += key;
      lcd.print("*");
    }
  }

  if (!validarCodigo(codigo)) {
    lcd.clear();
    lcd.print("Codigo invalido");
    delay(1500);
    return;
  }

  lcd.clear();
  lcd.print("Puerta (1-12):");
  String puertaStr = "";
  while (puertaStr.length() < 1) {
    char key = keypad.getKey();
    if (key && isDigit(key)) {
      puertaStr += key;
      lcd.print(key);
    }
  }

  byte puerta = puertaStr.toInt();
  if (puerta < 1 || puerta > NUM_PUERTAS) {
    lcd.clear();
    lcd.print("Puerta invalida");
    delay(1500);
    return;
  }

  // Mostrar "ACCESO OK" y activar el relé durante 10 segundos
  lcd.clear();
  lcd.print("Acceso OK");
  activarPuerta(puerta - 1);  // Activa el relé para abrir la puerta
  registrarAcceso(codigo, puerta);

  lcd.clear();
  lcd.print("Acceso completado");
  delay(2000);  // Mostrar el mensaje de acceso completado
}

Como tienes conectado el 4067 al NANO? Del 4067 a la placa relé no hace falta.
Basicamente el Pin 15 del 4067 debe estar a GND. Si no lo está no te va a funcionar.
El pin 15 es de inhibición. Si está al aire esta inhibido. Debe estar a GND:

Ver hoja de datos página 4 tabla 4-1 y 2.

Moderador
Tema movido a Hardware.
No cumple con los requisitos para la Sección Proyectos.

Varios temas con el mismo tema.

Moderador
Hilo cerrado, continúa en el foro en inglés que ya tienes mas respuestas.
Pero te adelanto que la solución es la misma.
INHIBIT a GND.