Caso práctico: Alarma de puerta abierta con inhibición

Prototipo de Alarma de puerta abierta con inhibición (Maker Style)

Nivel: Básico – Diseñar un circuito lógico utilizando una puerta NAND 74HC00 para activar una alarma LED solo cuando la puerta esté abierta y el sistema esté habilitado.

Objetivo y caso de uso

Lo que construirá es un controlador lógico de sistema de seguridad básico utilizando el chip universal NAND 74HC00. El circuito procesa dos entradas discretas (un sensor de puerta y un interruptor de habilitación) para activar una alarma visual estrictamente cuando el sistema está armado y se produce una apertura.

Por qué es útil:
* Demuestra cómo se pueden combinar múltiples puertas NAND para formar una puerta lógica AND.
* Ilustra el concepto de una señal de «habilitación/inhibición» (enable/inhibit) por hardware, comúnmente utilizada en electrónica industrial y digital.
* Proporciona experiencia práctica en la interconexión de interruptores mecánicos con entradas digitales CMOS sin estados flotantes.

Resultado esperado:
* Cuando el interruptor de la puerta está abierto (1 lógico) Y el interruptor de habilitación está cerrado (1 lógico), el LED se ENCIENDE.
* Si el interruptor de habilitación está abierto (0 lógico), la alarma permanece inhibida (LED APAGADO) independientemente del estado de la puerta.
* Los voltajes de nivel alto (VCC) y nivel bajo (0 V) lógicos se pueden medir claramente en los nodos de salida de los interruptores.
* La señal lógica intermedia entre las dos puertas NAND mostrará correctamente el estado invertido de la salida final.

Público objetivo y nivel: Principiantes en electrónica que aprenden lógica digital y circuitos combinacionales.

Materiales

  • V1: fuente de alimentación de 5 V CC, función: alimentación principal del circuito
  • SW1: interruptor SPST, función: sensor de puerta (cerrado = 0 lógico, abierto = 1 lógico)
  • SW2: interruptor SPST, función: habilitación del sistema (inhibido = 0 lógico, armado = 1 lógico)
  • R1: resistencia de 10 kΩ, función: pull-down para SW1 en el nodo DOOR
  • R2: resistencia de 10 kΩ, función: pull-down para SW2 en el nodo EN
  • R3: resistencia de 330 Ω, función: limitación de corriente del LED
  • U1: cuádruple puerta NAND de 2 entradas 74HC00, función: procesamiento lógico
  • D1: LED rojo, función: indicador visual de alarma

Pin-out del CI utilizado

CI utilizado: 74HC00 (Cuádruple puerta NAND de 2 entradas)

Pin Nombre Función lógica Conexión en este caso
1 1 A Entrada A de la Puerta 1 Nodo DOOR (desde SW1)
2 1B Entrada B de la Puerta 1 Nodo EN (desde SW2)
3 1Y Salida de la Puerta 1 Nodo NAND_OUT
4 2 A Entrada A de la Puerta 2 Nodo NAND_OUT (unido a 2B)
5 2B Entrada B de la Puerta 2 Nodo NAND_OUT (unido a 2 A)
6 2Y Salida de la Puerta 2 Nodo ALARM
7 GND Referencia de tierra Nodo 0
14 VCC Alimentación positiva Nodo VCC

(Nota: Los pines de entrada no utilizados 9, 10, 12 y 13 deben conectarse a tierra en los montajes físicos para evitar la oscilación CMOS).

Guía de conexionado

  • V1: se conecta entre VCC (positivo) y 0 (GND).
  • SW1: se conecta entre VCC y DOOR.
  • R1: se conecta entre DOOR y 0.
  • SW2: se conecta entre VCC y EN.
  • R2: se conecta entre EN y 0.
  • U1:
  • El pin 1 se conecta a DOOR.
  • El pin 2 se conecta a EN.
  • El pin 3 se conecta a NAND_OUT.
  • El pin 4 se conecta a NAND_OUT.
  • El pin 5 se conecta a NAND_OUT.
  • El pin 6 se conecta a ALARM.
  • El pin 7 se conecta a 0.
  • El pin 14 se conecta a VCC.
  • R3: se conecta entre ALARM y LED_IN.
  • D1: el ánodo se conecta a LED_IN, el cátodo se conecta a 0.

Diagrama de bloques conceptual

Conceptual block diagram — NAND1 NAND gate
Lectura rápida: entradas → bloque principal → salida (actuador o medida). Resume el esquemático ASCII de la siguiente sección.

Esquemático

VCC --> [ SW1: Door Sensor ] --+--(DOOR)----->+
                               |              |
                         [ R1: 10 kΩ ]         v
                               |        [ U1: NAND1 ] --(NAND_OUT)--> [ U1: NAND2 ] --(ALARM)--> [ R3: 330 Ω ] --(LED_IN)--> [ D1: Red LED ] --> GND
                              GND       [ Pins 1,2->3 ]               [ Pins 4,5->6 ]
                                              ^
                                              |
VCC --> [ SW2: Sys Enable ] ---+--(EN)------->+
                               |
                         [ R2: 10 kΩ ]
                               |
                              GND
Esquema Eléctrico

Tabla de verdad

DOOR (SW1) EN (SW2) NAND_OUT (Pin 3) ALARM (Pin 6) Estado del LED
0 (Bajo) 0 (Bajo) 1 (Alto) 0 (Bajo) APAGADO
0 (Bajo) 1 (Alto) 1 (Alto) 0 (Bajo) APAGADO
1 (Alto) 0 (Bajo) 1 (Alto) 0 (Bajo) APAGADO
1 (Alto) 1 (Alto) 0 (Bajo) 1 (Alto) ENCENDIDO (Alarma activa)


Mediciones y pruebas

  1. Validación de la alimentación: Mida el voltaje entre VCC y 0. Asegúrese de que sea de 5 V estables.
  2. Estados de entrada: Use un multímetro para medir los nodos DOOR y EN con respecto a tierra (0). Verifique que marquen 0 V cuando el interruptor esté abierto y 5 V cuando el interruptor esté cerrado.
  3. Lógica intermedia: Cierre tanto SW1 como SW2. Mida el nodo NAND_OUT. Debería caer a 0 V (Nivel bajo lógico) solo cuando ambos interruptores estén cerrados.
  4. Salida final: Mida el nodo ALARM. Debería marcar 5 V (Nivel alto lógico) solo cuando ambos interruptores estén cerrados, confirmando que U1B invirtió correctamente la señal de U1 A.
  5. Comprobación de la carga: Verifique que la caída de voltaje a través de D1 sea aproximadamente de 1.8 V a 2.2 V cuando esté iluminado.

Netlist SPICE y simulación

Netlist SPICE de referencia (ngspice) — extractoNetlist SPICE completo (ngspice)

* Practical case: Open door alarm with inhibition
.width out=256

* Main Power Supply
V1 VCC 0 DC 5

* Door Sensor (SW1) - Modeled as a voltage-controlled switch with a pulse source
V_ctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)
S1 VCC DOOR ctrl1 0 mySW
R1 DOOR 0 10k

* System Enable (SW2) - Modeled as a voltage-controlled switch with a slower pulse source
V_ctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)
S2 VCC EN ctrl2 0 mySW
R2 EN 0 10k

* 74HC00 Quad 2-input NAND gate
* Wiring: 1->DOOR, 2->EN, 3->NAND_OUT, 4->NAND_OUT, 5->NAND_OUT, 6->ALARM, 7->0, 14->VCC
XU1 DOOR EN NAND_OUT NAND_OUT NAND_OUT ALARM 0 VCC 74HC00

* ... (truncated in public view) ...

Copia este contenido en un archivo .cir y ejecútalo con ngspice.

* Practical case: Open door alarm with inhibition
.width out=256

* Main Power Supply
V1 VCC 0 DC 5

* Door Sensor (SW1) - Modeled as a voltage-controlled switch with a pulse source
V_ctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)
S1 VCC DOOR ctrl1 0 mySW
R1 DOOR 0 10k

* System Enable (SW2) - Modeled as a voltage-controlled switch with a slower pulse source
V_ctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)
S2 VCC EN ctrl2 0 mySW
R2 EN 0 10k

* 74HC00 Quad 2-input NAND gate
* Wiring: 1->DOOR, 2->EN, 3->NAND_OUT, 4->NAND_OUT, 5->NAND_OUT, 6->ALARM, 7->0, 14->VCC
XU1 DOOR EN NAND_OUT NAND_OUT NAND_OUT ALARM 0 VCC 74HC00

* Alarm LED indicator
R3 ALARM LED_IN 330
D1 LED_IN 0 DLED

* Models and Subcircuits
.model mySW SW(Ron=1 Roff=100Meg Vt=2.5)
.model DLED D(IS=1e-15 N=2 RS=10)

* 74HC00 Subcircuit implementation (using robust continuous B-sources for logic)
.subckt 74HC00 1 2 3 4 5 6 7 14
* Gate 1 (Pins 1, 2 -> 3)
B1 3 7 V = 5 * (1 - (1 / (1 + exp(-50*(V(1,7)-2.5)))) * (1 / (1 + exp(-50*(V(2,7)-2.5)))))
* Gate 2 (Pins 4, 5 -> 6)
B2 6 7 V = 5 * (1 - (1 / (1 + exp(-50*(V(4,7)-2.5)))) * (1 / (1 + exp(-50*(V(5,7)-2.5)))))
* Dummy loads to prevent floating pins
R1 1 7 100Meg
R2 2 7 100Meg
R3 4 7 100Meg
R4 5 7 100Meg
R5 14 7 100Meg
.ends

* Analysis Directives
.op
.tran 1u 300u
.print tran V(DOOR) V(EN) V(ALARM) V(LED_IN)
.end

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The simulation results show that when both DOOR and EN are high (approx 5V), ALARM goes high (5V) and LED_IN reaches about 1.65V, indicating the LED is ON. When either DOOR or EN is low (approx 0V), ALARM is low (0V) and LED_IN is 0V, indicating the LED is OFF. This perfectly matches the intended truth table for the alarm with inhibition.
Show raw data table (412 rows)
Index   time            v(door)         v(en)           v(alarm)        v(led_in)
0	0.000000e+00	4.999000e-04	4.999000e-04	-7.41841e-68	4.091162e-30
1	1.000000e-08	4.999000e-04	4.999000e-04	-7.41841e-68	2.688961e-41
2	2.000000e-08	4.999000e-04	4.999000e-04	-7.41841e-68	-2.68896e-41
3	4.000000e-08	4.999000e-04	4.999000e-04	-7.41841e-68	-8.83675e-52
4	8.000000e-08	4.999000e-04	4.999000e-04	-7.41841e-68	3.534698e-52
5	1.600000e-07	4.999000e-04	4.999000e-04	-7.41841e-68	1.858568e-62
6	3.200000e-07	4.999000e-04	4.999000e-04	-7.41841e-68	-4.64651e-63
7	3.562500e-07	4.999000e-04	4.999000e-04	-7.41841e-68	-7.41842e-68
8	4.196875e-07	4.999000e-04	4.999000e-04	-7.41841e-68	-7.41841e-68
9	4.372461e-07	4.999000e-04	4.999000e-04	-7.41841e-68	-7.41841e-68
10	4.679736e-07	4.999000e-04	4.999000e-04	-7.41841e-68	-7.41841e-68
11	5.019934e-07	4.999500e+00	4.999500e+00	5.000000e+00	1.651140e+00
12	5.700330e-07	4.999500e+00	4.999500e+00	5.000000e+00	1.651062e+00
13	7.061121e-07	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
14	9.782703e-07	4.999500e+00	4.999500e+00	5.000000e+00	1.650725e+00
15	1.000000e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
16	1.043459e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
17	1.130378e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
18	1.304216e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
19	1.651892e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
20	2.347244e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
21	3.347244e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
22	4.347244e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
23	5.347244e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.650721e+00
... (388 more rows) ...


Netlist SPICE de referencia (ngspice)

* Practical case: Open door alarm with inhibition
.width out=256

* Main Power Supply
V1 VCC 0 DC 5

* Door Sensor (SW1) - Modeled as a voltage-controlled switch with a pulse source
V_ctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)
S1 VCC DOOR ctrl1 0 mySW
R1 DOOR 0 10k

