Manual Kit ESP32 Basico V1
Manual Kit ESP32 Basico V1
1
Entradas y salidas periféricas
2
Primeros pasos con ESP32
Para instalar la placa ESP32 en tu IDE Arduino, sigue las siguientes instrucciones:
3
Nota: si ya tiene la URL de las placas ESP8266 u otra, puede separar las URLs con
una coma de la siguiente manera:
[Link]
_index.json, [Link]
4
Compila y carga tu primer código en ESP32
El siguiente código tiene la intención de que por medio de la tarjeta ESP32 puedas
visualizar que redes de conexión WiFi están a tu alcance.
#include "WiFi.h"
void setup() {
[Link](115200);
//Se establece WiFi en modo estación y se desconectará de una AP si estaba conectado el ESP
[Link](WIFI_STA);
[Link]();
delay(100);
[Link]("Inicializacion de busqueda");
void loop() {
[Link]("Comenzando Escaneo");
int n = [Link]();
[Link]("Escaneo Finalizado");
if (n == 0) {
} else {
[Link](n);
[Link]("Redes encontradas");
5
for (int i = 0; i < n; ++i) {
[Link]("%2d", i + 1);
[Link](" | ");
[Link]("%-32.32s", [Link](i).c_str());
[Link](" | ");
[Link]("%4ld", [Link](i));
[Link](" | ");
[Link]("%2ld", [Link](i));
[Link](" | ");
switch ([Link](i)) {
default: [Link]("unknown");
[Link]();
delay(10);
[Link]("");
[Link]();
delay(5000);
6
Selecciona la tarjeta ESP32 y el puerto USB al que está conectado.
7
Tendrás visibilidad cuando selecciones el monitor serial, el cual es el siguiente icono:
La información que aparece será sobre el número de redes son las que la tarjeta ESP32 a
detectado para poder realizar una conexión Wifi
8
Problemas comunes
⚠ Si no se sube el código:
● Revisa que el driver USB esté instalado (en Windows, a veces se necesita el driver
CH340).
● Prueba a mantener pulsado el botón BOOT mientras subes el código
⚠ Errores de alimentación
● ️No conectes 5V directamente a los pines GPIO (el ESP32 funciona a 3.3V).
⚠ ️Daños en componentes
● Usa resistencias con LEDs y componentes sensibles.
9
Lección 1 Entradas y Salidas
En esta lección aprenderás a utilizar las entradas y salidas de la tarjeta ESP32 para
encender y apagar un LED utilizando un pulsador.
Materiales necesarios
● Tarjeta ESP32
● LED 5mm
● Resistencias de 10kΩ y 220Ω
● Push button
● Protoboard
● Cables Dupont Macho-Macho
Conocimientos previos
Entradas en el ESP32
Una entrada en el ESP32 es un pin que recibe señales externas, como el estado de un
botón, un sensor de temperatura, o cualquier otro dispositivo que envíe información al
microcontrolador.
Salidas en el ESP32
Una salida en el ESP32 es un pin que envía señales a otros dispositivos, como un LED, un
motor o un relé.
● Características de una salida:
● Se configuran con pinMode(PIN, OUTPUT);
10
● Pueden cambiar entre ALTO (HIGH = 3.3V) y BAJO (LOW = 0V) usando
digitalWrite(PIN, HIGH); o digitalWrite(PIN, LOW);
● Se pueden usar para encender LEDs o controlar circuitos externos.
Las resistencias pull-up y pull-down son componentes electrónicos utilizados para definir
un estado lógico estable en las entradas digitales de un microcontrolador (como el
ESP32, Arduino, etc.). Su función principal es evitar valores erráticos o indeterminados
cuando un botón o sensor no está activamente conectado a un nivel de voltaje definido.
11
En los casos mostrados la señal proviene de un botón pulsador y los valores
recomendados para dichas resistencias están entre 10k y 47k.
El ESP32 tiene resistencias pull up internas que podemos activar mediante software y así
evitar la, a veces, engorrosa tarea de conectar una resistencia externa. Para lo anterior
usaremos la sentencia:
pinMode(BUTTON_PIN, INPUT_PULLUP);
Para aterrizar lo visto en la teoría se proponen dos circuitos con sus respectivos
programas
Aquí observa que el botón contiene una resistencia de 10k conectada a 3.3v
12
Código de funcionamiento con pull up externo.
Todo lo que se encuentre dentro de las llaves { } de la función void setup son definiciones
de pines, aquí nosotros damos la instrucción sobre cuál de los pines son entradas y
salidas. Observa que el BUTTON_PIN esta definido como una entrada sencilla, por lo que
aquí se conecta una resistencia externa como pull up.
void setup() {
pinMode(LED_PIN, OUTPUT); // Configura el pin del LED como salida
pinMode(BUTTON_PIN, INPUT); // Configura el botón como entrada
}
void loop() {
int buttonState = digitalRead(BUTTON_PIN); // Lee el estado del botón
13
Diagrama de conexión pull up interna.
Observa que el único cambio respecto del circuito 1 fue retirar la resistencia de 10k ya que
la función de la misma será reemplazada por una resistencia interna dentro de la ESP32
que activamos por software.
void setup() {
pinMode(LED_PIN, OUTPUT);
// Configura el botón como entrada y habilita una resistencia pull up interna
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
bool buttonState = digitalRead(BUTTON_PIN);
delay(100); // Pequeño retardo para evitar flasos contactos del boton
// Detecta cambio de estado (flanco de bajada)
if (buttonState == LOW && lastButtonState == HIGH) {
ledState = !ledState; // Cambia el estado del LED y se enclava
digitalWrite(LED_PIN, ledState);
}
14
Para subir el programa es necesario mantener presionado el botón de “BOOT” del ESP32
hasta que se haya terminado de cargar.
Después presiona el botón “EN” para reiniciar la tarjeta y que empiece a correr el
programa.
Lo anterior se aplicará siempre que se cargue código al ESP32 por lo que de ahora en
adelante se omitirá este proceso.
15
Lección 2 Entradas Analogicas
En esta lección por medio de la ESP32 aprenderás a leer un dato analógico desde un
potenciómetro que se mostrará en formato de voltaje a través del monitor serial.
Posteriormente, en función de dicha lectura se tomarán acciones como encender LEDs y
activar un buzzer activo.
Materiales necesarios
● Tarjeta ESP32
● Potenciómetro
● LED 5mm
● Resistencias de 220Ω
● Buzzer activo
● Protoboard
● Cables Dupont Macho-Macho
Conocimientos previos
Antes de comenzar con esta lección vale la pena dejar clara la diferencia entre dos tipos
fundamentales de señales de las que podemos extraer información; La señales
analogicas y las señales digitales, comenzando con las primeras:
Una señal analógica es aquella que puede tomar un número infinito de valores dentro de
un rango determinado. Es continuo, lo que significa que puede variar suavemente sin
saltos bruscos. Un buen ejemplo de datos analógicos son:
● La temperatura es medida con un termómetro de mercurio.
● El sonido captado por un micrófono.
● La señal de voltaje en un circuito que varía con el tiempo.
En los sistemas electrónicos, estos datos se representan con señales analógicas, que
generalmente son voltajes o corrientes que cambian de manera continua.
16
En esta leccion la señal analogica viene dada por la tensión del potenciómetro que sera
leida por el ESP32
Una señal digital es aquella que solo puede tomar un número discreto (limitado) de
valores. Generalmente, en sistemas electrónicos, los datos digitales son representados
en binario (0 y 1), donde:
● Un interruptor de luz que solo tiene dos estados: encendido (1) o apagado (0).
● Un archivo de música en formato MP3, donde la señal sonora original (analógica)
ha sido convertida en datos binarios.
● La información que viaja en una red de computadoras.
Los ceros pueden estar representados por 0v y los unos por 5v o en el caso de la ESP32
por 3.3v.
Como ves las señales digitales tienen una ventaja y es la flexibilidad para que diferentes
combinaciones signifiquen múltiples acciones, pero las señales analogicas contienen
mucha información ya que en el ejemplo de la temperatura del dia no se pasa
abruptamente de 9°C en la mañana a 22°C a medio dia sino que lentamente se eleva
dicho dato tomando infinitos valores, 9.1, 9.2, 9.3…
17
ADC
Diagrama de conexiones
Circuito 1
La lectura que aparece en el monitor podrás confirmar midiendo la tensión entre el pin
D34 y GND con tu multimetro
18
Código de funcionamiento 1
void setup() {
[Link](9600); // Iniciamos el monitor serial a 9600 baudios
void loop() {
int valorAnalogico = analogRead(POT_PIN); // Lee el valor del potenciómetro (0-4095)
float voltaje = (valorAnalogico / 4095.0) * 3.3; // Convertir a voltaje (ESP32 usa
3.3V)
[Link]("Voltaje: ");
[Link](voltaje); // Imprime el voltaje en el monitor serie
delay(500); // Pequeña pausa para estabilidad
}
Para abrir el monitor serial, una vez que hayas cargado el código da click en el siguiente
icono que aparece en la parte superior derecha del IDE.
19
Circuito 2
Para este segundo circuito aprovechamos el dato de tensión que obtenemos del ADC de
la ESP32 y en función de el encendemos dos LEDs y al final un buzzer, lo que a priori podría
parecer escueto pero es la plantilla con la que se diseñan sistemas que realizan
acciones programadas de acuerdo a sensores y dispositivos que entreguen señales
analogicas.
20
Código de funcionamiento 2
void setup() {
[Link](9600); // Iniciamos el monitor serial a 9600 baudios
void loop() {
int valorAnalogico = analogRead(POT_PIN); // Leer el valor del potenciómetro (0-4095)
float voltaje = (valorAnalogico / 4095.0) * 3.3; // Convertir a voltaje (ESP32 usa 3.3V)
[Link]("Voltaje: ");
[Link](voltaje); // Imprime el voltaje en el monitor serie
21
LECCIÓN 3 PWM
En esta lección aprenderás a utilizar la modulación por ancho de pulso del ESP32 con la
función básica analogRead(); para controlar el brillo de un LED utilizando un
potenciómetro.
Materiales necesarios
● ESP32 DevKit V1
● LED 5mm
● Resistencia 220 Ω ¼ w
● Potenciómetro
● Protoboard
● Cables Dupont Macho-Macho
Conocimientos previos
PWM
El PWM (Modulación por Ancho de Pulso, por sus siglas en inglés Pulse Width Modulation)
es una técnica utilizada para controlar la potencia entregada a una carga eléctrica
mediante una señal digital (encendido/apagado). Se utiliza en diversas aplicaciones,
como el control de la intensidad de un LED, la velocidad de un motor o la temperatura de
un calefactor.
El PWM no entrega una señal analógica continua, sino una señal digital que oscila entre
dos estados: encendido (alto) y apagado (bajo). Sin embargo, la clave es que la
duración del encendido y el apagado no son fijas, lo que permite controlar la cantidad
de energía entregada a la carga.
22
En términos sencillos, la señal PWM tiene dos componentes clave:
1. Frecuencia: Es la cantidad de ciclos que la señal completa por segundo. Se mide
en Hertz (Hz). Una frecuencia más alta significa que los pulsos se repiten más
rápido.
2. Ciclo de trabajo (Duty Cycle): Es la proporción del tiempo durante el cual la señal
está en estado alto (encendido), en relación con el ciclo total. Se mide en
porcentaje.
○ Ciclo de trabajo al 0%: La señal está completamente apagada.
○ Ciclo de trabajo al 100%: La señal está completamente encendida todo el
tiempo.
○ Ciclo de trabajo al 50%: La señal está encendida la mitad del tiempo y
apagada la otra mitad.
23
Diagrama de conexiones
Circuito 1
24
Código de funcionamiento 1
Donde ledPin es el pin D16 y valorPWM depende de una sentencia for que hace un barrido
ascendente de 0 a 255 y en el segundo for es descendente, de 255 a 0 lo que al final
produce el efecto de un aumento y disminución gradual de la intensidad luminosa del
LED
void setup() {
// Configurar el pin del LED como salida
pinMode(ledPin, OUTPUT);
}
void loop() {
// Aumentar la intensidad luminosa
for (valorPWM = 0; valorPWM <= 255; valorPWM ++) {
analogWrite(ledPin, valorPWM); // Modificar la intensidad del LED
delay(10); // Pausa para que el cambio sea gradual
}
25
Circuito 2
Para este segundo circuito vamos a controlar el PWM y por lo tanto la intensidad
luminosa del LED por medio de la tensión que entrega un potenciometro, es decir, de una
señal analogica
26
Código de funcionamiento 2
En el código observamos la dependencia del valor del PWM del valor de la conversión
que entrega el potenciómetro, con una operación aritmética de dividir entre 16 para
ajustar el valor de 4095 del ADC a 255 del PWM.
void setup() {
// Configurar el pin del LED como salida
pinMode(ledPin, OUTPUT);
}
void loop() {
// Asignamos la conversiÓn del adc del ESP32 a la variable pot
// Dicha conversion se obtiene de la lectura analogica del pin "potenciometro"
// Dividimos entre 16 para hacer un ajuste a la resoluciÓn por defecto del pwm que es de
8 bits osea 255
// mientras que la resoluciÓn por defecto del ADC del ESP32 es de 12 bits osea 4095
// por lo que 4096 / 16 = 255
float pot = (analogRead(potenciometro) / 16);
// La intensidad luminosa del LED depende del potenciometro
analogWrite(ledPin, pot); // Modificar la intensidad del LED
delay(10); // Pausa para que el cambio sea gradual
}
27
LECCIÓN 4 LCD
En esta lección aprenderás a utilizar una pantalla LCD 16x2 a través de la tarjeta ESP32 y
el módulo de interfaz I2C a LCD
Materiales necesarios
● ESP32 DevKit V1
● Pantalla LCD 16X2 (no incluida)
● Fuente de alimentación para protoboard (no incluida)
● Adaptador 9V 1A (no incluida)
● Protoboard
● Cables Dupont Macho-Hembra
Conocimientos previos
Una pantalla LCD 16x2 es una pantalla de cristal líquido que tiene un formato de 16
caracteres en horizontal y 2 filas en vertical, lo que significa que puede mostrar hasta 32
caracteres en total. Este tipo de pantallas se usan comúnmente en proyectos
electrónicos y dispositivos como microcontroladores para mostrar información, como
texto o números.
28
El LCD (Liquid Crystal Display) funciona utilizando cristales líquidos que se alinean en
función de una corriente eléctrica para crear imágenes o texto. Se ilumina por
retroiluminación (generalmente en verde o azul).
Protocolo 𝐼2𝐶
29
Funcionamiento básico de I2C
1. Inicio de la comunicación:
○ El maestro inicia la comunicación enviando una señal START en el bus. Esta señal se
genera al cambiar la línea SDA de alta a baja mientras SCL está alta.
2. Dirección del dispositivo:
○ Después de la señal de inicio, el maestro envía la dirección del dispositivo esclavo
al que desea comunicarse.
○ La dirección está acompañada por un bit que indica si se va a leer o escribir (0
para escribir, 1 para leer).
○ Ejemplo: Si la dirección del dispositivo es 0xA0, el maestro enviará este valor en bits
en la línea SDA.
3. Transferencia de datos:
○ Una vez que el esclavo ha reconocido su dirección, el maestro puede empezar a
enviar o recibir datos.
○ Los datos se envían de 8 bits a la vez (un byte). Cada byte es seguido por un bit de
acuse de recibo (ACK) o no acuse de recibo (NACK), enviado por el receptor para
confirmar que ha recibido correctamente el byte.
4. Finalización de la comunicación:
○ Cuando el maestro termina la comunicación, envía una señal STOP. Esta señal se
genera al cambiar la línea SDA de baja a alta mientras SCL está alta.
5. Velocidad:
○ El protocolo I2C soporta varias velocidades, siendo las más comunes 100 kHz
(modo estándar) y 400 kHz (modo rápido). Existen también modos de alta
velocidad que pueden llegar hasta 1 MHz.
30
Ejemplo de comunicación
● El maestro quiere leer datos de un sensor que tiene la dirección 0x40.
● El maestro envía una señal de START.
● Luego envía la dirección del sensor (0x40) junto con un bit de lectura (1) o escritura
(0).
● El sensor responde con un ACK.
● El maestro recibe los datos o envía los datos según sea necesario, con cada byte
seguido de un ACK o NACK.
● Finalmente, el maestro envía una señal de STOP para terminar la comunicación.
31
Diagrama de conexión
Como ya te habrás dado cuenta, la LCD tiene 16 pines, que suponen cables que de
conectar directamente a la ESP32 nos ocupa demasiados pines que bien podrían usarse
en otras tareas menos engorrosas, es por ello que en esta lección hacemos uso de la
interfaz I2C a LCD con la tarjeta PCF8574 la cual nos va a permitir usar solo dos cables
SCL y SDA para conectar al ESP32. Aquí te mostramos el módulo:
32
Una vez que conectes la LCD con el módulo I2C, con ayuda de un destornillador pequeño,
gira el potenciómetro de contraste para que puedas visualizar los caracteres
33
Código de funcionamiento
Siéntete libre de colocar el mensaje que desees ;). Por último presta atención en la línea
de código
Donde 0x27 es la dirección de la interfaz I2C PCF8574, de modo que si quisieras conectar
mas dispositivos I2C esclavos, tendras que checar sus direcciones para que al momento
del envío de datos cada dispositivo responda según se mande información con sus
respectivas direcciones
#include <LiquidCrystal_I2C.h>
void setup(){
// Inicializar la pantalla LCD
[Link]();
// Activar la retroiluminación de la pantalla LCD
[Link]();
}
void loop(){
// Establecer el cursor en la primera columna y fila
[Link](0, 0);
// Escribir el mensaje en la pantalla
[Link]("Hola criaturitas del");
[Link](7, 1);
[Link]("bosque");
// Esperar 1 segundo
delay(1000);
// Limpiar la pantalla
[Link]();
[Link](8, 1);
[Link](";)");
// Esperar 1 segundo
delay(1000);
34
// Limpiar la pantalla
[Link]();
[Link](0, 0);
[Link]("UNIT ELECTRONICS <3");
// Esperar 1 segundo
delay(1000);
// Limpiar la pantalla
[Link]();
}
Nota: En caso de no contar con pantalla LCD, podrás observar el sensado por el monitor serial y
omitiendo en el código la sección para visualizar el dato en la misma pantalla.
35
LECCIÓN 5 BLUETOOTH
Materiales necesarios
Conocimientos previos
Bluetooth
36
● Descubrimiento: El dispositivo intenta encontrar otros dispositivos Bluetooth
cercanos.
● Emparejamiento: El dispositivo selecciona uno de los encontrados y establece una
conexión segura. Esto puede requerir la confirmación de un código PIN o clave de
acceso.
Una vez emparejados, los dispositivos se comunican de manera bidireccional, lo que
significa que ambos pueden enviar y recibir datos. Los datos pueden ser simples (por
ejemplo, un comando de encender o apagar un LED) o complejos (como transmitir
música o imágenes).
El ESP32 tiene integrado un módulo Bluetooth, lo que te permite usar tanto Bluetooth
clásico como Bluetooth Low Energy (BLE).
1. Bluetooth clásico: En este modo, el ESP32 puede comportarse como un dispositivo
que se conecta a otros dispositivos Bluetooth para enviar o recibir datos. Se puede
usar para crear conexiones sencillas como un control remoto para dispositivos o
enviar datos a una PC o teléfono.
2. Bluetooth Low Energy (BLE): Es ideal para dispositivos que necesitan enviar o recibir
datos pequeños y que deben conservar la batería. BLE es útil cuando los
dispositivos están diseñados para estar siempre activos sin necesidad de cargar la
batería constantemente (por ejemplo, en sensores de temperatura o dispositivos
portátiles).
37
Diagrama de conexión
Código de funcionamiento
Como puedes ver el programa es bastante sencillo y consiste en que el LED cambia de
estado si desde la app se recibe un “1” lo que por su parte está integrado en el diseño de
la app: Enviar un 1 al presionar un botón.
#include "BluetoothSerial.h"
#define led 2
BluetoothSerial SerialBT;
void setup() {
[Link](9600); // Inicializa la comunicación serie a 9600 baudios para la
depuración
[Link]("Gerryno"); // Nombre del dispositivo Bluetooth
pinMode(led, OUTPUT); // Configura el pin 2 como salida (opcional, por si quieres usar
un LED para ver el cambio de estado)
}
void loop() {
// Verifica si se ha recibido un dato por el Bluetooth
if ([Link]()) {
receivedChar = [Link](); // Lee el carácter recibido
if (receivedChar == '1') { // Comprueba si el carácter recibido es '1'
estado = !estado; // Cambia el estado (0 a 1 y 1 a 0)
digitalWrite(led, estado); // Opcional: enciende o apaga un LED en el pin 2
[Link](estado); // Envía el nuevo estado de vuelta por Bluetooth
[Link](estado); // Envía el nuevo estado al monitor serie para
depuración
}
}
delay(10); // Añadir un pequeño retardo para evitar que el loop sea demasiado rápido
}
38
Una vez que hayas cargado el programa sigue los pasos que a continuación se enlistan
1. Ingresa al repositorio xxxxxxxxxxxxxx y descarga en tu teléfono el archivo
LED_Bluetooth.apk, el cual es la aplicación desarrollada en App inventor para esta
lección
2. Por seguridad se nos pide analizar la app.
3. Debemos conectar nuestro teléfono con la ESP32 vía bluetooth, para ello activamos
el bluetooth del teléfono y nos aseguramos que se encuentre visible para otros
dispositivos. Después, al abrir la app obtenemos la siguiente pantalla.
39
Presionamos el botón azul etiquetado como “Conectar Bluetooth” y se desplegará una
lista de los dispositivos con lo que el teléfono se puede enlazar, buscamos y
seleccionamos al nombre del bluetooth con qué llamamos a la ESP32 en el código, que
para este caso fue:
40
LECCIÓN 6 CONTROL DE LED RGB DESDE SERVIDOR WEB
En esta lección aprenderás a controlar el color de un LED RGB por medio de tres sliders
desplegados en una página web alojada en un ESP32.
Materiales necesarios
Conocimientos previos
LED RGB
RGB es un sistema de color basado en tres colores primarios Rojo, Verde y Azul (por sus
siglas en inglés (R) Red, (G) Green, (B) Blue), el cual en base a la combinación de estos 3
colores podemos representar otros colores como se muestra a continuación.
Por lo tanto, un Led RGB está formado internamente por tres diodos emisores de luz, uno
rojo, uno verde y por último uno azul, con el propósito de poder crear, gran variedad de
colores mediante la combinación de cada color con intensidades distintas.
41
Los Led´s RGB tiene 4 terminales y es común utilizar el encapsulado de 5mm y hay 2 tipos
de cátodo o ánodo común, que define cómo está conformado internamente el led RGB,
(como se muestra a continuación), aunque en esta lección vamos a trabajar con un LED
RGB de cátodo común.
Servidor web
Un servidor web es un sistema que almacena, procesa y entrega contenido web a través
de Internet. En términos simples, es una computadora o un software que maneja las
solicitudes de los usuarios (como las que provienen de un navegador web) y les envía de
vuelta el contenido solicitado, como páginas HTML, imágenes, videos, archivos y otros
recursos.
42
3. Interacción y manejo de peticiones: Los servidores web también pueden procesar
solicitudes más complejas, como formularios enviados por los usuarios o
peticiones que requieren bases de datos, y generar respuestas dinámicas en
función de estos datos.
Protocolo HTTP
Cuando un navegador hace una solicitud HTTP a un servidor, la solicitud incluye varias
partes importantes:
1. Método HTTP: Es el tipo de acción que se solicita. Los más comunes son:
○ GET: Solicita datos de un servidor (como una página web o una imagen).
○ POST: Envía datos al servidor (por ejemplo, cuando envías un formulario).
○ PUT: Actualiza recursos en el servidor.
○ DELETE: Elimina recursos en el servidor.
○ HEAD: Solicita los encabezados de una respuesta sin los datos del cuerpo.
43
2. URL: Es la dirección del recurso al que se quiere acceder, como
[Link]
3. Versión del protocolo: Indica qué versión de HTTP se está utilizando, por ejemplo,
HTTP/1.1.
4. Encabezados: Los encabezados proporcionan información adicional sobre la
solicitud, como el tipo de navegador que está haciendo la solicitud o los tipos de
contenido aceptables.
El ESP32 puede funcionar como un servidor web gracias a su capacidad para conectarse
a redes Wi-Fi y procesar solicitudes HTTP. Al actuar como servidor, el ESP32 puede servir
contenido web, como páginas HTML, imágenes, o incluso procesar datos recibidos desde
un navegador o cualquier cliente HTTP, como solicitudes para controlar dispositivos
(sensores, LEDs, motores, etc.) a través de una interfaz web.
1. Conexión Wi-Fi: El ESP32 debe conectarse a una red Wi-Fi para poder funcionar como
servidor web. El primer paso es establecer esta conexión, utilizando la librería WiFi.h. El
ESP32 se conecta a la red Wi-Fi y obtiene una dirección IP local (esto se muestra en el
monitor serial).
2. Creación del servidor webEl siguiente paso es crear un servidor HTTP en el ESP32. Esto
lo logramos utilizando librerías como WebServer.h o ESPAsyncWebServer.h. Un servidor
web básico usa el puerto 80 (que es el estándar para HTTP) para recibir las solicitudes.
44
Diagrama de conexiones
45
Código de funcionamiento
Carga el siguiente código no sin antes escribir entre las comillas el nombre de tu red y su
respectiva contraseña.
#include <WiFi.h>
#include <ESP32Servo.h>
#define R 27
#define B 26
#define G 25
//Escribe el nombre de tu red y su respectiva contraseña
const char* ssid = "Escribe el nombre de tu red";
const char* password = "Escribe la contraseña";
//Variables para configurar el PWM del ESP32
int frec = 5000, res = 8, cycle = 0, t=2;
//Configuramos el servidor web por el puerto 80
WiFiServer server(80);
// Variable para almacenar la petición HTTP
String header;
// Tiempo actual
unsigned long currentTime = millis();
// Tiempo pasado
unsigned long previousTime = 0;
// Define el timeout en millisegundos
const long timeoutTime = 2000;
void setup() {
//Iniciamos el monitor serial y configuramos los pines usados por el PWM
[Link](115200);
pinMode(R, OUTPUT);
ledcAttach(R, frec, res);
pinMode(G, OUTPUT);
ledcAttach(G, frec, res);
pinMode(B, OUTPUT);
ledcAttach(B, frec, res);
46
// Se imprime la IP y se inicia el servidor
[Link]("\n");
[Link]("WiFi conectado.");
[Link]("IP: ");
[Link]([Link]());
[Link]();
delay(3000); // Esperamos 3 segundos para que se realice correctamente la comunicación
}
void loop(){
WiFiClient client = [Link](); // Esperamos clientes
// Página web
// Título
[Link]("</head><body><h1>LED RGB con ESP32</h1>");
// Creamos tres sliders para cada color
[Link]("<p>Brillo Rojo: <span id=\"servoPos1\"></span></p>");
[Link]("<input type=\"range\" min=\"0\" max=\"255\" class=\"slider\"
id=\"servoSlider1\" onchange=\"servo1([Link])\" value=\""+valueString1+"\" />");
47
[Link]("<script>");
[Link](" // Primer slider");
[Link](" var slider1 =
[Link](\"servoSlider1\");");
[Link](" var servoP1 = [Link](\"servoPos1\");");
[Link](" [Link] = [Link];");
[Link](" [Link] = function() {");
[Link](" [Link] = [Link];");
[Link](" };");
[Link](" function servo1(pos) {");
[Link](" $.get(\"/?value1=\" + pos);");
[Link](" }");
[Link]("</body>");
[Link]("</html>");
48
ledcWrite(B,[Link]());
[Link](" \n\n ");
[Link]("VERDE: ");
[Link](valueString2);
[Link](" \n\n\n ");
}
ledcWrite(G,[Link]());
[Link](" \n\n ");
[Link]("AZUL: ");
[Link](valueString3);
[Link](" \n\n\n ");
}
Una vez que hayas cargado el programa, el monitor serial arrojará mensajes como los
siguientes donde, entre otras cosas, te muestra un dirección IP.
49
Si todo el proceso ha sido exitoso deberás ingresar a una página con el siguiente
aspecto donde manipulando los sliders verás una relación con la intensidad de la
luminosidad de cada color del LED RGB.
50
LECCIÓN 7 CONTROL DE RELEVADORES A TRAVÉS DE SERVIDOR WEB
Materiales Necesarios
● ESP32 DevKit V1
● Resistencias 100Ω 1/4 W
● Leds 5mm
● Módulo relevador 2 canales
● Fuente de alimentación para protoboard (no incluido)
● Adaptador 9v 1A (no incluido)
● Protoboard
Conocimientos previos
Relevador
51
Módulo de relevadores de 2 canales
En este dispositivo se encuentra integrado el siguiente circuito en una misma PCB para la
activación y desactivación de dos relevadores.
Donde:
1. VCC y GND: Para alimentar el módulo (usualmente a 5V o 3.3V, dependiendo del
sistema que estés usando).
2. IN1 e IN2: Son las entradas de control que se conectan a los pines de un
microcontrolador para activar cada relevador de manera independiente.
3. NO (Normal Open) y NC (Normal Closed): Son las salidas del relevador. El pin NO
es el que se activa cuando el relevador se enciende (es decir, cuando la señal está
HIGH), mientras que el NC está normalmente cerrado (conectado) cuando el
relevador está apagado.
52
Pines JDVcc, VCC y GND
53
Diagrama de conexiones
54
Código de funcionamiento
Antes de cargar este programa deberás escribir el nombre de tu red wifi y su respectiva
contraseña.
#include <WiFi.h>
#define r1 2 // Definimos r1 como el pin D2 del ESP32
#define r2 4 // Definimos r2 como el pin D4 del ESP32
// Credenciales de wifi
// Reemplazar con datos de tu red
const char *ssid = "ESCRIBE EL NOMBRE DE TU RED";
const char *password = "ESCRIBE LA CONTRASEÑA DE TU RED";
void setup() {
//Configura D2 y D4 como salidaS e inician en estado alto (HIGH)
pinMode(r1, OUTPUT);
digitalWrite(r1, HIGH);
pinMode(r2, OUTPUT);
digitalWrite(r2, HIGH);
[Link]("Conectandome");
while ([Link]() != WL_CONNECTED) // Espera conexión a la red
{
delay(500);
[Link]("."); // Imprime puntos hats que la ESP32 se conecte a tu red
}
[Link]();
[Link]("Conectado, La dirección IP es: ");
[Link]([Link]()); // Imprime la IP del ESP32 que ingresamos en nuestro
navegador web
55
void loop() {
// Recibe las conexiones de clientes
WiFiClient client = [Link]();
if (client) { // Si hay un cliente
[Link]("Nuevo cliente."); // Indica el acceso de un cliente
String currentLine = ""; // Variable para datos de fin de línea
while ([Link]()) { // Cliente conectado
if ([Link]()) { // Datos disponibles para ser leído
char c = [Link](); // Lectura de byte en variable C
[Link](c); // Muestra los datos
[Link]("<!DOCTYPE html><html>");
[Link]("<head><meta name=\"viewport\" content=\"width=device-width,
initial-scale=1\">");
[Link]("<link rel=\"icon\" href=\"data:,\">");
// Creación de botones
[Link]("<body><h1>Leccion 7 Control de relevadores desde Servidor local
con ESP32 ;)</h1>");
if(p=="off"){
[Link]("<button type='button' class='button button1'
onClick=[Link]='/r1=ON'> ON </button><br><br>");
}
else{
[Link]("<button type='button' class='button button2'
onClick=[Link]='/r1=OFF'> OFF </button><br><br>");
}
if(a=="off"){
[Link]("<button type='button' class='button button1'
onClick=[Link]='/r2=ON'> ON </button><br><br>");
}
else{
[Link]("<button type='button' class='button button2'
onClick=[Link]='/r2=OFF'> OFF </button><br><br>");
}
[Link]("</body></html>");
[Link]();
56
// Revisando el datos recibido del url
if ([Link]("GET /r1=ON") != -1) {
digitalWrite(r1, LOW); // GET /r1=ON
p="on";
}
if ([Link]("GET /r1=OFF") != -1) {
digitalWrite(r1, HIGH);
// GET /r1=OFF
p="off";
}
57
Tras cargar el programa abre el monitor serial y si el ESP32 estableció conexión
correctamente deberá mostrar una dirección IPV4 como la siguiente.
Y obtendrá la siguiente página web, alojada en el ESP32 donde podrá activar y desactivar
los dos canales del módulo de relevadores al presionar los botones que aparecen en la
página.
58
LECCIÓN 8 SERVIDOR WEB DE ESTACIÓN DE CLIMATICA DHT11
Materiales necesarios
Conocimientos previos
Sensor DHT11
59
El DHT11 tiene un sensor capacitivo que cambia su capacitancia según el contenido de
humedad en el aire. Cuanto mayor es la humedad, mayor es la capacitancia del sensor.
Este valor es convertido en una señal digital, además utiliza un termistor que cambia su
resistencia en función de la temperatura. A medida que la temperatura aumenta o
disminuye, cambia la resistencia del termistor. Este valor también es convertido en una
señal digital.
Una vez que el sensor toma las mediciones, las transmite al microcontrolador mediante
una señal digital de un solo cable.
60
○ Cada bit se envía con un pulso de tiempo:
■ Un pulso alto indica un bit 1.
■ Un pulso bajo indica un bit 0.
3. El microcontrolador debe medir el tiempo de estos pulsos para deducir los valores
de temperatura y humedad.
4. Validación de los Datos: Después de que el DHT11 envía los 40 bits de datos (5
bytes), el microcontrolador puede validar los valores comprobando que la suma
de los 4 primeros bytes sea igual al quinto byte. Si la suma es correcta, los datos
son válidos.
DNS
Sin el DNS, sería necesario recordar una dirección IP única para cada página web que
quisiéramos visitar, lo que sería muy difícil para los usuarios. El DNS hace que acceder a
Internet sea mucho más fácil y amigable, permitiendo que se utilicen nombres fáciles de
recordar en lugar de IPs.
61
Diagrama de conexión
62
Código de funcionamiento
Como en todos los códigos vistos hasta ahora deberás escribir tus credenciales para
ingresar a tu red WiFi.
Por otra parte debes buscar e instalar la librería “DHT sensor library” para trabajar con el
sensor DHT11.
Para poder subir tu programa es necesario desconectar el sensor DHT debido a que este
suele interferir con la correcta carga del código en la tarjeta ESP32.
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <DHT.h>
63
<span>%.2f</span>\
<sup class='units'>°C</sup>\
</p>\
<p>\
<i class='fas fa-tint' style='color:#00add6;'></i>\
<span class='dht-labels'>Humedad</span>\
<span>%.2f</span>\
<sup class='units'>%</sup>\
</p>\
</body>\
</html>",
readDHTTemperature(), readDHTHumidity() // Insertar valores de temperatura y
humedad
);
[Link](200, "text/html", msg); // Enviar la página HTML
}
void setup(void) {
[Link]("");
[Link]("Conectado a ");
[Link](ssid); // Imprimir el nombre de la red WiFi
[Link]("IP: ");
[Link]([Link]()); // Imprimir la dirección IP asignada
// Iniciar mDNS para que el ESP32 sea accesible por nombre en la red local
if ([Link]("esp32")) {
[Link]("Se inició el respondedor MDNS");
}
64
void loop(void) {
[Link](); // Manejar las solicitudes del cliente (navegador)
delay(2); // Permitir que el CPU se cambie a otras tareas
}
Una vez que esté cargado el código el procedimiento a seguir es similar al de las
lecciones anteriores; es decir, en el monitor serial se muestra la IP que se tiene que
ingresar en el buscador web para ingresar a la página y visualizar la información lo que
va a funcionar correctamente pero en esta lección se pretende que el usuario identifique
la utilidad de un DNS por lo que tras haber cargado tu código y que en monitor serial se
haya establecido conexión Wi-Fi, en el buscador ingresa el dominio (DNS) que a
continuación se muestra:
65
LECCIÓN 9 SOFTAP
Materiales Necesarios
● ESP32 DevKit V1
● Resistencias 100Ω 1/4 W
● Leds 5mm
● Modulo relevador 2 canales
● Fuente de alimentación para protoboard (no incluida)
● Adaptador 9v 1A (no incluida)
● Protoboard
● Cables Dupont Macho-Macho
Conocimientos previos
Access Point
66
El funcionamiento de un AP se puede dividir en los siguientes pasos:
1. Conexión a una red cableada: El AP se enlaza con un router o switch a través de un
cable Ethernet para recibir la conexión a la red.
2. Creación de una red inalámbrica: Una vez conectado, el AP genera una señal Wi-Fi
con un identificador de red conocido como SSID (Service Set Identifier), el cual
permite a los dispositivos detectar la red.
3. Autenticación y asociación de dispositivos: Los dispositivos inalámbricos se
conectan al AP utilizando protocolos de autenticación y cifrado, tales como WPA2 o
WPA3.
4. Transmisión y recepción de datos: Una vez autenticados, el AP permite el
intercambio de datos entre los dispositivos inalámbricos y la infraestructura
cableada, facilitando la comunicación y el acceso a servicios como Internet.
SoftAP
Un SoftAP (Software Access Point) es una tecnología que permite a un dispositivo, como
una computadora o un microcontrolador, actuar como un punto de acceso Wi-Fi sin
necesidad de hardware adicional. Esto se logra mediante software que habilita la
creación de una red inalámbrica, permitiendo la conexión de otros dispositivos.
67
Diagrama de conexiones
Para la siguiente lección haremos uso de los mismos componentes y conexiones vistos
para el control de relevadores desde una página web con la diferencia de que para esta
lección no tendremos que conectar el ESP32 a tu red doméstica, sino que será el mismo
microcontrolador el que genera su propia red inalámbrica al que podemos tener como
máximo ocho dispositivos conectados a la vez y que podrán realizar el control de dichos
relevadores
68
Código de funcionamiento
#include <WiFi.h>
#include <WebServer.h>
#define r1 2 // Relé 1 en D2
#define r2 4 // Relé 2 en D4
WebServer server(80);
void setup() {
[Link](115200);
pinMode(r1, OUTPUT);
digitalWrite(r1, LOW); // Apagado por defecto
pinMode(r2, OUTPUT);
digitalWrite(r2, LOW); // Apagado por defecto
69
// Configurar el ESP32 en modo SoftAP
[Link](ssid, password);
IPAddress ip = [Link]();
[Link]("Soft AP configurado.");
[Link]("Dirección IP del Soft AP: ");
[Link](ip);
[Link]();
[Link]("Servidor HTTP iniciado");
delay(1000);
}
void loop() {
[Link]();
70
</div>
<h2>Control Relé 1</h2>
<a href="/relayon1" class="onBtn">ON</a>
<a href="/relayoff1" class="offBtn">OFF</a>
</body>
</html>
)rawliteral";
void handleConnectionRoot() {
[Link](200, "text/html", respuesta);
}
void handleReleOff1() {
estadoRele1 = false;
[Link](200, "text/html", respuesta);
}
void handleReleOff2() {
estadoRele2 = false;
[Link](200, "text/html", respuesta);
}
71
Por lo que aparece la red de la siguiente manera:
Se ingresa la contraseña:
Y se conecta al SoftAP generado por la ESP32 que tendrá el siguiente mensaje porque
este no se encuentra conectado al internet ya que ha generado su propia red.
72
5. Ya que estés conectado a la red desde tu navegador ingresa la IP que previamente
obtuviste en el paso 3.
73
LECCIÓN 10 CONTROL MIXTO DE RELEVADORES CON SOFTAP
Materiales Necesarios
● ESP32 DevKit V1
● Resistencias 100Ω 1/4 W
● Leds 5mm
● Modulo relevador 2 canales
● Fuente de alimentación para protoboard (no incluida)
● Adaptador 9v 1A (no incluida)
● Pulsadores
● Protoboard
● Cables Dupont Macho-Macho
Conocimientos previos
El módulo WiFi del ESP32 le permite operar en distintos modos según las necesidades del
proyecto, adaptándose tanto a escenarios donde debe integrarse a una red ya existente
como a aquellos donde necesita generar su propia conexión.
Estos modos de operación definen cómo el ESP32 interactúa con otros dispositivos en
una red inalámbrica. Cada uno de estos modos tiene aplicaciones específicas, ventajas
y limitaciones que determinan su uso ideal en proyectos de automatización, monitoreo y
control remoto.
74
Estos modos son:
En este modo, el ESP32 deja de ser un simple cliente y se convierte en un punto de acceso
WiFi. En otras palabras, en lugar de conectarse a una red, crea la suya propia,
permitiendo que otros dispositivos se conecten directamente a él sin necesidad de un
router externo.
Esto lo convierte en una excelente opción cuando se necesita una red privada y
autónoma, sin depender de infraestructura adicional.
75
El ESP32 define el nombre de la red y la contraseña, y asigna direcciones IP a los
dispositivos que se conectan a él.
En este caso, se conecta a una red WiFi como cliente, al mismo tiempo que crea su
propia red para que otros dispositivos se conecten a él. Esta configuración resulta
especialmente útil cuando se necesita actuar como un puente entre una red externa y
dispositivos locales.
Por ejemplo, imagina una aplicación en la que el ESP32 debe enviar datos a internet, pero
al mismo tiempo permitir que un usuario se conecte directamente a él para configurarlo
o monitorear su funcionamiento.
Este modo ofrece una gran flexibilidad, ya que combina lo mejor de ambos mundos. Sin
embargo, su rendimiento puede verse afectado porque el ESP32 debe gestionar
simultáneamente dos conexiones WiFi, lo que aumenta el consumo de energía y el uso
de los recursos internos del microcontrolador.
76
Diagrama de conexiones
En esta última lección podrás apreciar que es casi el mismo que en las pasadas
lecciones 7 y 9 con la única modificación de que los LEDs están conectados al terminal
Normalmente cerrado de los relevadores (NC) además de que se le han agregado dos
pulsadores, mismos que van conectados a GND y a los pines D22 y D23 de la ESP32, esto
debido a que dentro del programa que a continuación se muestra, se han activado las
resistencias Pull up internas, volviendo el circuito más compacto de conectar.
77
78
Código de funcionamiento
Este código en una continuación del visto en la lección anterior, pues se trata de un sitio
web que controla a dos relevadores y la conexión se realiza mediante la implementación
de un SoftAP para que el ESP32 genere su propia red y añadiendo tanto en la página
como en la lógica del programa la intervención de dos botones cuya actuación será
visualizada tanto en la página como en el estado de los LEDs.
#include <WiFi.h>
#include <WebServer.h>
#define r1 2 // Relé 1 en D2
#define r2 4 // Relé 2 en D4
#define btn1 22 // Botón físico para el Relé 1
#define btn2 23 // Botón físico para el Relé 2
const char* ssid = "Coloca aqui el nombre de tu red"; // Nombre de la red Wi-Fi (para
SoftAP)
const char* password = "Establece una contraseña para tu red"; // Contraseña Wi-Fi
WebServer server(80);
void setup() {
[Link](115200);
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(btn1, INPUT_PULLUP); // Configuramos el botón con resistencia pullup
pinMode(btn2, INPUT_PULLUP); // Configuramos el botón con resistencia pullup
[Link]("Soft AP configurado.");
[Link]("Dirección IP del Soft AP: ");
[Link](ip);
79
[Link]();
[Link]("Servidor HTTP iniciado");
}
void loop() {
[Link](); // Manejar peticiones de los clientes
if (digitalRead(btn2) == LOW) {
estadoRele2 = !estadoRele2;
digitalWrite(r2, estadoRele2 ? HIGH : LOW);
lastDebounceTime = millis();
}
}
80
// Función para actualizar los botones según el estado del relé
function actualizarBotones() {
// Botón Relé 1
if ([Link]("estado_rele1").innerText == "Encendido") {
[Link]("btn_on1").[Link] = "#44c767";
[Link]("btn_off1").[Link] = "#e0e0e0";
} else {
[Link]("btn_on1").[Link] = "#e0e0e0";
[Link]("btn_off1").[Link] = "#f05d67";
}
// Botón Relé 2
if ([Link]("estado_rele2").innerText == "Encendido") {
[Link]("btn_on2").[Link] = "#44c767";
[Link]("btn_off2").[Link] = "#e0e0e0";
} else {
[Link]("btn_on2").[Link] = "#e0e0e0";
[Link]("btn_off2").[Link] = "#f05d67";
}
}
fetch("/estado_rele2")
.then(response => [Link]())
.then(data => {
[Link]("estado_rele2").innerText = data;
actualizarBotones();
});
}
81
</body>
</html>
)rawliteral";
// Funciones para proporcionar el estado de los relés a través de una solicitud fetch
void handleEstadoRele1() {
[Link](200, "text/plain", estadoRele1 ? "Encendido" : "Apagado");
}
void handleEstadoRele2() {
[Link](200, "text/plain", estadoRele2 ? "Encendido" : "Apagado");
}
void handleReleOff1() {
estadoRele1 = false;
digitalWrite(r1, LOW); // Apagar relé 1
delay(100); // Agregar un pequeño retraso para asegurar que la acción se complete
[Link]("Location", "/"); // Redirigir a la página principal
[Link](303); // Redirección HTTP 303
}
void handleReleOff2() {
estadoRele2 = false;
digitalWrite(r2, LOW); // Apagar relé 2
delay(100); // Agregar un pequeño retraso para asegurar que la acción se complete
[Link]("Location", "/"); // Redirigir a la página principal
[Link](303); // Redirección HTTP 303
}
82
El procedimiento para conectarse a la red generada por el ESP32 es exactamente como
se describió en la lección anterior.
Una vez que te conectes y entres a la página web obtendrás una pantalla como la
siguiente:
El propósito de esta lección fue desarrollar con un enfoque práctico todo lo visto tanto en
la lección 7 como en la lección 9 ya que ahora se puede implementar este sistema
básico de control de relevadores con la comodidad de realizarlo sin infraestructura de
red externa por medio de un dispositivo móvil que se conecte a la pagina web, ademas
de un control a pie de maquina mediante botones.
83
84