#include <LiquidCrystal_PCF8574.h>
LiquidCrystal_PCF8574 lcd(0x27);
#define PIN_I0 18
#define PIN_I1 19
#define PIN_I2 23
#define I0 !digitalRead(PIN_I0)
#define I1 !digitalRead(PIN_I1)
#define I2 !digitalRead(PIN_I2)
#define Q0 15
#define Q1 2
#define Q2 5
char texto[] = "I/O digitales";
byte alto [] = {
0b0000,
0b1111,
0b1111,
0b1111,
0b1111,
0b1111,
0b1111,
0b0000
};
byte bajo [] = {
0b0000,
0b1111,
0b1001,
0b1001,
0b1001,
0b1001,
0b1111,
0b0000
};
void setup() {
pinMode(PIN_I0, INPUT_PULLUP);
pinMode(PIN_I1, INPUT_PULLUP);
pinMode(PIN_I2, INPUT_PULLUP);
pinMode(Q0, OUTPUT);
pinMode(Q1, OUTPUT);
pinMode(Q2, OUTPUT);
lcd.begin(20, 4);
lcd.createChar(0, bajo);
lcd.createChar(1, alto);
delay(200);
lcd.setBacklight(255);
}
void loop() {
estados();
digitalWrite(Q0, I0);
digitalWrite(Q1, I1);
digitalWrite(Q2, I2);
}
void estados() {
lcd.setCursor(0,0);
lcd.print(texto);
lcd.setCursor(0,1);
lcd.print("I: ");
lcd.write(I0);
lcd.write(I1);
lcd.write(I2);
lcd.setCursor(0,2);
lcd.print(" 012");
lcd.setCursor(0,3);
lcd.print("Q: ");
lcd.write(digitalRead(Q0));
lcd.write(digitalRead(Q1));
lcd.write(digitalRead(Q2));
}
/*
Para usar correctamente los pines de un ESP32 (modelo estándar WROOM-32), es fundamental
dividirlos por sus capacidades físicas:
1. ¿Qué pines puedes usar con INPUT_PULLUP?
Casi todos los pines que pueden funcionar como salida tienen resistencias pull-up y pull-down
internas configurables mediante código.
Pines compatibles: GPIO 0, 2, 4, 5, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32 y 33.
2. ¿A qué GPIO hay que ponerle resistor Pull-up externo?
Existen pines llamados GPI (Input Only) que no tienen circuitería interna para pull-up o pull-down.
Si quieres usarlos con un botón o sensor que necesite un estado definido, debes añadir una
resistencia externa (usualmente de 10kΩ) a 3.3V.
Pines solo entrada (requieren resistencia externa):
GPIO 34
GPIO 35
GPIO 36 (VP)
GPIO 39 (VN)
(Nota: Los pines 37 y 38 a veces no están expuestos en las placas de desarrollo, pero también son solo entrada).
3. ¿En qué pines puedo conectar un LED?
Puedes conectar un LED en cualquier pin que soporte salida digital (Output). Sin embargo, hay
algunos "mejores" que otros para evitar problemas al encender la placa.
Pines recomendados (Más seguros):
GPIO 4, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33.
Pines a evitar (o usar con precaución):
GPIO 1 y 3: Son los pines de comunicación Serial (TX/RX).[5] Si conectas algo ahí, podrías perder la
capacidad de ver el monitor serie o cargar código.
GPIO 6 a 11: Están conectados internamente a la memoria Flash.[6][7] No los uses, o el ESP32 no arrancará.
GPIO 0, 2, 5, 12, 15 (Strapping Pins): El ESP32 revisa el estado de estos pines al arrancar para decidir
si entra en modo de programación o ejecución.[8][9] Si conectas un LED con una resistencia muy baja
o un circuito complejo aquí, el ESP32 podría no encender correctamente.
El ESP32 es muy flexible porque tiene una función llamada GPIO Matrix, que permite reasignar casi cualquier
función a cualquier pin. Sin embargo, existen pines por defecto que las librerías usan siempre y pines
con funciones físicas únicas que no se pueden cambiar.
Lista de los pines específicos más importantes:
1. Comunicación I2C (Sensores, LCDs, OLEDs)
Aunque puedes moverlos, estos son los pines estándar que usan casi todas las librerías (como Wire.h):
SDA: GPIO 21
SCL: GPIO 22
2. Comunicación SPI (Pantallas TFT, Lectores SD, LoRa)
El ESP32 tiene dos buses SPI disponibles para el usuario.
El VSPI es el más común:
VSPI (Por defecto):
MOSI: GPIO 23
MISO: GPIO 19
SCK: GPIO 18
CS: GPIO 5
HSPI (Secundario):
MOSI: GPIO 13
MISO: GPIO 12
SCK: GPIO 14
CS: GPIO 15
3. Comunicación UART (Serial). El ESP32 tiene 3 puertos seriales:
UART0: GPIO 1 (TX) y GPIO 3 (RX). Se usan para programar la placa y ver el Monitor Serial. No los
uses para otros componentes si puedes evitarlo.
UART2: GPIO 17 (TX) y GPIO 16 (RX). Es el puerto ideal para conectar GPS, Bluetooth externo o sensores seriales.
UART1: Reservado internamente para la memoria flash.
4. Convertidores Digital a Analógico (DAC). A diferencia del PWM (que simula voltaje), estos pines entregan un
voltaje real variable entre 0V y 3.3V. Solo hay dos:
DAC1: GPIO 25
DAC2: GPIO 26
5. Sensores de Toque (Capacitivos). Estos pines pueden detectar si alguien los toca con el dedo, incluso a través de plástico o vidrio.
Touch0 a Touch9: GPIOs 4, 0, 2, 15, 13, 12, 14, 27, 32, 33.
6. Pines de "Solo Entrada" (GPI). Como vimos en tus códigos anteriores, estos no tienen salida y no tienen pull-up interno.
Son excelentes para ADC los GPIOs 34, 35, 36 (VP), 39 (VN).
7. Pines de Arranque (Strapping Pins). Estos pines deciden si el ESP32 arranca el código o entra en modo "flash". Si los
fuerzas a un estado distinto al encender, la placa no funcionará:
GPIO 0: Debe estar en HIGH para arrancar.
GPIO 2: Debe estar en LOW para arrancar.
GPIO 5: Debe estar en HIGH para arrancar.
GPIO 12: Debe estar en LOW para arrancar.
GPIO 15: Debe estar en HIGH para arrancar.
8. Pines "Prohibidos" (Flash Interna)
Nunca uses estos pines (del 6 al 11). Están conectados físicamente al chip de memoria donde se guarda tu código.
Si conectas algo ahí, el ESP32 se reiniciará constantemente o no encenderá: GPIO 6, 7, 8, 9, 10, 11.
Resumen de advertencias importantes:
Voltaje: El ESP32 trabaja a 3.3V. Nunca conectes 5V directamente a los pines GPIO o podrías quemarlo.
Corriente: Cada pin puede entregar unos 20mA (máximo absoluto 40mA). Siempre usa una
resistencia (ej. 220Ω o 330Ω) con tus LEDs para limitar la corriente.
Los GPIO 0, 2 y 15, se llaman "Strapping Pins". El ESP32 revisa su estado físico justo
en el microsegundo en que se enciende para decidir cómo arrancar.
Riesgos de usar INPUT_PULLUP con un pulsador en cada uno:
1. GPIO 0 (Pin crítico)
Función al arrancar: Si el GPIO 0 está en LOW al encenderse, el ESP32 entra
en "Bootloader Mode" (modo para cargar código). Si está en HIGH, arranca el programa normalmente.
El riesgo: Si por casualidad tienes el pulsador presionado (conectando a GND) justo cuando enciendes
o reseteas la placa, tu programa no va a ejecutarse. El ESP32 se quedará esperando a que le subas código nuevo.
Resistencia interna: Tiene una resistencia pull-up física en la mayoría de las placas de desarrollo, por
lo que suele leer HIGH por defecto.
2. GPIO 2 (Pin del LED interno)
Función al arrancar: Debe estar en LOW o flotando para entrar en modo de ejecución normal.
El riesgo: En muchas placas (como la DOIT DevKit V1), el GPIO 2 está conectado al LED azul incorporado.
Si activas INPUT_PULLUP, el LED podría brillar tenuemente.
Si el LED consume mucha corriente del pull-up interno, el voltaje podría bajar y darte lecturas
erróneas (LOW cuando debería ser HIGH).
Conflicto: Si intentas subir código y el GPIO 2 tiene algo conectado que lo fuerza a un estado
distinto, la subida podría fallar.
3. GPIO 15
Función al arrancar: Se usa para controlar los mensajes de depuración que salen por el puerto serial al arrancar.
El riesgo: Si lo fuerzas a un estado distinto durante el encendido, podrías silenciar los mensajes de error
del sistema, lo que hace difícil diagnosticar problemas si el ESP32 falla
Resumen de pines "Prohibidos": Evita usar del 6 al 11
*/