* System Enable (SW2) - Modeled as a voltage-controlled switch with a slower pulse source
V_ctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)
S2 VCC EN ctrl2 0 mySW
R2 EN 0 10k

* 74HC00 Quad 2-input NAND gate
* Wiring: 1->DOOR, 2->EN, 3->NAND_OUT, 4->NAND_OUT, 5->NAND_OUT, 6->ALARM, 7->0, 14->VCC
XU1 DOOR EN NAND_OUT NAND_OUT NAND_OUT ALARM 0 VCC 74HC00

* Alarm LED indicator
R3 ALARM LED_IN 330
D1 LED_IN 0 DLED

* Models and Subcircuits
.model mySW SW(Ron=1 Roff=100Meg Vt=2.5)
.model DLED D(IS=1e-15 N=2 RS=10)

* 74HC00 Subcircuit implementation (using robust continuous B-sources for logic)
.subckt 74HC00 1 2 3 4 5 6 7 14
* Gate 1 (Pins 1, 2 -> 3)
B1 3 7 V = 5 * (1 - (1 / (1 + exp(-50*(V(1,7)-2.5)))) * (1 / (1 + exp(-50*(V(2,7)-2.5)))))
* Gate 2 (Pins 4, 5 -> 6)
B2 6 7 V = 5 * (1 - (1 / (1 + exp(-50*(V(4,7)-2.5)))) * (1 / (1 + exp(-50*(V(5,7)-2.5)))))
* Dummy loads to prevent floating pins
R1 1 7 100Meg
R2 2 7 100Meg
R3 4 7 100Meg
R4 5 7 100Meg
R5 14 7 100Meg
.ends

* Analysis Directives
.op
.tran 1u 300u
.print tran V(DOOR) V(EN) V(ALARM) V(LED_IN)
.end

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The simulation results show that when both DOOR and EN are high (approx 5V), ALARM goes high (5V) and LED_IN reaches about 1.65V, indicating the LED is ON. When either DOOR or EN is low (approx 0V), ALARM is low (0V) and LED_IN is 0V, indicating the LED is OFF. This perfectly matches the intended truth table for the alarm with inhibition.

Errores comunes y cómo evitarlos

  • Entradas CMOS flotantes: Olvidar las resistencias pull-down (R1, R2) dejará las entradas flotantes cuando los interruptores estén abiertos, provocando parpadeos impredecibles del LED y un consumo excesivo de corriente del CI. Asegúrese siempre de que los interruptores mecánicos estén emparejados con resistencias pull-up o pull-down.
  • Dejar puertas no utilizadas flotantes: El 74HC00 contiene cuatro puertas. Dejar las entradas de las puertas 3 y 4 desconectadas puede causar oscilaciones de alta frecuencia. Conecte los pines 8, 9, 12 y 13 a tierra (0).
  • Malinterpretar la lógica NAND como NOT: Para utilizar una puerta NAND como inversor (puerta NOT), debe unir ambas entradas (como se hace en los pines 4 y 5). Suministrar la señal a un solo pin mientras se deja el otro flotante resultará en una lógica defectuosa.

Solución

Más Casos Prácticos en Prometeo.blog

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Cuál es el objetivo principal del circuito descrito en el texto?




Pregunta 2: ¿Qué componente principal se utiliza para construir este circuito lógico?




Pregunta 3: ¿Bajo qué condiciones específicas se encenderá el LED de alarma?




Pregunta 4: ¿Qué concepto de electrónica ilustra este circuito con el uso del interruptor de habilitación?




Pregunta 5: ¿Qué función lógica se forma al combinar múltiples puertas NAND en este proyecto?




Pregunta 6: ¿Qué ocurre si el interruptor de habilitación está abierto (0 lógico)?




Pregunta 7: Según el texto, ¿qué valor lógico representa el interruptor de la puerta cuando se encuentra abierto?




Pregunta 8: ¿Qué problema evita este circuito al conectar interruptores mecánicos con entradas digitales CMOS?




Pregunta 9: ¿Cuál es el nivel de dificultad asignado a este diseño de circuito lógico?




Pregunta 10: ¿Qué tipo de entradas procesa el circuito para activar la alarma?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:


Caso práctico: Sistema de parada de emergencia

Prototipo de Sistema de parada de emergencia (Maker Style)

Nivel: Básico – Utilizar la salida de nivel bajo de una puerta NAND para detener un proceso si dos sensores detectan peligro simultáneamente.

Objetivo y caso de uso

En este caso práctico, construirás un circuito de enclavamiento de seguridad digital utilizando una puerta NAND 74HC00. El sistema evalúa dos sensores de peligro independientes y activa un relé de nivel bajo (active-low) para detener un proceso solo cuando ambos sensores detectan una condición crítica.

Por qué es útil:
* Seguridad industrial: Detener maquinaria pesada si dos protecciones de seguridad separadas se omiten o abren simultáneamente.
* Control de procesos: Activar una parada de emergencia en una planta química si tanto la presión como la temperatura superan los umbrales críticos.
* Validación redundante: Evitar que falsas alarmas apaguen un sistema al requerir que dos sensores independientes coincidan antes de tomar medidas.

Resultado esperado:
* Cuando ambos sensores registran un nivel lógico ALTO (indicando peligro), la salida de la puerta NAND caerá a un nivel lógico BAJO (~0 V).
* La señal de 0 V activará un módulo de relé de nivel bajo, accionando la parada de emergencia.
* Si uno o ambos sensores leen un nivel lógico BAJO (condición segura), la salida NAND se mantiene ALTA (~5 V), manteniendo el relé inactivo y el proceso en marcha.

Público objetivo y nivel: Principiantes en electrónica digital y control lógico industrial.

Materiales

  • V1: Fuente de alimentación de 5 V CC
  • SW1: Interruptor SPST, función: sensor de peligro 1
  • SW2: Interruptor SPST, función: sensor de peligro 2
  • R1: Resistencia de 10 kΩ, función: pull-down para SW1
  • R2: Resistencia de 10 kΩ, función: pull-down para SW2
  • U1: CI 74HC00 con cuatro puertas NAND de 2 entradas
  • RLY1: Módulo de relé de 5 V de nivel bajo (active-low), función: parada de emergencia del proceso

Pin-out del CI utilizado

Utilizaremos el 74HC00 (Cuatro puertas NAND de 2 entradas).

Pin Nombre Función lógica Conexión en este caso
1 1 A Entrada 1 de la Puerta 1 Nodo VA (desde SW1)
2 1B Entrada 2 de la Puerta 1 Nodo VB (desde SW2)
3 1Y Salida de la Puerta 1 Nodo VOUT (hacia IN de RLY1)
7 GND Tierra (Masa) Nodo 0
14 VCC Alimentación Nodo VCC

Guía de conexionado

  • V1: se conecta entre el nodo VCC y el nodo 0 (GND).
  • SW1: se conecta entre el nodo VCC y el nodo VA.
  • R1: se conecta entre el nodo VA y el nodo 0.
  • SW2: se conecta entre el nodo VCC y el nodo VB.
  • R2: se conecta entre el nodo VB y el nodo 0.
  • U1: El pin 14 se conecta al nodo VCC; el pin 7 se conecta al nodo 0.
  • U1: El pin 1 se conecta al nodo VA.
  • U1: El pin 2 se conecta al nodo VB.
  • U1: El pin 3 se conecta al nodo VOUT.
  • RLY1: El pin VCC se conecta al nodo VCC, el pin GND se conecta al nodo 0 y el pin de señal/IN se conecta al nodo VOUT.

Diagrama de bloques conceptual

Conceptual block diagram — 74HC00 NAND gate
Lectura rápida: entradas → bloque principal → salida (actuador o medida). Resume el esquemático ASCII de la siguiente sección.

Esquemático

POWER SUPPLY:
[ V1: 5 V DC Power Supply ] --(VCC)
                           --(GND)

SENSOR 1 INPUT PATH:
VCC --> [ SW1: Danger Sensor 1 ] --(Node VA)--> [ U1: 74HC00 NAND (Pin 1) ]
[ Node VA ] --> [ R1: 10 kΩ Pull-down ] --> GND

SENSOR 2 INPUT PATH:
VCC --> [ SW2: Danger Sensor 2 ] --(Node VB)--> [ U1: 74HC00 NAND (Pin 2) ]
[ Node VB ] --> [ R2: 10 kΩ Pull-down ] --> GND

LOGIC TO EMERGENCY STOP PATH:
[ U1: 74HC00 NAND (Pin 3) ] --(Node VOUT)--> [ RLY1: Relay Module (IN) ]

IC & MODULE POWER CONNECTIONS:
VCC --> [ U1: 74HC00 NAND (Pin 14) ]
GND <-- [ U1: 74HC00 NAND (Pin 7) ]

VCC --> [ RLY1: Relay Module (VCC) ]
GND <-- [ RLY1: Relay Module (GND) ]
Esquema Eléctrico

Tabla de verdad

Nota: El módulo de relé en este caso es de nivel bajo (active-low), lo que significa que activa la parada de emergencia cuando recibe un 0.

SW1 (Nodo VA) SW2 (Nodo VB) VOUT (Salida NAND) Estado del Relé (Nivel Bajo) Estado del Proceso
0 (Seguro) 0 (Seguro) 1 (ALTO) APAGADO (OFF) En marcha
0 (Seguro) 1 (Peligro) 1 (ALTO) APAGADO (OFF) En marcha
1 (Peligro) 0 (Seguro) 1 (ALTO) APAGADO (OFF) En marcha
1 (Peligro) 1 (Peligro) 0 (BAJO) ENCENDIDO (Activado) DETENIDO


Mediciones y pruebas

  1. Estados lógicos de entrada: Utilizando un multímetro digital, mide la tensión en CC en los nodos VA y VB con respecto al nodo 0. Verifica que marquen ~0 V cuando los interruptores estén abiertos, y ~5 V cuando estén cerrados.
  2. Nivel de tensión de salida: Mide el nodo VOUT. Confirma que se mantiene cerca de 5 V durante el funcionamiento normal (cuando uno o ningún interruptor está cerrado).
  3. Activación del sistema: Cierra tanto SW1 como SW2 simultáneamente. Mide el nodo VOUT para asegurarte de que cae a ~0 V.
  4. Accionamiento del relé: Escucha el «clic» audible del relé (u observa su LED indicador integrado) precisamente cuando VOUT cae a 0 V, confirmando que el comando de parada de emergencia se ha ejecutado físicamente.

Netlist SPICE y simulación

Netlist SPICE de referencia (ngspice) — extractoNetlist SPICE completo (ngspice)

* Practical case: Emergency stop system
.width out=256

* Main 5V DC power supply
V1 VCC 0 DC 5

* SW1 (Danger sensor 1) and its pull-down resistor
S1 VCC VA ctrl1 0 sw_mod
Vctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)
R1 VA 0 10k

* SW2 (Danger sensor 2) and its pull-down resistor
S2 VCC VB ctrl2 0 sw_mod
Vctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)
R2 VB 0 10k

* U1: 74HC00 Quad 2-Input NAND gate IC (Using pins 1, 2, 3, 7, 14)
XU1 VA VB VOUT VCC 0 NAND_74HC00

* RLY1: 5V Active-low relay module
* ... (truncated in public view) ...

Copia este contenido en un archivo .cir y ejecútalo con ngspice.

* Practical case: Emergency stop system
.width out=256

* Main 5V DC power supply
V1 VCC 0 DC 5

* SW1 (Danger sensor 1) and its pull-down resistor
S1 VCC VA ctrl1 0 sw_mod
Vctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)
R1 VA 0 10k

* SW2 (Danger sensor 2) and its pull-down resistor
S2 VCC VB ctrl2 0 sw_mod
Vctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)
R2 VB 0 10k

* U1: 74HC00 Quad 2-Input NAND gate IC (Using pins 1, 2, 3, 7, 14)
XU1 VA VB VOUT VCC 0 NAND_74HC00

* RLY1: 5V Active-low relay module
XRLY1 VOUT VCC 0 RELAY_MOD

* --- Subcircuits ---

.subckt NAND_74HC00 INA INB OUT VCC GND
* Behavioral NAND gate using continuous sigmoid functions for robust convergence
B1 OUT_int 0 V = 5 * (1 - (1/(1+exp(-20*(V(INA)-2.5)))) * (1/(1+exp(-20*(V(INB)-2.5)))))
R1 OUT_int OUT 100
C1 OUT 0 10p
.ends

.subckt RELAY_MOD IN VCC GND
* Simple resistive model for the relay module to satisfy load requirements
R_in IN GND 10k
R_vcc VCC GND 1k
.ends

* --- Models ---
.model sw_mod SW(Vt=2.5 Ron=0.1 Roff=100Meg)

* --- Analysis Directives ---
.tran 1u 300u
.print tran V(VA) V(VB)
.op
.end

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The ngspice transient analysis shows nodes VA and VB toggling between approximately 0V and 5V, consistent with the PULSE sources driving the switches. This correctly simulates the different combinations of the danger sensors (SW1 and SW2) being triggered or safe.
Show raw data table (501 rows)
Index   time            v(va)           v(vb)
0	0.000000e+00	4.999500e-04	4.999500e-04
1	1.000000e-08	4.999500e-04	4.999500e-04
2	2.000000e-08	4.999500e-04	4.999500e-04
3	4.000000e-08	4.999500e-04	4.999500e-04
4	8.000000e-08	4.999500e-04	4.999500e-04
5	1.600000e-07	4.999500e-04	4.999500e-04
6	3.200000e-07	4.999500e-04	4.999500e-04
7	3.562500e-07	4.999500e-04	4.999500e-04
8	4.196875e-07	4.999500e-04	4.999500e-04
9	4.372461e-07	4.999500e-04	4.999500e-04
10	4.679736e-07	4.999500e-04	4.999500e-04
11	4.795524e-07	4.999500e-04	4.999500e-04
12	4.902290e-07	4.999500e-04	4.999500e-04
13	5.023412e-07	4.999950e+00	4.999950e+00
14	5.111724e-07	4.999950e+00	4.999950e+00
15	5.196372e-07	4.999950e+00	4.999950e+00
16	5.247062e-07	4.999950e+00	4.999950e+00
17	5.271308e-07	4.999950e+00	4.999950e+00
18	5.277087e-07	4.999950e+00	4.999950e+00
19	5.280739e-07	4.999950e+00	4.999950e+00
20	5.285244e-07	4.999950e+00	4.999950e+00
21	5.292184e-07	4.999950e+00	4.999950e+00
22	5.299733e-07	4.999950e+00	4.999950e+00
23	5.306602e-07	4.999950e+00	4.999950e+00
... (477 more rows) ...


Netlist SPICE de referencia (ngspice)

* Practical case: Emergency stop system
.width out=256

* Main 5V DC power supply
V1 VCC 0 DC 5

* SW1 (Danger sensor 1) and its pull-down resistor
S1 VCC VA ctrl1 0 sw_mod
Vctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)
R1 VA 0 10k

* SW2 (Danger sensor 2) and its pull-down resistor
S2 VCC VB ctrl2 0 sw_mod
Vctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)
R2 VB 0 10k

* U1: 74HC00 Quad 2-Input NAND gate IC (Using pins 1, 2, 3, 7, 14)
XU1 VA VB VOUT VCC 0 NAND_74HC00

* RLY1: 5V Active-low relay module
XRLY1 VOUT VCC 0 RELAY_MOD

* --- Subcircuits ---

.subckt NAND_74HC00 INA INB OUT VCC GND
* Behavioral NAND gate using continuous sigmoid functions for robust convergence
B1 OUT_int 0 V = 5 * (1 - (1/(1+exp(-20*(V(INA)-2.5)))) * (1/(1+exp(-20*(V(INB)-2.5)))))
R1 OUT_int OUT 100
C1 OUT 0 10p
.ends

.subckt RELAY_MOD IN VCC GND
* Simple resistive model for the relay module to satisfy load requirements
R_in IN GND 10k
R_vcc VCC GND 1k
.ends

* --- Models ---
.model sw_mod SW(Vt=2.5 Ron=0.1 Roff=100Meg)

* --- Analysis Directives ---
.tran 1u 300u
.print tran V(VA) V(VB)
.op
.end

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The ngspice transient analysis shows nodes VA and VB toggling between approximately 0V and 5V, consistent with the PULSE sources driving the switches. This correctly simulates the different combinations of the danger sensors (SW1 and SW2) being triggered or safe.

Errores comunes y cómo evitarlos

  • Entradas flotantes: Olvidar las resistencias pull-down (R1 y R2). Sin ellas, las entradas de la puerta lógica quedarán flotantes y captarán ruido ambiental, provocando que el relé se active aleatoriamente.
  • Malinterpretar la lógica de nivel bajo (active-low): Esperar que el relé se active cuando la salida es de 5 V. En este caso, la salida NAND cae a 0 V al detectar peligro mutuo, lo que encaja perfectamente con un módulo de relé de nivel bajo. Asegúrate de que tu módulo de relé es realmente de nivel bajo.
  • Omitir las conexiones de alimentación del CI: Olvidar cablear los pines 14 (VCC) y 7 (GND) del 74HC00. El CI no procesará la lógica sin alimentación y puede comportarse de forma errática si se alimenta de forma parásita a través de sus pines de entrada.


Solución de problemas

  • Síntoma: El relé nunca hace clic, incluso cuando ambos interruptores están cerrados.
    • Causa: El pin de salida del 74HC00 no puede absorber suficiente corriente, o el módulo de relé es de nivel alto (active-high) en lugar de nivel bajo.
    • Solución: Asegúrate de estar utilizando un módulo de relé (con un transistor controlador integrado) en lugar de un relé mecánico desnudo. Verifica la lógica de activación del módulo (algunos tienen un puente para seleccionar entre nivel alto y nivel bajo).
  • Síntoma: El relé repiquetea rápidamente o se activa aleatoriamente sin interacción humana.
    • Causa: Entradas flotantes en el nodo VA o VB.
    • Solución: Comprueba dos veces que R1 y R2 están correctamente asentadas en la protoboard y conectadas directamente a GND (nodo 0).
  • Síntoma: El relé siempre está ENCENDIDO y el proceso está permanentemente detenido.
    • Causa: La salida NAND está permanentemente atascada en 0 V. Esto puede suceder si ambas entradas están en cortocircuito a VCC, o si la puerta lógica está dañada.
    • Solución: Mide VA y VB. Si marcan 0 V pero VOUT sigue siendo 0 V, reemplaza el CI 74HC00.

Posibles mejoras y extensiones

  • Antirrebote por hardware (debouncing): Añade un condensador de 1 µF en paralelo a cada interruptor para evitar que el rebote de los contactos genere transiciones lógicas rápidas e involuntarias durante el milisegundo en que se acciona el interruptor.
  • Indicadores visuales de estado: Conecta un LED y una resistencia limitadora de corriente de 330 Ω al nodo VOUT para proporcionar un indicador visual claro en un panel de control cuando el sistema está en un estado seguro (LED ENCENDIDO) frente a un estado de emergencia (LED APAGADO).

Más Casos Prácticos en Prometeo.blog

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Cuál es el componente principal utilizado para la lógica de este circuito de seguridad?




Pregunta 2: ¿Bajo qué condición el sistema detiene el proceso?




Pregunta 3: ¿Qué tipo de módulo de relé se utiliza en este caso práctico?




Pregunta 4: ¿Qué nivel lógico registran los sensores cuando detectan peligro?




Pregunta 5: ¿Cuál es el voltaje aproximado a la salida de la puerta NAND cuando ambos sensores detectan peligro?




Pregunta 6: ¿Por qué es útil este sistema en la validación redundante?




Pregunta 7: En el contexto de control de procesos, ¿qué variables podrían activar la parada de emergencia en una planta química según el texto?




Pregunta 8: ¿Qué sucede con la salida de la puerta NAND si solo un sensor detecta peligro (nivel ALTO) y el otro no (nivel BAJO)?




Pregunta 9: ¿Cuál es el propósito principal de este circuito de enclavamiento de seguridad?




Pregunta 10: ¿Qué acción física realiza el relé cuando recibe la señal de 0 V de la puerta NAND?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:


Caso práctico: Inversor lógico usando Puerta NAND

Prototipo de Inversor lógico usando Puerta NAND (Maker Style)

Nivel: Básico – Demostrar la universalidad de la puerta NAND configurándola como una puerta NOT básica.

Objetivo y caso de uso

En este caso práctico, construirás un inversor digital (puerta NOT) utilizando una puerta NAND 74HC00 estándar cortocircuitando sus entradas entre sí.

Comprender esta configuración es muy útil por varias razones:
* Optimización de la lista de materiales (BOM): Reduce el número de circuitos integrados únicos necesarios en un diseño; si tienes puertas NAND libres en una placa, no necesitas añadir un chip de puerta NOT dedicado.
* Universalidad lógica: Demuestra de forma práctica que las puertas NAND son «universales», lo que significa que cualquier función lógica se puede construir utilizando únicamente puertas NAND.
* Simplificación del circuito: Ayuda a optimizar el enrutamiento en las placas de circuito impreso reutilizando puertas no utilizadas cercanas en lugar de trazar pistas hacia un CI diferente.

Resultado esperado:
* Cuando el interruptor de entrada proporciona un nivel lógico BAJO (0 V) a las entradas cortocircuitadas, la salida pasará a nivel ALTO (aprox. 5 V), encendiendo el LED indicador.
* Cuando el interruptor de entrada proporciona un nivel lógico ALTO (5 V) a las entradas cortocircuitadas, la salida pasará a nivel BAJO (0 V), apagando el LED indicador.
* El circuito replicará perfectamente el comportamiento de una puerta NOT 74HC04 estándar.

Público objetivo: Principiantes en electrónica que aprenden álgebra de Boole fundamental e implementación de hardware digital.

Materiales

  • V1: Fuente de alimentación de 5 V CC
  • U1: Puerta NAND cuádruple de 2 entradas 74HC00
  • SW1: Interruptor de palanca SPST o pulsador, función: selector de estado de entrada
  • R1: Resistencia de 10 kΩ, función: pull-down para el nodo VA
  • R2: Resistencia de 330 Ω, función: limitadora de corriente para el LED de salida
  • D1: LED rojo, función: indicador del estado de VOUT

Pin-out del CI utilizado

CI: 74HC00 (Puerta NAND cuádruple de 2 entradas)

Pin Nombre Función lógica Conexión en este caso
1 1 A Entrada A de la Puerta 1 Nodo VA (cortocircuitado a 1B)
2 1B Entrada B de la Puerta 1 Nodo VA (cortocircuitado a 1 A)
3 1Y Salida de la Puerta 1 Nodo VOUT
7 GND Tierra Nodo 0
14 VCC Fuente de alimentación positiva Nodo VCC

(Nota: Los pines 4, 5, 9, 10, 12 y 13 son entradas no utilizadas en este ejercicio específico e idealmente deberían conectarse a Tierra en un circuito físico final para evitar problemas de entradas CMOS flotantes).

Guía de conexionado

  • V1: Se conecta entre el nodo VCC (+5 V) y el nodo 0 (GND).
  • U1 VCC/GND: Conecta el pin 14 al nodo VCC y el pin 7 al nodo 0.
  • SW1: Se conecta entre el nodo VCC y el nodo VA.
  • R1: Se conecta entre el nodo VA y el nodo 0 (asegura un nivel BAJO definitivo cuando el interruptor está abierto).
  • Entradas U1: Conecta el pin 1 (1 A) al nodo VA y conecta el pin 2 (1B) al nodo VA. Esto une ambas entradas de la primera puerta NAND.
  • Salida U1: El pin 3 (1Y) proporciona la señal invertida y se conecta al nodo VOUT.
  • R2: Se conecta entre el nodo VOUT y el ánodo de D1.
  • D1: Conecta el cátodo al nodo 0.

Diagrama de bloques conceptual

Conceptual block diagram — 74HC00 NAND gate
Lectura rápida: entradas → bloque principal → salida (actuador o medida). Resume el esquemático ASCII de la siguiente sección.

Esquemático

VCC --> [ SW1: Switch ] --(Node VA)--> [ U1: 74HC00 NAND (Pins 1 & 2) ] --(VOUT)--> [ R2: 330 Ω ] --> [ D1: Red LED ] --> GND
                               |
                          [ R1: 10 kΩ ]
                               |
                              GND
Esquema Eléctrico

Tabla de verdad

Entrada (VA) Salida (VOUT) Estado del LED (D1)
0 (BAJO) 1 (ALTO) ENCENDIDO
1 (ALTO) 0 (BAJO) APAGADO


Mediciones y pruebas

  1. Medición de voltaje de entrada: Usa un multímetro para medir el voltaje en el nodo VA con respecto al nodo 0. Verifica que marque ~0 V cuando SW1 esté abierto, y ~5 V cuando SW1 esté cerrado.
  2. Medición de voltaje de salida: Mueve la sonda del multímetro al nodo VOUT. Confirma que marque ~5 V cuando VA sea 0 V, y marque ~0 V cuando VA sea 5 V.
  3. Verificación funcional: Alterna el interruptor varias veces. Asegúrate de que D1 se comporte de manera inversa a la acción física del interruptor (por ejemplo, si presionar el botón envía una señal ALTA, el LED debería apagarse al presionarlo).

Netlist SPICE y simulación

Netlist SPICE de referencia (ngspice) — extractoNetlist SPICE completo (ngspice)

* Practical case: Logic inverter using NAND gate

* Power Supply
V1 VCC 0 DC 5V

* Switch SW1 (VCC to VA)
* Modeled as a voltage-controlled switch to simulate user interaction
S_SW1 VCC VA SW_CTRL 0 sw_mod
.model sw_mod SW(vt=2.5 vh=0.2 ron=0.1 roff=100Meg)
V_SW_CTRL SW_CTRL 0 PULSE(0 5 10u 1u 1u 100u 200u)

* Pull-down resistor R1
R1 VA 0 10k

* U1: 74HC00 Quad 2-Input NAND Gate (using 1 gate)
* Pin 14: VCC, Pin 7: 0
* Pin 1: VA, Pin 2: VA, Pin 3: VOUT
XU1 VA VA VOUT VCC 0 NAND2_74HC00

* R2: Current limiting resistor
* ... (truncated in public view) ...

Copia este contenido en un archivo .cir y ejecútalo con ngspice.

* Practical case: Logic inverter using NAND gate

* Power Supply
V1 VCC 0 DC 5V

* Switch SW1 (VCC to VA)
* Modeled as a voltage-controlled switch to simulate user interaction
S_SW1 VCC VA SW_CTRL 0 sw_mod
.model sw_mod SW(vt=2.5 vh=0.2 ron=0.1 roff=100Meg)
V_SW_CTRL SW_CTRL 0 PULSE(0 5 10u 1u 1u 100u 200u)

* Pull-down resistor R1
R1 VA 0 10k

* U1: 74HC00 Quad 2-Input NAND Gate (using 1 gate)
* Pin 14: VCC, Pin 7: 0
* Pin 1: VA, Pin 2: VA, Pin 3: VOUT
XU1 VA VA VOUT VCC 0 NAND2_74HC00

* R2: Current limiting resistor
R2 VOUT N1 330

* D1: Red LED
D1 N1 0 DLED

* Models
.model DLED D(IS=1e-15 N=1.8 RS=10)

* Subcircuit for NAND Gate
.subckt NAND2_74HC00 1A 1B 1Y VCC GND
RinA 1A GND 1G
RinB 1B GND 1G
Rvcc VCC GND 100Meg
B1 Y_int GND V = 5 * (1 - (1/(1+exp(-50*(V(1A)-2.5)))) * (1/(1+exp(-50*(V(1B)-2.5)))))
Rout Y_int 1Y 50
.ends

* Analysis
.tran 1u 600u
.print tran V(VA) V(VOUT) V(N1) I(V1)
.op

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The transient simulation shows that when the input VA is LOW (~0V), the output VOUT is HIGH (~4.54V) and the LED node N1 is at ~1.48V (LED ON). When VA goes HIGH (~5V), VOUT goes LOW (~0V) and N1 goes to ~0V (LED OFF). This perfectly matches the expected logic inverter behavior.
Show raw data table (704 rows)
Index   time            v(va)           v(vout)         v(n1)           v1#branch
0	0.000000e+00	4.999400e-04	4.537182e+00	1.482582e+00	-9.99950e-08
1	1.000000e-08	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
2	2.000000e-08	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
3	4.000000e-08	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
4	8.000000e-08	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
5	1.600000e-07	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
6	3.200000e-07	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
7	6.400000e-07	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
8	1.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
9	2.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
10	3.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
11	4.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
12	5.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
13	6.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
14	7.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
15	8.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
16	9.280000e-06	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
17	1.000000e-05	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
18	1.010000e-05	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
19	1.030000e-05	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
20	1.034750e-05	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
21	1.043062e-05	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
22	1.045363e-05	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
23	1.049390e-05	4.999400e-04	4.537182e+00	1.482580e+00	-9.99950e-08
... (680 more rows) ...


Netlist SPICE de referencia (ngspice)

* Practical case: Logic inverter using NAND gate

* Power Supply
V1 VCC 0 DC 5V

* Switch SW1 (VCC to VA)
* Modeled as a voltage-controlled switch to simulate user interaction
S_SW1 VCC VA SW_CTRL 0 sw_mod
.model sw_mod SW(vt=2.5 vh=0.2 ron=0.1 roff=100Meg)
V_SW_CTRL SW_CTRL 0 PULSE(0 5 10u 1u 1u 100u 200u)

* Pull-down resistor R1
R1 VA 0 10k

* U1: 74HC00 Quad 2-Input NAND Gate (using 1 gate)
* Pin 14: VCC, Pin 7: 0
* Pin 1: VA, Pin 2: VA, Pin 3: VOUT
XU1 VA VA VOUT VCC 0 NAND2_74HC00

* R2: Current limiting resistor
R2 VOUT N1 330

* D1: Red LED
D1 N1 0 DLED

* Models
.model DLED D(IS=1e-15 N=1.8 RS=10)

* Subcircuit for NAND Gate
.subckt NAND2_74HC00 1A 1B 1Y VCC GND
RinA 1A GND 1G
RinB 1B GND 1G
Rvcc VCC GND 100Meg
B1 Y_int GND V = 5 * (1 - (1/(1+exp(-50*(V(1A)-2.5)))) * (1/(1+exp(-50*(V(1B)-2.5)))))
Rout Y_int 1Y 50
.ends

* Analysis
.tran 1u 600u
.print tran V(VA) V(VOUT) V(N1) I(V1)
.op

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The transient simulation shows that when the input VA is LOW (~0V), the output VOUT is HIGH (~4.54V) and the LED node N1 is at ~1.48V (LED ON). When VA goes HIGH (~5V), VOUT goes LOW (~0V) and N1 goes to ~0V (LED OFF). This perfectly matches the expected logic inverter behavior.

Errores comunes y cómo evitarlos

  • Dejar las entradas CMOS flotantes: El 74HC00 es un CI CMOS. Si olvidas usar la resistencia pull-down R1, al abrir SW1 dejarás las entradas 1 A y 1B flotantes, lo que provocará una conmutación de salida errática y un alto consumo de energía. Usa siempre una resistencia pull-up o pull-down.
  • Olvidar la resistencia limitadora de corriente del LED: Conectar D1 directamente entre VOUT y 0 sin R2 consumirá una corriente excesiva, lo que podría destruir tanto el LED como la etapa de salida del CI 74HC00.
  • Cortocircuitar entradas incorrectamente: Cortocircuitar por error una entrada con una salida (por ejemplo, puentear los pines 2 y 3 en lugar de 1 y 2) creará un bucle de retroalimentación o un conflicto lógico, impidiendo que el circuito funcione.


Solución de problemas

  • Síntoma: El LED nunca se enciende.
    • Causa: El LED (D1) podría estar insertado al revés, o el CI no tiene alimentación.
    • Solución: Comprueba la polaridad del LED (ánodo a R2, cátodo a 0). Mide el voltaje entre los pines 14 y 7 para confirmar que el CI recibe 5 V.
  • Síntoma: El LED siempre está encendido, independientemente de la posición del interruptor.
    • Causa: El interruptor está mal cableado, o la configuración pull-up/pull-down es incorrecta (por ejemplo, el nodo VA está atascado en nivel BAJO).
    • Solución: Verifica que SW1 aplique 5 V al nodo VA cuando se activa. Comprueba que R1 tenga una conexión sólida a Tierra.
  • Síntoma: El CI se calienta muchísimo.
    • Causa: La fuente de alimentación está invertida o hay un cortocircuito directo en la salida.
    • Solución: Desconecta la alimentación inmediatamente. Verifica que el pin 14 vaya a VCC y el pin 7 vaya a 0. Asegúrate de que R2 esté presente en la ruta de salida.

Posibles mejoras y extensiones

  • Añadir un indicador de entrada: Conecta un segundo LED y una resistencia directamente al nodo VA. Esto te permite comparar visualmente el estado de entrada y el estado de salida uno al lado del otro (cuando un LED esté ENCENDIDO, el otro estará APAGADO).
  • Construir una puerta AND: Conecta en cascada este inversor recién construido a una segunda puerta NAND. Conecta la salida de una puerta NAND estándar a las entradas cortocircuitadas de tu puerta NOT basada en NAND para crear una puerta AND funcional, demostrando aún más la lógica universal.

Más Casos Prácticos en Prometeo.blog

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Cuál es el objetivo principal de este caso práctico?




Pregunta 2: ¿Cómo se configura la puerta NAND para que funcione como una puerta NOT?




Pregunta 3: ¿Qué circuito integrado estándar se utiliza en este ejercicio para la puerta NAND?




Pregunta 4: ¿Qué significa que las puertas NAND sean 'universales'?




Pregunta 5: ¿Cómo ayuda esta configuración a la optimización de la lista de materiales (BOM)?




Pregunta 6: ¿De qué manera esta técnica simplifica el diseño de placas de circuito impreso (PCB)?




Pregunta 7: Según el resultado esperado, ¿qué sucede cuando el interruptor de entrada proporciona un nivel lógico BAJO (0 V)?




Pregunta 8: Si la entrada de la puerta NOT (NAND configurada) recibe un nivel lógico ALTO, ¿cuál será el estado de la salida?




Pregunta 9: En este circuito, ¿a qué voltaje aproximado corresponde el nivel lógico ALTO en la salida?




Pregunta 10: Si tienes puertas NAND libres en tu placa y usas esta configuración, ¿qué componente evitas añadir al diseño?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:


Caso práctico: Sistema de alarma de doble entrada usando Puerta OR

Prototipo de Sistema de alarma de doble entrada usando Puerta OR (Maker Style)

Nivel: Básico – Construye un sistema de alerta que activa un LED de advertencia cuando se dispara una señal local o remota.

Objetivo y caso de uso

En este caso práctico, construirás un indicador de alarma digital utilizando una puerta lógica OR 74HC32. El circuito combina dos señales de entrada independientes (que representan un sensor local y un sensor remoto) de modo que si una de ellas o ambas se activan, la salida encenderá un LED de alerta.

Por qué este circuito es útil:
* Sistemas de seguridad: Un único panel de alarma puede monitorear tanto una puerta principal como una puerta trasera.
* Seguridad industrial: Una máquina puede detenerse mediante un botón de parada de emergencia local o una consola de operador remota.
* Monitoreo ambiental: Un sistema puede activar una advertencia unificada si un detector de humo o un sensor de calor detectan una anomalía.

Resultado esperado:
* Con ambos interruptores abiertos (0 V en las entradas), la salida es 0 V y el LED está apagado.
* Cerrar el interruptor local produce 5 V en la primera entrada, forzando la salida a 5 V y encendiendo el LED.
* Cerrar el interruptor remoto produce 5 V en la segunda entrada, forzando la salida a 5 V y encendiendo el LED.
* Cerrar ambos interruptores simultáneamente produce 5 V en ambas entradas, manteniendo la salida de 5 V y conservando el LED encendido.

Público objetivo y nivel: Principiantes y aficionados que están aprendiendo conceptos básicos de lógica digital.

Materiales

  • U1: Puerta OR cuádruple de 2 entradas 74HC32, función: control lógico
  • V1: Fuente de alimentación de 5 V CC, función: fuente de energía
  • SW1: Interruptor SPST, función: disparador de alarma local
  • SW2: Interruptor SPST, función: disparador de alarma remota
  • R1: Resistencia de 10 kΩ, función: pull-down para VA
  • R2: Resistencia de 10 kΩ, función: pull-down para VB
  • R3: Resistencia de 330 Ω, función: limitación de corriente del LED
  • D1: LED rojo, función: indicador de alarma

Pin-out del CI utilizado

74HC32 (Puerta OR cuádruple de 2 entradas)

Pin Nombre Función lógica Conexión en este caso
1 1 A Entrada 1 de la Puerta 1 Se conecta al nodo VA (desde SW1)
2 1B Entrada 2 de la Puerta 1 Se conecta al nodo VB (desde SW2)
3 1Y Salida de la Puerta 1 Se conecta al nodo VOUT
7 GND Tierra / Referencia de 0 V Se conecta al nodo 0
14 VCC Voltaje de alimentación positivo Se conecta al nodo VCC

(Nota: Los pines 4, 5, 6, 8, 9, 10, 11, 12 y 13 pertenecen a las otras tres puertas OR no utilizadas en el encapsulado e idealmente deberían tener sus entradas conectadas a tierra en un diseño permanente, aunque se omiten de esta ruta de señal principal por simplicidad).

Guía de conexionado

  • V1: El terminal positivo se conecta al nodo VCC, el terminal negativo se conecta al nodo 0.
  • SW1: Se conecta entre el nodo VCC y el nodo VA.
  • SW2: Se conecta entre el nodo VCC y el nodo VB.
  • R1: Se conecta entre el nodo VA y el nodo 0.
  • R2: Se conecta entre el nodo VB y el nodo 0.
  • U1: El Pin 14 se conecta al nodo VCC, el Pin 7 se conecta al nodo 0. El Pin 1 se conecta al nodo VA, el Pin 2 se conecta al nodo VB, el Pin 3 se conecta al nodo VOUT.
  • R3: Se conecta entre el nodo VOUT y el nodo VLED.
  • D1: El ánodo se conecta al nodo VLED, el cátodo se conecta al nodo 0.

Diagrama de bloques conceptual

Conceptual block diagram — PUERTA OR gate
Lectura rápida: entradas → bloque principal → salida (actuador o medida). Resume el esquemático ASCII de la siguiente sección.

Esquemático

VCC --> [ SW1: Local Alarm ] --(VA)-->+---------------------------------> [           ]
                                      |                                   [ U1: Pin 1 ]
              +--> [ R1: 10 kΩ Pull-down ] --> GND [           ]
                                                                          [  74HC32   ] --(VOUT)--> [ R3: 330 Ω ] --(VLED)--> [ D1: Red LED ] --> GND
VCC --> [ SW2: Remote Alarm] --(VB)-->+---------------------------------> [  OR Gate  ]
                                      |                                   [           ]
                                      +--> [ R2: 10 kΩ Pull-down ] --> GND [ U1: Pin 2 ]
                                                                          [           ]
Esquema Eléctrico

Tabla de verdad

Señal local (VA) Señal remota (VB) Salida (VOUT) LED de alarma (D1)
0 (Bajo) 0 (Bajo) 0 (Bajo) APAGADO
0 (Bajo) 1 (Alto) 1 (Alto) ENCENDIDO
1 (Alto) 0 (Bajo) 1 (Alto) ENCENDIDO
1 (Alto) 1 (Alto) 1 (Alto) ENCENDIDO


Mediciones y pruebas

  1. Verificación de entrada: Usando un multímetro digital (DMM) referenciado al nodo 0, mide el voltaje en los nodos VA y VB. Verifica que marquen aproximadamente 0 V cuando el interruptor respectivo esté abierto, y 5 V cuando esté cerrado.
  2. Verificación de salida: Mide el voltaje en el nodo VOUT. Confirma que marque 0 V solo cuando tanto VA como VB estén a 0 V. Si cualquiera de las entradas o ambas están a 5 V, VOUT debe medir cerca de 5 V.
  3. Confirmación visual: Alterna SW1 y SW2 a través de las cuatro combinaciones posibles enumeradas en la tabla de verdad y confirma que D1 se comporte en consecuencia.
  4. Medición de corriente (Opcional): Coloca tu DMM en serie con R3 para medir la corriente directa del LED. Debería ser de aproximadamente 8-10 mA dependiendo de la caída de voltaje directo del LED.

Netlist SPICE y simulación

Netlist SPICE de referencia (ngspice) — extractoNetlist SPICE completo (ngspice)

* Dual Input Alarm System using OR Gate
.width out=256

* Power Supply
V1 VCC 0 DC 5

* Local Alarm Trigger (SW1)
* Modeled as a voltage-controlled switch driven by a pulse to simulate user interaction
SW1 VCC VA ctrl1 0 mySW
Vctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)

* Remote Alarm Trigger (SW2)
* Modeled as a voltage-controlled switch driven by a pulse to simulate user interaction
SW2 VCC VB ctrl2 0 mySW
Vctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)

* Switch Model
.model mySW SW(Ron=1 Roff=100Meg Vt=2.5)

* Pull-down resistors
* ... (truncated in public view) ...

Copia este contenido en un archivo .cir y ejecútalo con ngspice.

* Dual Input Alarm System using OR Gate
.width out=256

* Power Supply
V1 VCC 0 DC 5

* Local Alarm Trigger (SW1)
* Modeled as a voltage-controlled switch driven by a pulse to simulate user interaction
SW1 VCC VA ctrl1 0 mySW
Vctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)

* Remote Alarm Trigger (SW2)
* Modeled as a voltage-controlled switch driven by a pulse to simulate user interaction
SW2 VCC VB ctrl2 0 mySW
Vctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)

* Switch Model
.model mySW SW(Ron=1 Roff=100Meg Vt=2.5)

* Pull-down resistors
R1 VA 0 10k
R2 VB 0 10k

* 74HC32 Quad 2-input OR gate (using 1 gate)
XU1 VA VB VOUT 0 VCC U_74HC32_OR

* Robust Subcircuit for 74HC32 OR Gate using continuous math functions
.subckt U_74HC32_OR P1 P2 P3 P7 P14
B1 P3 P7 V = V(P14,P7) * (1 - (1 / (1 + exp(50*(V(P1,P7)-V(P14,P7)/2)))) * (1 / (1 + exp(50*(V(P2,P7)-V(P14,P7)/2)))))
.ends

* Output Indicator
R3 VOUT VLED 330
D1 VLED 0 DLED
.model DLED D(IS=1e-15 N=1.8 RS=10)

* Analysis Commands
.tran 1u 300u
.print tran V(VA) V(VB) V(VOUT) V(VLED)
.op

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The transient analysis spans 0 s to 300 us and captures the switching interval. Main ranges: v(vout) 2.77e-62 uV -> 5 V; v(va) 500 uV -> 5 V; v(vb) 500 uV -> 5 V.
Show raw data table (412 rows)
Index   time            v(va)           v(vb)           v(vout)         v(vled)
0	0.000000e+00	4.999500e-04	4.999500e-04	2.767481e-68	5.488664e-30
1	1.000000e-08	4.999500e-04	4.999500e-04	2.767481e-68	4.008316e-41
2	2.000000e-08	4.999500e-04	4.999500e-04	2.767481e-68	-4.00832e-41
3	4.000000e-08	4.999500e-04	4.999500e-04	2.767481e-68	-1.46362e-51
4	8.000000e-08	4.999500e-04	4.999500e-04	2.767481e-68	5.854466e-52
5	1.600000e-07	4.999500e-04	4.999500e-04	2.767481e-68	3.420369e-62
6	3.200000e-07	4.999500e-04	4.999500e-04	2.767481e-68	-8.55089e-63
7	3.562500e-07	4.999500e-04	4.999500e-04	2.767481e-68	2.767467e-68
8	4.196875e-07	4.999500e-04	4.999500e-04	2.767481e-68	2.767492e-68
9	4.372461e-07	4.999500e-04	4.999500e-04	2.767481e-68	2.767481e-68
10	4.679736e-07	4.999500e-04	4.999500e-04	2.767481e-68	2.767481e-68
11	5.019934e-07	4.999500e+00	4.999500e+00	5.000000e+00	1.503225e+00
12	5.700330e-07	4.999500e+00	4.999500e+00	5.000000e+00	1.502641e+00
13	7.061121e-07	4.999500e+00	4.999500e+00	5.000000e+00	1.502321e+00
14	9.782703e-07	4.999500e+00	4.999500e+00	5.000000e+00	1.502318e+00
15	1.000000e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
16	1.043459e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
17	1.130378e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
18	1.304216e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
19	1.651892e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
20	2.347244e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
21	3.347244e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
22	4.347244e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
23	5.347244e-06	4.999500e+00	4.999500e+00	5.000000e+00	1.502314e+00
... (388 more rows) ...


Netlist SPICE de referencia (ngspice)

* Dual Input Alarm System using OR Gate
.width out=256

* Power Supply
V1 VCC 0 DC 5

* Local Alarm Trigger (SW1)
* Modeled as a voltage-controlled switch driven by a pulse to simulate user interaction
SW1 VCC VA ctrl1 0 mySW
Vctrl1 ctrl1 0 PULSE(0 5 0 1u 1u 50u 100u)

* Remote Alarm Trigger (SW2)
* Modeled as a voltage-controlled switch driven by a pulse to simulate user interaction
SW2 VCC VB ctrl2 0 mySW
Vctrl2 ctrl2 0 PULSE(0 5 0 1u 1u 100u 200u)

* Switch Model
.model mySW SW(Ron=1 Roff=100Meg Vt=2.5)

* Pull-down resistors
R1 VA 0 10k
R2 VB 0 10k

* 74HC32 Quad 2-input OR gate (using 1 gate)
XU1 VA VB VOUT 0 VCC U_74HC32_OR

* Robust Subcircuit for 74HC32 OR Gate using continuous math functions
.subckt U_74HC32_OR P1 P2 P3 P7 P14
B1 P3 P7 V = V(P14,P7) * (1 - (1 / (1 + exp(50*(V(P1,P7)-V(P14,P7)/2)))) * (1 / (1 + exp(50*(V(P2,P7)-V(P14,P7)/2)))))
.ends

* Output Indicator
R3 VOUT VLED 330
D1 VLED 0 DLED
.model DLED D(IS=1e-15 N=1.8 RS=10)

* Analysis Commands
.tran 1u 300u
.print tran V(VA) V(VB) V(VOUT) V(VLED)
.op

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The transient analysis spans 0 s to 300 us and captures the switching interval. Main ranges: v(vout) 2.77e-62 uV -> 5 V; v(va) 500 uV -> 5 V; v(vb) 500 uV -> 5 V.

Errores comunes y cómo evitarlos

  1. Entradas flotantes: Olvidar conectar las resistencias de pull-down (R1 y R2). Sin ellas, cuando los interruptores están abiertos, las entradas del 74HC32 actúan como antenas y harán que la salida alterne u oscile aleatoriamente. Utiliza siempre resistencias de pull-down.
  2. Falta de resistencia limitadora de corriente del LED: Conectar el LED directamente desde el pin de salida (nodo VOUT) a tierra. Esto consumirá una corriente excesiva, pudiendo quemar tanto el LED como la etapa de salida del 74HC32. Incluye siempre R3.
  3. Olvidar las conexiones de alimentación del CI: Cablear las entradas y salidas pero olvidar suministrar VCC al pin 14 y GND al pin 7. El CI no puede funcionar sin sus rieles de alimentación conectados.


Solución de problemas

  • Síntoma: El LED siempre está ENCENDIDO, independientemente de las posiciones de los interruptores.
    • Causa: Las entradas están cortocircuitadas permanentemente a VCC, o los interruptores están cableados como «Normalmente cerrados».
    • Solución: Verifica que los interruptores solo puenteen VCC a las entradas cuando se presionan activamente. Asegúrate de que los nodos VA y VB midan 0 V cuando se sueltan los interruptores.
  • Síntoma: El LED nunca se ENCIENDE.
    • Causa: El LED D1 está insertado al revés (polaridad invertida), o el CI no está alimentado.
    • Solución: Comprueba la orientación de D1 (ánodo a R3, cátodo a tierra). Mide el pin 14 en U1 para garantizar que recibe 5 V.
  • Síntoma: El LED parpadea cuando acercas la mano al circuito.
    • Causa: Las entradas están flotantes. Los chips CMOS tienen entradas muy sensibles.
    • Solución: Revisa las conexiones de R1 y R2. Asegúrate de que conectan de forma segura los nodos VA y VB a tierra cuando los interruptores están abiertos.

Posibles mejoras y extensiones

  1. Integración de alerta audible: Añade un zumbador piezoeléctrico activo de 5 V en paralelo con la combinación LED/resistencia (conectando el cable positivo del zumbador a VOUT y el cable negativo al nodo 0) para proporcionar una alarma tanto visual como audible.
  2. Expansión a una alarma de 3 entradas: Utiliza una segunda puerta OR dentro del mismo chip 74HC32. Conecta VOUT al Pin 4 (2 A), un tercer conjunto de interruptor/pull-down al Pin 5 (2B), y usa el Pin 6 (2Y) para controlar el LED, creando un sistema que monitoree tres zonas distintas.

Más Casos Prácticos en Prometeo.blog

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Cuál es el objetivo principal del circuito descrito en el artículo?




Pregunta 2: ¿Qué componente lógico principal se utiliza en este caso práctico?




Pregunta 3: ¿Qué representan las dos señales de entrada independientes en el circuito?




Pregunta 4: ¿Qué sucede con el LED si ambos interruptores están abiertos (0 V en las entradas)?




Pregunta 5: ¿Qué ocurre en la salida si se cierra el interruptor local (5 V en la primera entrada)?




Pregunta 6: En un sistema de seguridad, ¿cómo se aplica la lógica de este circuito?




Pregunta 7: ¿Cuál es un ejemplo de uso de este circuito en seguridad industrial?




Pregunta 8: En monitoreo ambiental, ¿qué sensores podrían activar esta advertencia unificada?




Pregunta 9: ¿Qué voltaje se aplica a una entrada cuando se cierra uno de los interruptores?




Pregunta 10: ¿Bajo qué condición se encenderá el LED de alerta en este sistema?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:


Caso práctico: Timbre de llamada de enfermería

Prototipo de Timbre de llamada de enfermería (Maker Style)

Nivel: Básico – Implementar una compuerta OR para activar una alerta desde dos interruptores independientes.

Objetivo y caso de uso

Construirá un circuito básico de llamada de enfermería utilizando una compuerta OR digital para activar una alerta visual cuando se presione cualquiera de los dos interruptores de las camas de los pacientes.

Por qué es útil:
* Permite el monitoreo centralizado de múltiples puntos de activación independientes.
* Demuestra cómo la lógica digital básica simplifica los sistemas de alarma en paralelo sin necesidad de cablear de forma cruzada los interruptores físicos.
* Forma la base para sistemas de timbres de llamada o de seguridad más grandes y complejos.

Resultado esperado:
* Al presionar el interruptor A, la salida cambia a nivel ALTO (cerca de 5 V), encendiendo el LED.
* Al presionar el interruptor B, la salida cambia a nivel ALTO (cerca de 5 V), encendiendo el LED.
* Al presionar ambos interruptores simultáneamente, la salida cambia a nivel ALTO, encendiendo el LED.
* La salida se mantiene en nivel BAJO (0 V) y el LED permanece apagado cuando no se presiona ningún interruptor.

Público objetivo y nivel: Principiantes que aprenden sobre compuertas lógicas digitales y la importancia de las redes pull-down.

Materiales

  • V1: Fuente de alimentación de 5 V CC
  • U1: CI 74HC32 con cuatro compuertas OR de 2 entradas
  • SW1: Interruptor de botón pulsador, normalmente abierto, función: Activador de la cama A
  • SW2: Interruptor de botón pulsador, normalmente abierto, función: Activador de la cama B
  • R1: Resistencia de 10 kΩ, función: pull-down para VA
  • R2: Resistencia de 10 kΩ, función: pull-down para VB
  • R3: Resistencia de 330 Ω, función: limitadora de corriente para el LED
  • D1: LED rojo, función: indicador de alerta

Pin-out del CI utilizado

74HC32 (Cuatro compuertas OR de 2 entradas)

Pin Nombre Función lógica Conexión en este caso
1 1 A Entrada 1 para la Compuerta 1 Nodo VA (Interruptor A)
2 1B Entrada 2 para la Compuerta 1 Nodo VB (Interruptor B)
3 1Y Salida de la Compuerta 1 Nodo VOUT (al circuito del LED)
7 GND Tierra Nodo 0
14 VCC Fuente de alimentación Nodo VCC

(Nota: Los pines 4, 5, 8, 9, 10, 11, 12 y 13 son entradas no utilizadas y deben conectarse a Tierra en un circuito permanente para prevenir el efecto latch-up en CMOS).

Guía de conexionado

  • V1: el terminal positivo se conecta a VCC; el terminal negativo se conecta a 0.
  • SW1: se conecta entre VCC y VA.
  • SW2: se conecta entre VCC y VB.
  • R1: se conecta entre VA y 0.
  • R2: se conecta entre VB y 0.
  • U1 (pin 14): se conecta a VCC.
  • U1 (pin 7): se conecta a 0.
  • U1 (pin 1): se conecta a VA.
  • U1 (pin 2): se conecta a VB.
  • U1 (pin 3): se conecta a VOUT.
  • R3: se conecta entre VOUT y el ánodo de D1.
  • D1: el cátodo se conecta a 0.

Diagrama de bloques conceptual

Conceptual block diagram — 74HC32 OR gate
Lectura rápida: entradas → bloque principal → salida (actuador o medida). Resume el esquemático ASCII de la siguiente sección.

Esquemático

VCC --> [ SW1: Bed A ] --(VA)--> [ R1: 10 kΩ Pull-down ] --> GND
                             \
                              -->(Pin 1) \
                                          [ U1: 74HC32 OR Gate ] --(VOUT, Pin 3)--> [ R3: 330 Ω ] --> [ D1: Red LED ] --> GND
                                          /
                              -->(Pin 2) /
                             /
VCC --> [ SW2: Bed B ] --(VB)--> [ R2: 10 kΩ Pull-down ] --> GND
Esquema Eléctrico

Tabla de verdad

Entrada A (VA) Entrada B (VB) Salida Y (VOUT) Estado del LED
0 (BAJO) 0 (BAJO) 0 (BAJO) APAGADO
0 (BAJO) 1 (ALTO) 1 (ALTO) ENCENDIDO
1 (ALTO) 0 (BAJO) 1 (ALTO) ENCENDIDO
1 (ALTO) 1 (ALTO) 1 (ALTO) ENCENDIDO


Mediciones y pruebas

  1. Verificación de alimentación: Mida el voltaje entre VCC y 0 usando un multímetro para asegurarse de que sea exactamente 5 V.
  2. Prueba en estado de reposo: Sin presionar ningún botón, mida el voltaje en los nodos VA y VB. Ambos deben marcar exactamente 0 V. El nodo VOUT también debe marcar 0 V.
  3. Prueba de nivel ALTO lógico: Mantenga presionado SW1. Mida el nodo VA (debe ser ~5 V) y mida el nodo VOUT (debe ser ~5 V). Verifique que el LED esté ENCENDIDO. Repita este proceso para SW2 y el nodo VB.
  4. Medición de corriente (Opcional): Coloque su multímetro en serie con R3 y D1 para medir la corriente directa del LED (debería ser de aproximadamente 8-10 mA dependiendo de la caída de voltaje directo del LED).

Netlist SPICE y simulación

Netlist SPICE de referencia (ngspice) — extractoNetlist SPICE completo (ngspice)

* Practical case: Nurse call bell
.width out=256

* Power Supply
V1 VCC 0 DC 5

* Bed A Trigger (SW1)
* Modeled as a voltage-controlled switch activated by a pulse to simulate a user pressing the button
VctrlA ctrlA 0 PULSE(0 5 10u 1u 1u 40u 100u)
S1 VCC VA ctrlA 0 my_switch

* Bed B Trigger (SW2)
* Modeled as a voltage-controlled switch activated by a pulse to simulate a user pressing the button
VctrlB ctrlB 0 PULSE(0 5 10u 1u 1u 90u 200u)
S2 VCC VB ctrlB 0 my_switch

* Pull-down resistors for switch inputs
R1 VA 0 10k
R2 VB 0 10k

* ... (truncated in public view) ...

Copia este contenido en un archivo .cir y ejecútalo con ngspice.

* Practical case: Nurse call bell
.width out=256

* Power Supply
V1 VCC 0 DC 5

* Bed A Trigger (SW1)
* Modeled as a voltage-controlled switch activated by a pulse to simulate a user pressing the button
VctrlA ctrlA 0 PULSE(0 5 10u 1u 1u 40u 100u)
S1 VCC VA ctrlA 0 my_switch

* Bed B Trigger (SW2)
* Modeled as a voltage-controlled switch activated by a pulse to simulate a user pressing the button
VctrlB ctrlB 0 PULSE(0 5 10u 1u 1u 90u 200u)
S2 VCC VB ctrlB 0 my_switch

* Pull-down resistors for switch inputs
R1 VA 0 10k
R2 VB 0 10k

* U1: 74HC32 quad 2-input OR gate IC (using 1 gate)
* Wiring: Pin 1 -> VA, Pin 2 -> VB, Pin 3 -> VOUT, Pin 14 -> VCC, Pin 7 -> 0
XU1 VA VB VOUT VCC 0 74HC32_OR

* Alert Indicator (LED and current limiting resistor)
R3 VOUT D1_A 330
D1 D1_A 0 DLED

* --- Models and Subcircuits ---

* Ideal switch model
.model my_switch SW(vt=2.5 vh=0.5 ron=1 roff=100MEG)

* Generic Red LED model
.model DLED D(IS=1e-20 N=2.2 RS=2)

* Behavioral model for a 74HC32 OR gate (Continuous functions for robust convergence)
.subckt 74HC32_OR A B Y VCC GND
RinA A GND 10MEG
RinB B GND 10MEG
* OR Logic: V_out = VCC * (1 - (1-A)*(1-B)) implemented with sigmoids
B1 Y_int GND V = V(VCC) * (1 - (1 - 1/(1+exp(-50*(V(A)-2.5)))) * (1 - 1/(1+exp(-50*(V(B)-2.5)))))
Rout Y_int Y 10
.ends

* --- Analysis Directives ---

.tran 1u 250u
.print tran V(VA) V(VB) V(VOUT) V(D1_A)
.op
.end

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The transient analysis spans 0 s to 250 us and captures the switching interval. Main ranges: v(vout) -1.01e-29 uV -> 4.92 V; v(va) 499 uV -> 5 V; v(vb) 499 uV -> 5 V.
Show raw data table (354 rows)
Index   time            v(va)           v(vb)           v(vout)         v(d1_a)
0	0.000000e+00	4.994506e-04	4.994506e-04	-1.00582e-35	-3.41977e-34
1	1.000000e-08	4.994506e-04	4.994506e-04	-6.04520e-52	-2.05537e-50
2	2.000000e-08	4.994506e-04	4.994506e-04	6.045198e-52	2.055367e-50
3	4.000000e-08	4.994506e-04	4.994506e-04	1.816637e-67	6.176631e-66
4	8.000000e-08	4.994506e-04	4.994506e-04	-7.26682e-68	-2.47066e-66
5	1.600000e-07	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
6	3.200000e-07	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
7	6.400000e-07	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
8	1.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
9	2.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
10	3.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
11	4.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
12	5.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
13	6.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
14	7.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
15	8.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
16	9.280000e-06	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
17	1.000000e-05	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
18	1.010000e-05	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
19	1.030000e-05	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
20	1.035875e-05	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
21	1.046156e-05	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
22	1.049002e-05	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
23	1.053982e-05	4.994506e-04	4.994506e-04	-1.94609e-72	-1.94609e-72
... (330 more rows) ...


Netlist SPICE de referencia (ngspice)

* Practical case: Nurse call bell
.width out=256

* Power Supply
V1 VCC 0 DC 5

* Bed A Trigger (SW1)
* Modeled as a voltage-controlled switch activated by a pulse to simulate a user pressing the button
VctrlA ctrlA 0 PULSE(0 5 10u 1u 1u 40u 100u)
S1 VCC VA ctrlA 0 my_switch

* Bed B Trigger (SW2)
* Modeled as a voltage-controlled switch activated by a pulse to simulate a user pressing the button
VctrlB ctrlB 0 PULSE(0 5 10u 1u 1u 90u 200u)
S2 VCC VB ctrlB 0 my_switch

* Pull-down resistors for switch inputs
R1 VA 0 10k
R2 VB 0 10k

* U1: 74HC32 quad 2-input OR gate IC (using 1 gate)
* Wiring: Pin 1 -> VA, Pin 2 -> VB, Pin 3 -> VOUT, Pin 14 -> VCC, Pin 7 -> 0
XU1 VA VB VOUT VCC 0 74HC32_OR

* Alert Indicator (LED and current limiting resistor)
R3 VOUT D1_A 330
D1 D1_A 0 DLED

* --- Models and Subcircuits ---

* Ideal switch model
.model my_switch SW(vt=2.5 vh=0.5 ron=1 roff=100MEG)

* Generic Red LED model
.model DLED D(IS=1e-20 N=2.2 RS=2)

* Behavioral model for a 74HC32 OR gate (Continuous functions for robust convergence)
.subckt 74HC32_OR A B Y VCC GND
RinA A GND 10MEG
RinB B GND 10MEG
* OR Logic: V_out = VCC * (1 - (1-A)*(1-B)) implemented with sigmoids
B1 Y_int GND V = V(VCC) * (1 - (1 - 1/(1+exp(-50*(V(A)-2.5)))) * (1 - 1/(1+exp(-50*(V(B)-2.5)))))
Rout Y_int Y 10
.ends

* --- Analysis Directives ---

.tran 1u 250u
.print tran V(VA) V(VB) V(VOUT) V(D1_A)
.op
.end

Resultados de Simulación (Transitorio)

Resultados de Simulación (Transitorio)
Análisis: The transient analysis spans 0 s to 250 us and captures the switching interval. Main ranges: v(vout) -1.01e-29 uV -> 4.92 V; v(va) 499 uV -> 5 V; v(vb) 499 uV -> 5 V.

Errores comunes y cómo evitarlos

  • Entradas flotantes: Olvidar las resistencias pull-down (R1 y R2). Sin ellas, el voltaje en las entradas de la compuerta flotará cuando los interruptores estén abiertos, causando una activación aleatoria e impredecible de la alarma.
  • Omitir las conexiones de alimentación al CI: Olvidar conectar los pines 7 y 14 a Tierra y VCC, respectivamente. La compuerta lógica no puede funcionar sin su propia fuente de alimentación.
  • Dejar entradas CMOS no utilizadas flotando: El 74HC32 es un dispositivo CMOS. Cualquier pin de entrada no utilizado (por ejemplo, los pines 4, 5, 9, 10, 12, 13) debe conectarse a Tierra (0) para evitar un consumo excesivo de energía o un comportamiento errático.


Solución de problemas

  • Síntoma: El LED permanece ENCENDIDO constantemente, incluso cuando no se presiona ningún botón.
  • Causa: Falta una de las resistencias pull-down (R1 o R2) o no está conectada correctamente a tierra.
  • Solución: Verifique la conexión de las resistencias entre las entradas VA o VB y el nodo 0.
  • Síntoma: El LED nunca se ENCIENDE.
  • Causa: El LED está instalado al revés, falta VCC/GND en el CI, o la resistencia R3 está desconectada.
  • Solución: Verifique la polaridad del LED (el lado plano / pata más corta va al nodo 0). Asegúrese de que los pines 7 y 14 de U1 tengan alimentación.
  • Síntoma: El LED se ENCIENDE aleatoriamente cuando mi mano está cerca de la protoboard.
  • Causa: El circuito está experimentando una «entrada flotante» que actúa como una antena captando capacitancia parásita.
  • Solución: Revise sus resistencias pull-down. Asegúrese de que conecten firmemente los pines de entrada a tierra.
  • Síntoma: La salida está en nivel ALTO lógico (medido en el pin 3), pero el LED brilla de forma extremadamente tenue.
  • Causa: La resistencia limitadora de corriente R3 es demasiado grande (por ejemplo, 10 kΩ en lugar de 330 Ω).
  • Solución: Reemplace R3 con el valor correcto de 330 Ω.

Posibles mejoras y extensiones

  • Añadir una alerta audible: Conecte un zumbador activo de 5 V en paralelo con la combinación de LED/resistencia para que al activar el interruptor se produzca tanto luz como sonido.
  • Implementar un circuito de enclavamiento (latch): En un hospital real, la luz debe permanecer ENCENDIDA hasta que una enfermera llegue para restablecerla. Alimente la salida de la compuerta OR al pin SET de un Latch SR (o use compuertas lógicas para construir uno), y agregue un tercer botón de «Reinicio» en la estación de enfermería.

Más Casos Prácticos en Prometeo.blog

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Cuál es el objetivo principal del circuito descrito en el artículo?




Pregunta 2: ¿Qué tipo de compuerta lógica se utiliza en este circuito?




Pregunta 3: ¿Qué sucede cuando se presiona únicamente el interruptor A?




Pregunta 4: ¿Qué ocurre si no se presiona ningún interruptor?




Pregunta 5: ¿Cuál es el voltaje aproximado cuando la salida está en nivel ALTO?




Pregunta 6: ¿Qué pasa si se presionan ambos interruptores simultáneamente?




Pregunta 7: ¿Por qué es útil este tipo de circuito en un entorno médico?




Pregunta 8: ¿Qué ventaja ofrece la lógica digital básica en este sistema de alarma?




Pregunta 9: ¿Qué componente se utiliza como alerta visual en este circuito?




Pregunta 10: ¿Para qué tipo de sistemas más grandes sirve de base este circuito?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:


Caso práctico: Ventilación de invernadero con ESP32

Caso práctico: Ventilación de invernadero con ESP32 — hero

Objetivo y caso de uso

Qué construirás: Un servomecanismo controlado por web local que regula la ventilación de un modelo de invernadero. Integra un interruptor de límite para un posicionamiento mecánico preciso en cero para evitar que el motor se atasque y garantizar un accionamiento preciso.

Por qué es importante / Casos de uso

  • Control climático automatizado: Demuestra la capa de accionamiento físico requerida para liberar el exceso de calor y humedad en entornos agrícolas del mundo real.
  • Seguridad de bucle cerrado: La integración del interruptor de límite evita comandos ciegos de bucle abierto, evitando corrientes de bloqueo >1A y rechineo mecánico si los enlaces se deslizan.
  • Control de red local: El ESP32 actúa como un SoftAP, proporcionando control directo desde el teléfono inteligente con una latencia <50ms sin requerir un enrutador externo o una conexión a internet activa.
  • Gestión de estado asíncrona: Los barridos de servo no bloqueantes garantizan que el servidor web procese continuamente solicitudes de clientes concurrentes sin retrasos de ejecución o tiempos de espera agotados.

Resultado esperado

  • Un Punto de Acceso WiFi local activo llamado ESP32-Greenhouse transmitido por el ESP32.
  • Un panel web responsivo accesible en 192.168.4.1 para ordenar ángulos de ventilación específicos (0° a 90°).
  • Retorno a la posición de origen (homing) mecánico automático que calibra de manera confiable la ventilación a una posición 0 física al iniciar o reiniciar el sistema.

Audiencia: Desarrolladores de IoT, Ingenieros AgTech; Nivel: Intermedio

Arquitectura/flujo: Cliente Web (Teléfono inteligente) → ESP32 SoftAP (Servidor Web Asíncrono) → Control PWM → Servomotor ↔ Interruptor de límite (Retroalimentación GPIO).

Nota educativa de validación

Antes de publicar este caso, el contenido pasó la puerta automática de validación de Prometeo con estado PASS. Para este perfil ESP32 DevKitC, el proyecto se comprobó como proyecto PlatformIO: el validador extrajo platformio.ini y src/main.cpp, creó un proyecto temporal y ejecutó pio run contra platform = espressif32, board = esp32dev y framework = arduino. También revisó la estructura del artículo, que los comandos sean copiables con guiones ASCII, y que no aparezcan stacks no soportados como ESP-IDF directo o placas ESP32 no acotadas.

Evidencia de validación publicada

  • Resultado automático: PASS.
  • Estructura parseada: 4 apartados, 2 tablas y 2 bloques de código detectados antes de publicar.
  • Código comprobado: 1 PlatformIO config + 1 ESP32 source/pio run.
  • Catálogo soportado: el texto se contrastó contra los perfiles de dispositivo validables de Prometeo y los stacks no soportados bloquean la publicación.
  • Hallazgos del informe: sin hallazgos bloqueantes.

Esta validación confirma compatibilidad sintáctica y de herramientas para el código publicado, pero no sustituye la prueba física sobre tu placa ESP32 DevKitC exacta, tu cableado, alimentación y entorno WiFi local.

Nota educativa de seguridad

Este proyecto es un prototipo educativo de bajo voltaje, no un producto certificado. Antes de encender la configuración, verifique la distribución de pines de su placa ESP32 DevKitC exacta, mantenga las señales GPIO dentro de los límites de 3.3 V, nunca aplique 5 V a las entradas del ESP32, desconecte la alimentación antes de cambiar el cableado y use fuentes externas adecuadas para relés, motores o cargas, compartiendo GND solo cuando el esquema lo requiera.

Diagrama de bloques conceptual

Vista de alto nivel: qué entra, qué procesa cada bloque y qué sale del sistema.

Arquitectura funcional

Botón local

ESP32 BLE

Paquete advertising

LED de estado

Móvil escáner

Flujo conceptual: configuración local, emisión BLE y lectura desde el móvil.

Ruta de validación

Código fuente

PlatformIO build

Flash

Monitor serie

Resumen conceptual de las herramientas usadas para comprobar el proyecto ESP32 publicado.

Requisitos previos

Antes de comenzar este tutorial, asegúrese de tener listo lo siguiente:
* Software: Visual Studio Code con la extensión PlatformIO IDE instalada.
* Conocimientos: Familiaridad básica con la sintaxis de C++, conceptos de GPIO del ESP32 (PWM y Entradas Digitales) y navegación por la interfaz de PlatformIO.
* Herramientas: Un cable micro-USB o USB-C (dependiendo de su variante específica de ESP32 DevKitC) capaz de transferir tanto energía como datos.

Materiales

Para completar este proyecto, necesitará exactamente este modelo de dispositivo y los componentes que lo acompañan:
* ESP32 DevKitC + servo SG90 + interruptor de límite + panel web local (El panel se implementa por software).
* ESP32 DevKitC V4: El microcontrolador central que proporciona capacidades WiFi, generación de PWM y alojamiento del servidor web.
* Micro Servo SG90: Un servomotor estándar de engranajes de plástico de 9g para accionar la ventilación del prototipo.
* Micro interruptor de límite (SPDT o SPST): Un interruptor mecánico con un brazo de palanca utilizado para detectar cuándo la ventilación está completamente cerrada.
* Cables puente (Jumper): Hembra-Hembra o Macho-Hembra dependiendo de la configuración de su protoboard.
* Protoboard (Opcional pero recomendada): Para conexiones seguras entre el ESP32 y los componentes periféricos.

Configuración y conexión

El cableado adecuado es crítico. El ESP32 funciona con una lógica de 3.3V, pero el servo SG90 requiere 5V para un funcionamiento confiable. Utilizaremos el pin 5V (o VIN) en el ESP32 DevKitC, que extrae energía directamente de la conexión USB.

El interruptor de límite se conectará utilizando la resistencia pull-up interna del ESP32. Esto significa que solo necesitamos conectar el interruptor entre el pin GPIO y Tierra (Ground). Cuando el interruptor no está presionado, el pin lee HIGH. Cuando se presiona, se conecta a Tierra y lee LOW.

Tabla de asignación de pines

Componente Pin del componente / Color del cable Pin del ESP32 DevKitC Descripción
Servo SG90 Marrón (o Negro) GND Tierra común (Ground)
Servo SG90 Rojo 5V / VIN Fuente de alimentación de 5V
Servo SG90 Naranja (o Amarillo) GPIO 13 Señal de control PWM
Interruptor de límite Común (COM) GND Tierra común (Ground)
Interruptor de límite Normalmente Abierto (NO) GPIO 14 Entrada Digital (Activo LOW)

Nota sobre el cableado del interruptor de límite: Asegúrese de usar el terminal Normalmente Abierto (NO). El circuito se completa (el pin cambia a LOW) solo cuando la ventilación presiona físicamente el brazo del interruptor.

Código validado

El proyecto requiere dos archivos dentro de la estructura de su proyecto PlatformIO: el archivo de configuración (platformio.ini) y el archivo de código fuente principal (src/main.cpp).

platformio.ini

Este archivo configura el entorno de compilación, especifica el framework del ESP32 y descarga automáticamente la biblioteca del servo requerida.

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
; We use the widely supported ESP32Servo library by Kevin Harrington
lib_deps = 
    madhephaestus/ESP32Servo @ ^3.0.5

src/main.cpp

Este archivo contiene la lógica completa para el WiFi SoftAP, el servidor web, el panel HTML y el bucle de control electromecánico.

Vista pública parcial del archivo validado. El código completo se muestra a miembros y en PDF/Print.

#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>

// Pin Definitions
const int SERVO_PIN = 13;
const int LIMIT_SWITCH_PIN = 14;

// Global Objects
Servo ventServo;
WebServer server(80);

// State Variables
int currentAngle = 0;
String ventState = "Closed";

// WiFi Access Point Credentials
const char* ssid = "ESP32-Greenhouse";
const char* password = "password123"; // Minimum 8 characters

// HTML Dashboard (Stored in Flash Memory)
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Greenhouse Vent Controller</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; background-color: #f4f7f6; }
        h1 { color: #2c3e50; }
        .status { font-size: 1.5em; margin: 20px 0; padding: 10px; background: #fff; border-radius: 8px; display: inline-block; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
        .btn { padding: 15px 30px; font-size: 1.2em; margin: 10px; cursor: pointer; border: none; border-radius: 5px; color: white; transition: background 0.3s; }
        .btn-open { background-color: #27ae60; }
        .btn-open:hover { background-color: #2ecc71; }
        .btn-close { background-color: #c0392b; }
        .btn-close:hover { background-color: #e74c3c; }
    </style>
    <script>
        function sendCommand(action) {
            document.getElementById("status-text").innerText = "Moving...";
            fetch('/' + action)
                .then(response => response.text())
                .then(state => {
                    document.getElementById("status-text").innerText = state;
                })
                .catch(err => {
                    document.getElementById("status-text").innerText = "Error connecting to ESP32";
                });
        }

        function updateStatus() {
            fetch('/status')
                .then(response => response.text())
                .then(state => {
                    document.getElementById("status-text").innerText = state;
                });
        }

        // Poll status every 5 seconds to keep dashboard synced
        setInterval(updateStatus, 5000);
    </script>
</head>
<body onload="updateStatus()">
    <h1>Greenhouse Vent Controller</h1>
    <div class="status">Current Status: <strong id="status-text">Loading...</strong></div>
    <br>
    <button class="btn btn-open" onclick="sendCommand('open')">Open Vent (90&deg;)</button>
    <button class="btn btn-close" onclick="sendCommand('close')">Close Vent (0&deg;)</button>
</body>
</html>
)rawliteral";

// --- Motor Control Functions ---

void openVent() {
    Serial.println("Command Received: Open Vent");
    ventState = "Opening...";

    // Smooth sweep to 90 degrees
    for (int pos = currentAngle; pos <= 90; pos++) {
        ventServo.write(pos);
        currentAngle = pos;
        delay(15); 
    }
// ...

#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>

// Pin Definitions
const int SERVO_PIN = 13;
const int LIMIT_SWITCH_PIN = 14;

// Global Objects
Servo ventServo;
WebServer server(80);

// State Variables
int currentAngle = 0;
String ventState = "Closed";

// WiFi Access Point Credentials
const char* ssid = "ESP32-Greenhouse";
const char* password = "password123"; // Minimum 8 characters

// HTML Dashboard (Stored in Flash Memory)
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Greenhouse Vent Controller</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; background-color: #f4f7f6; }
        h1 { color: #2c3e50; }
        .status { font-size: 1.5em; margin: 20px 0; padding: 10px; background: #fff; border-radius: 8px; display: inline-block; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
        .btn { padding: 15px 30px; font-size: 1.2em; margin: 10px; cursor: pointer; border: none; border-radius: 5px; color: white; transition: background 0.3s; }
        .btn-open { background-color: #27ae60; }
        .btn-open:hover { background-color: #2ecc71; }
        .btn-close { background-color: #c0392b; }
        .btn-close:hover { background-color: #e74c3c; }
    </style>
    <script>
        function sendCommand(action) {
            document.getElementById("status-text").innerText = "Moving...";
            fetch('/' + action)
                .then(response => response.text())
                .then(state => {
                    document.getElementById("status-text").innerText = state;
                })
                .catch(err => {
                    document.getElementById("status-text").innerText = "Error connecting to ESP32";
                });
        }

        function updateStatus() {
            fetch('/status')
                .then(response => response.text())
                .then(state => {
                    document.getElementById("status-text").innerText = state;
                });
        }

        // Poll status every 5 seconds to keep dashboard synced
        setInterval(updateStatus, 5000);
    </script>
</head>
<body onload="updateStatus()">
    <h1>Greenhouse Vent Controller</h1>
    <div class="status">Current Status: <strong id="status-text">Loading...</strong></div>
    <br>
    <button class="btn btn-open" onclick="sendCommand('open')">Open Vent (90&deg;)</button>
    <button class="btn btn-close" onclick="sendCommand('close')">Close Vent (0&deg;)</button>
</body>
</html>
)rawliteral";

// --- Motor Control Functions ---

void openVent() {
    Serial.println("Command Received: Open Vent");
    ventState = "Opening...";

    // Smooth sweep to 90 degrees
    for (int pos = currentAngle; pos <= 90; pos++) {
        ventServo.write(pos);
        currentAngle = pos;
        delay(15); 
    }

    ventState = "Open (90 degrees)";
    Serial.println("Vent is fully open.");
}

void closeVent() {
    Serial.println("Command Received: Close Vent");
    ventState = "Closing...";

    // Smooth sweep towards 0 degrees, monitoring the limit switch
    for (int pos = currentAngle; pos >= 0; pos--) {
        // Check if limit switch is pressed (Active LOW)
        if (digitalRead(LIMIT_SWITCH_PIN) == LOW) {
            Serial.println("Limit switch triggered! Mechanical zero reached.");
            currentAngle = pos; // Update current angle to actual stopped position
            ventState = "Closed (Limit Switch Triggered)";
            return; // Exit the loop immediately
        }

        ventServo.write(pos);
        currentAngle = pos;
        delay(15);
    }

    ventState = "Closed (0 degrees reached without switch)";
    Serial.println("Vent closed to 0 degrees.");
}

// --- Web Server Handlers ---

void handleRoot() {
    server.send(200, "text/html", index_html);
}

void handleOpen() {
    openVent();
    server.send(200, "text/plain", ventState);
}

void handleClose() {
    closeVent();
    server.send(200, "text/plain", ventState);
}

void handleStatus() {
    server.send(200, "text/plain", ventState);
}

// --- Main Setup and Loop ---

void setup() {
    Serial.begin(115200);
    Serial.println("\n--- ESP32 Greenhouse Vent Controller ---");

    // Initialize Limit Switch with internal pull-up
    pinMode(LIMIT_SWITCH_PIN, INPUT_PULLUP);

    // Initialize Servo
    // SG90 requires a 50Hz PWM signal. Standard pulse width is 500us to 2400us.
    ventServo.setPeriodHertz(50);
    ventServo.attach(SERVO_PIN, 500, 2400);

    // Initial calibration: Ensure vent is closed on startup
    Serial.println("Performing initial calibration...");
    closeVent();

    // Setup WiFi Access Point
    Serial.println("Starting WiFi Access Point...");
    WiFi.softAP(ssid, password);
    IPAddress IP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(IP);

    // Bind Web Server Routes
    server.on("/", handleRoot);
    server.on("/open", handleOpen);
    server.on("/close", handleClose);
    server.on("/status", handleStatus);

    // Start Web Server
    server.begin();
    Serial.println("HTTP server started.");
}

void loop() {
    // Listen for incoming HTTP requests
    server.handleClient();

    // Small delay to yield to the underlying RTOS tasks
    delay(2);
}

Compilar, flashear y ejecutar

Para compilar el código y subirlo a su ESP32 DevKitC, use la CLI de PlatformIO Core. Puede abrir un nuevo terminal en VS Code (Terminal -> New Terminal) y ejecutar los siguientes comandos.

Tabla de comandos

Acción Comando Propósito
Compilar pio run Compila el código C++ y descarga la biblioteca ESP32Servo.
Flashear pio run --target upload Sube el firmware compilado al ESP32 conectado.
Monitorizar pio device monitor Abre el monitor serie para ver la IP y los registros de depuración.

Flujo de trabajo

  1. Conecte el ESP32 DevKitC a su computadora a través de USB.
  2. Abra el terminal de la CLI de PlatformIO.
  3. Ejecute pio run para verificar que no haya errores de sintaxis y que la biblioteca se descargue correctamente.
  4. Ejecute pio run --target upload para flashear el dispositivo. Nota: En algunas placas DevKitC más antiguas, es posible que deba mantener presionado el botón «BOOT» cuando el terminal muestre Connecting....
  5. Ejecute pio device monitor para observar la secuencia de inicio y recuperar la dirección IP del SoftAP.

Validación paso a paso

Siga estos puntos de control agrupados para verificar que el sistema opera de acuerdo con el objetivo.

1. Inicialización de hardware

  • Acción: Observe el servo inmediatamente después de presionar el botón EN (Reset) en el ESP32.
  • Observación esperada: El servo debería intentar moverse hacia los 0 grados.
  • Condición de aprobación: El monitor serie muestra «Performing initial calibration…» seguido de la finalización de la rutina closeVent().

2. Conectividad de red

  • Acción: Abra la configuración WiFi en su teléfono inteligente o computadora portátil y busque redes.
  • Observación esperada: Una red llamada ESP32-Greenhouse es visible.
  • Condición de aprobación: Puede conectarse a la red utilizando la contraseña password123.

3. Accesibilidad al panel (dashboard)

  • Acción: Abra un navegador web y navegue a http://192.168.4.1.
  • Observación esperada: El panel «Greenhouse Vent Controller» se carga con dos botones y un indicador de estado.
  • Condición de aprobación: El indicador de estado obtiene correctamente el estado actual (por ejemplo, «Closed (Limit Switch Triggered)» o «Closed (0 degrees reached without switch)»).

4. Accionamiento de bucle abierto (Apertura)

  • Acción: Haga clic en el botón «Open Vent (90°)» en el panel.
  • Observación esperada: El servo realiza un barrido suave hacia la posición de 90 grados. El estado del panel se actualiza a «Moving…» y luego a «Open (

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Qué se construirá según el texto?




Pregunta 2: ¿Cuál es el propósito de integrar un interruptor de límite en el sistema?




Pregunta 3: ¿Qué problema físico previene la seguridad de bucle cerrado?




Pregunta 4: ¿Qué demuestra el control climático automatizado en este caso de uso?




Pregunta 5: ¿Cómo opera el ESP32 dentro de la red local?




Pregunta 6: ¿Cuál es la latencia de control directo desde el teléfono inteligente?




Pregunta 7: ¿Qué tipo de conexión a internet requiere el sistema para funcionar?




Pregunta 8: ¿Qué técnica se utiliza para la gestión de estado asíncrona?




Pregunta 9: ¿Qué ventaja ofrece la gestión de estado asíncrona al servidor web?




Pregunta 10: ¿Qué tipo de comandos evita el uso del interruptor de límite?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:
¿Quiénes somos?