Guías · 18 min de lectura

Blynk ESP32: controla LED, relé y sensores desde el móvil

Tutorial Blynk ESP32 paso a paso: plantilla y datastreams (V0, V1), Auth Token, LED y relé desde el móvil, gráfica del sensor, avisos y límites del plan gratis.

Blynk con ESP32 es la forma más rápida de controlar una placa desde cualquier parte del mundo sin programar tu propia app para el móvil. Blynk IoT te ofrece un servidor en la nube al que se conecta el ESP32 (Blynk.Cloud), una app móvil en la que montas un panel arrastrando y soltando, y un panel web. Cuando tocas un interruptor en el móvil, la orden va primero a la nube y de ahí al ESP32; la temperatura que mide el ESP32 vuelve por el mismo camino y aparece en tu móvil como número y como gráfica. El móvil y la placa no tienen que estar en la misma casa: funciona incluso con el móvil en datos móviles.

En esta guía vas a montar desde cero un proyecto que funciona: abrirás una cuenta en Blynk.Cloud, definirás una plantilla (template) y varios datastreams (V0, V1, V2, V3), obtendrás el Auth Token del dispositivo, instalarás la librería, controlarás un LED y un relé desde el móvil, verás los datos de un DHT11 en una gráfica y recibirás una notificación cuando suba la temperatura. Además aprenderás por qué no debes usar delay() y qué hace BlynkTimer en su lugar, cómo calcular el límite de mensajes del plan gratuito, por qué el código del Blynk antiguo ya no compila y cómo resolver los errores de conexión más frecuentes.

Placa de desarrollo ESP32 controlada desde el móvil con Blynk IoT
Gracias a su Wi-Fi integrado, el ESP32 se conecta directamente a Blynk.Cloud; no necesita ningún módulo inalámbrico adicional.

¿Qué es Blynk IoT y cómo funciona?

Con Blynk, el ESP32 y el móvil nunca se conectan entre sí directamente; ambos se conectan a Blynk.Cloud y el servidor lleva los mensajes. Al arrancar, el ESP32 se conecta primero al Wi-Fi, después al servidor de Blynk y se identifica con su Auth Token. Los datos viajan por pines virtuales (Virtual Pin, V0–V255): un pin virtual no es una patilla real del ESP32, sino un canal de datos numerado entre tu código y la app. El interruptor de la app escribe un 1 en V1, la función BLYNK_WRITE(V1) de tu código lo recoge y activa el relé; cuando tu código ejecuta Blynk.virtualWrite(V2, 24.5), se actualiza el indicador del móvil. Estos son los conceptos básicos:

Concepto¿Para qué sirve?Ejemplo en esta guía
Plantilla (Template)La receta común para dispositivos del mismo tipo: datastreams, paneles y eventosESP32 Casa
DatastreamCanal de datos ligado a un pin virtual, con tipo y rango definidosV2: Temperatura, Double, 0–50 °C
Dispositivo (Device)Una placa real creada a partir de la plantilla; cada una tiene sus propios datosEl ESP32 del salón
Auth TokenLa clave de identidad secreta del dispositivo; el código la usa para conectarse a la nubeLa línea BLYNK_AUTH_TOKEN
WidgetElementos del panel como interruptores, indicadores y gráficasButton, Gauge, SuperChart
Evento (Event)Un aviso que envía notificaciones y queda registrado en la línea de tiempoyuksek_sicaklik

Diferencias entre el Blynk antiguo y el nuevo Blynk IoT

La mayoría de vídeos y códigos de Blynk que circulan por internet se hicieron para la versión antigua (Blynk Legacy), que ya no funciona. La nueva plataforma salió en mayo de 2021; la app antigua se retiró de las tiendas en junio de 2022 y los antiguos servidores en la nube se apagaron definitivamente el 31 de diciembre de 2022. Así que el token de un proyecto antiguo, los puntos de energía que compraste o la dirección blynk-cloud.com ya no sirven de nada; tienes que crear el proyecto de nuevo en la plataforma actual. La buena noticia: la mayor parte del código del ESP32 (BLYNK_WRITE, virtualWrite, BlynkTimer) sigue igual.

CaracterísticaBlynk antiguo (Legacy)Blynk IoT (nuevo)
¿Dónde se configura el proyecto?Todo en un proyecto dentro de la app del móvilPlantillas y datastreams en Blynk.Console (web), paneles en el móvil y en la web
Auth TokenUno por proyecto, llegaba por correoUno por dispositivo, se ve en la página del dispositivo
Modelo de pagoLos widgets se compraban con puntos de energíaPlanes mensuales con límites de dispositivos, mensajes y funciones
Inicio del sketchSolo una línea char auth[]BLYNK_TEMPLATE_ID, BLYNK_TEMPLATE_NAME y BLYNK_AUTH_TOKEN obligatorios
NotificacionesBlynk.notify() y Blynk.email()Se define un evento en la plantilla y se dispara con Blynk.logEvent()
Servidorblynk-cloud.com, puerto 80 u 8080 (apagado)blynk.cloud, puerto 80 o 443 con SSL
Panel webNo habíaSí (Blynk.Console)
Servidor localSe podía instalar un servidor Java de código abiertoNo hay servidor local personal; el antiguo ya no se actualiza
Al compilar un ejemplo antiguo con la librería nueva te encontrarás con tres problemas típicos: los sketches que usan BLYNK_DEVICE_NAME fallan con "Please specify your BLYNK_TEMPLATE_ID and BLYNK_TEMPLATE_NAME", los que contienen Blynk.notify() se detienen con "'class BlynkWifi' has no member named 'notify'", y los que indican blynk-cloud.com (casi siempre con el puerto 8080) en Blynk.begin() pueden compilar, pero nunca se conectan.

Materiales y conexiones

Para este proyecto usarás una placa de desarrollo ESP32, un módulo de relé de 5 V, un sensor de temperatura y humedad DHT11, opcionalmente un LED con una resistencia de 220 Ω, una protoboard y cables jumper. Como LED basta con el LED azul integrado en el GPIO 2; si pones un LED externo, calcula la resistencia con la calculadora de resistencia para LED. Comprueba también el pinout de tu placa en la herramienta Pinout; en algunas placas el pin de 5 V se llama VIN y en otras 5V.

ESP32
ESP32
Röle modülü
Röle modülü
DHT11
DHT11
LED
LED
Breadboard
Breadboard
Jumper kablo
Jumper kablo
ComponentePin del componentePin del ESP32Nota
LED (opcional)Pata larga (+)GPIO 2Con resistencia de 220 Ω; pata corta a GND
Módulo de reléVCCVIN / 5VCon alimentación USB hay unos 5 V en este pin
Módulo de reléGNDGNDTierra común
Módulo de reléINGPIO 26En módulos activos a nivel bajo, ROLE_AKTIF_LOW = true en el código
DHT11VCC3V3Funciona de 3,3 a 5,5 V
DHT11DATAGPIO 4El sensor suelto necesita una resistencia pull-up de 10 kΩ; los módulos ya la llevan
DHT11GNDGNDTierra común
Los pines del ESP32 dan 3,3 V. La mayoría de módulos de relé de 5 V se activan con esta señal, pero en un módulo activo a nivel bajo un HIGH de 3,3 V no siempre suelta del todo el relé; si el relé no se apaga nunca, usa un módulo con disparo a 3,3 V o pon un transistor NPN en medio. Si vas a conmutar una carga de red de 230 V con el relé, conecta siempre con el enchufe desconectado, no dejes conductores al aire y pide ayuda a un adulto; tienes los detalles en ¿Qué es un módulo de relé?

Paso 1: crear la cuenta de Blynk.Cloud y la plantilla

  1. En el ordenador entra en blynk.cloud, crea una cuenta gratuita con tu correo y define tu contraseña con el enlace del correo que recibirás.
  2. En el menú de la izquierda ve a Developer Zone > My Templates y pulsa + New Template.
  3. Ponle un nombre a la plantilla (por ejemplo ESP32 Casa), elige ESP32 como hardware y WiFi como tipo de conexión, y crea la plantilla.
  4. Los valores BLYNK_TEMPLATE_ID y BLYNK_TEMPLATE_NAME que aparecen en la página de la plantilla irán en tu código; por ahora solo fíjate en dónde están.
  5. Si al registrarte aparece un asistente Quickstart, puedes saltarlo; en esta guía haremos cada paso a mano para que veas para qué sirve cada ajuste.

Paso 2: definir los datastreams (V0, V1, V2, V3)

Un datastream es la ficha de identidad de un pin virtual: indica qué pin es, el tipo de dato (Integer para enteros, Double para decimales, String para texto), el valor mínimo y máximo, la unidad y cuántos decimales se muestran. Abre la plantilla en modo edición, ve a la pestaña Datastreams, elige + New Datastream > Virtual Pin y crea estos cuatro canales:

Pin virtualNombreTipo de datoMín – MáxUnidad y decimalesWidget
V0LEDInteger0 – 1NingunaButton / Switch
V1ReleInteger0 – 1NingunaButton / Switch
V2TemperaturaDouble0 – 50°C, #.#Gauge, SuperChart
V3HumedadDouble0 – 100%, #Gauge, SuperChart
Los campos Min y Max no son de adorno: Blynk recorta al límite los valores fuera de rango. Si dejas el Max del datastream de temperatura en 1, verás un 1 en el panel aunque el sensor mida 24,5 °C. Si quieres que los interruptores recuperen su último estado cuando la placa se reinicia, usa Blynk.syncVirtual() dentro de BLYNK_CONNECTED(); otra opción es activar Sync with latest server value en los ajustes avanzados del datastream y llamar a Blynk.syncAll(). No olvides guardar la plantilla con Save después de cada cambio.

Paso 3: crear el dispositivo y obtener el Auth Token

La plantilla es una receta y el dispositivo es la placa real hecha con esa receta. En el menú de la izquierda abre Devices, pulsa + New Device, elige la plantilla ESP32 Casa con From template y ponle un nombre al dispositivo. Al crearlo aparece una configuración de tres líneas: BLYNK_TEMPLATE_ID, BLYNK_TEMPLATE_NAME y BLYNK_AUTH_TOKEN. Copia esas líneas; más adelante también las encontrarás en la sección Device Info de la página del dispositivo (en algunas versiones de la interfaz se llama Developer Tools).

El Auth Token es la contraseña de tu dispositivo. No publiques código con el token en foros ni en un repositorio público de GitHub; quien tenga el token puede encender y apagar tu relé. Si el token se filtra, borra el dispositivo y créalo de nuevo para obtener uno nuevo. Cada placa necesita su propio dispositivo y su propio token: si cargas el mismo token en dos ESP32, se desconectarán el uno al otro sin parar.

Paso 4: instalar la librería Blynk en el Arduino IDE

  1. Si todavía no tienes el paquete de placas ESP32 en el Arduino IDE, instálalo primero; los pasos están en ¿Qué es el ESP32?
  2. Abre el Gestor de Librerías, escribe Blynk en el buscador e instala la librería oficial Blynk de Volodymyr Shymanskyy. Si te pregunta por las dependencias, elige Install all.
  3. Para el sensor, instala desde el mismo sitio la DHT sensor library de Adafruit y la Adafruit Unified Sensor que necesita. Si tienes problemas, consulta la guía Cómo añadir una librería en Arduino.
  4. Elige ESP32 Dev Module en Herramientas > Placa, conecta la placa con un cable USB de datos y selecciona el puerto correcto.
  5. La librería incluye ejemplos listos: Archivo > Ejemplos > Blynk > Boards_WiFi > ESP32_WiFi es la versión más sencilla del primer sketch de abajo.

Primer sketch: encender y apagar un LED desde el móvil (V0)

En el código de abajo, sustituye las tres primeras líneas por las que copiaste de la página de tu dispositivo, y el nombre y la contraseña del Wi-Fi por los tuyos. Esas tres líneas #define deben ir siempre antes de las líneas #include; la librería busca esos valores al compilar y da un error si no los encuentra.

Arduino (C++)
1// Bu üç satırı Blynk.Console'daki cihaz sayfasından kopyala / copy these three lines from the device page in Blynk.Console
2#define BLYNK_TEMPLATE_ID   "TMPLxxxxxxxx"
3#define BLYNK_TEMPLATE_NAME "ESP32 Ev"
4#define BLYNK_AUTH_TOKEN    "CihazTokeniniBurayaYapistir"
5
6#define BLYNK_PRINT Serial          // bağlantı günlüğünü Seri Monitör'e yaz / print the connection log to the Serial Monitor
7
8#include <WiFi.h>
9#include <WiFiClient.h>
10#include <BlynkSimpleEsp32.h>
11
12char ssid[] = "AgAdi";              // Wi-Fi adın (yalnız 2,4 GHz) / your Wi-Fi name (2.4 GHz only)
13char pass[] = "Sifre123";           // Wi-Fi şifren / your Wi-Fi password
14
15const int LED_PIN = 2;              // çoğu DevKit'te dahili LED / onboard LED on most DevKits
16
17// Uygulama V0'a her değer yazdığında çalışır / runs every time the app writes a value to V0
18BLYNK_WRITE(V0) {
19  int deger = param.asInt();        // anahtar: 0 ya da 1 / switch: 0 or 1
20  digitalWrite(LED_PIN, deger);
21  Serial.print("V0 = ");
22  Serial.println(deger);
23}
24
25// Buluta her bağlanışta son V0 değerini iste / ask for the last V0 value on every connection
26BLYNK_CONNECTED() {
27  Blynk.syncVirtual(V0);
28}
29
30void setup() {
31  Serial.begin(115200);
32  pinMode(LED_PIN, OUTPUT);
33  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);   // Wi-Fi'ye ve Blynk.Cloud'a bağlan / connect to Wi-Fi and Blynk.Cloud
34}
35
36void loop() {
37  Blynk.run();                      // gelen komutları işler, bağlantıyı canlı tutar / handles commands, keeps the link alive
38}
LíneaFunción
BLYNK_PRINT SerialHace que la librería escriba sus pasos de conexión en el Monitor Serie; muy útil para buscar fallos
BLYNK_WRITE(V0)Función que se ejecuta sola cuando la app o el panel web envían un valor a V0
param.asInt()Convierte el valor recibido en un entero; para decimales usa asFloat() y para texto asStr()
BLYNK_CONNECTED()Se ejecuta una vez tras cada conexión correcta
Blynk.syncVirtual(V0)Pide al servidor el último valor de V0, así el LED vuelve a su estado anterior aunque la placa se reinicie
Blynk.begin(...)Se conecta al Wi-Fi y a Blynk.Cloud; espera hasta conseguirlo
Blynk.run()Procesa las órdenes entrantes y mantiene viva la conexión; hay que llamarla en loop sin ninguna espera

Al subir el código y abrir el Monitor Serie a 115200 baudios deberías ver, por este orden, líneas como "Connecting to AgAdi", "Connected to WiFi", la dirección IP, "Connecting to blynk.cloud:80" y al final "Ready (ping: 45ms).". Cuando aparece la línea Ready, el dispositivo se ve Online en Blynk.Console. En la primera conexión puede que veas también una línea que empieza por "Redirecting to"; la librería pasa sola al servidor regional de tu cuenta, es normal.

Preparar el panel del móvil y el panel web

El código está listo, ahora coloquemos los botones. En Blynk el panel móvil y el panel web se diseñan por separado; como ambos usan los mismos datastreams, lo que cambies en uno se ve al instante en el otro.

  1. Instala en el móvil la app Blynk IoT (no el Blynk antiguo ni Blynk Legacy) e inicia sesión con la misma cuenta.
  2. Activa Developer Mode en la página de tu perfil y luego toca la plantilla ESP32 Casa en la Developer Zone.
  3. Toca el espacio vacío para añadir widgets: un Button o Switch para V0 y otro para V1, un Gauge o Labeled Value para V2 y V3, y un SuperChart para el historial.
  4. Toca cada widget y elige su datastream en los ajustes; al SuperChart puedes añadirle V2 y V3 juntos. Los cambios se guardan solos.
  5. Para el panel web, edita la plantilla en Blynk.Console, arrastra los widgets en la pestaña Web Dashboard, elige el datastream desde el icono del engranaje de cada uno y guarda con Save.
  6. En la app, toca el nombre de tu dispositivo y prueba el interruptor: el LED del GPIO 2 debe encenderse al momento y el Monitor Serie debe mostrar "V0 = 1".
El widget Button tiene dos modos: en modo Switch alterna entre 1 y 0 con cada toque, y en modo Push envía 1 mientras lo mantienes pulsado y 0 al soltarlo. Para lámparas y enchufes usa Switch; para tareas que necesitan un pulso corto, como un timbre o la puerta del garaje, usa Push.

Relé y sensor: lectura sin delay() con BlynkTimer

La regla de oro de Blynk es: en loop() solo deben estar Blynk.run() y timer.run(). Si pones delay(2000) en loop, durante ese tiempo el ESP32 no ve las órdenes del móvil y el interruptor responde con retraso; las esperas muy largas hacen que el servidor considere el dispositivo desconectado. Peor aún, si escribes Blynk.virtualWrite() directamente en loop, el ESP32 intenta enviar cientos de mensajes por segundo; el servidor lo limita y tu cuota mensual de mensajes se agota enseguida. La solución es BlynkTimer, que funciona con la lógica de millis(): llama a la función que elijas cada cierto intervalo y deja loop libre entre medias. Explicamos esta idea en detalle en Arduino millis() y delay().

El siguiente código controla el relé con V1, envía cada 60 segundos la temperatura del DHT11 a V2 y la humedad a V3, y dispara un evento de notificación cuando la temperatura supera los 30 °C. Para saber cómo funciona el sensor, mira Sensor de temperatura y humedad DHT11.

Arduino (C++)
1#define BLYNK_TEMPLATE_ID   "TMPLxxxxxxxx"
2#define BLYNK_TEMPLATE_NAME "ESP32 Ev"
3#define BLYNK_AUTH_TOKEN    "CihazTokeniniBurayaYapistir"
4#define BLYNK_PRINT Serial
5
6#include <WiFi.h>
7#include <WiFiClient.h>
8#include <BlynkSimpleEsp32.h>
9#include <DHT.h>
10
11char ssid[] = "AgAdi";
12char pass[] = "Sifre123";
13
14const int ROLE_PIN = 26;            // röle modülünün IN pini / relay module IN pin
15const int DHT_PIN  = 4;             // DHT11 veri pini / DHT11 data pin
16const bool ROLE_AKTIF_LOW = true;   // çoğu modül LOW'da çeker / most modules switch on with LOW
17
18DHT dht(DHT_PIN, DHT11);            // DHT22 kullanıyorsan DHT22 yaz / write DHT22 if you use a DHT22
19BlynkTimer timer;                   // delay() yerine zamanlayıcı / a timer instead of delay()
20bool alarmGitti = false;            // aynı bildirimin tekrarını önler / stops the same alert repeating
21
22void roleYaz(bool acik) {
23  if (ROLE_AKTIF_LOW) digitalWrite(ROLE_PIN, acik ? LOW : HIGH);
24  else                digitalWrite(ROLE_PIN, acik ? HIGH : LOW);
25}
26
27// V1: uygulamadaki röle anahtarı / relay switch in the app
28BLYNK_WRITE(V1) {
29  roleYaz(param.asInt() == 1);
30}
31
32// Elektrik gidip gelince rölenin son durumunu geri al / restore the relay state after a power cut
33BLYNK_CONNECTED() {
34  Blynk.syncVirtual(V1);
35}
36
37// Zamanlayıcının çağırdığı fonksiyon / the function called by the timer
38void sensorGonder() {
39  float sicaklik = dht.readTemperature();
40  float nem = dht.readHumidity();
41  if (isnan(sicaklik) || isnan(nem)) {
42    Serial.println("DHT okunamadi / DHT read failed");
43    return;
44  }
45  Blynk.virtualWrite(V2, sicaklik);   // V2: sıcaklık (°C) / temperature (°C)
46  Blynk.virtualWrite(V3, nem);        // V3: nem (%) / humidity (%)
47
48  // 30 °C'yi geçince tek bildirim, 28 °C'nin altında yeniden kur / one alert above 30 °C, re-arm below 28 °C
49  if (sicaklik > 30.0 && !alarmGitti) {
50    Blynk.logEvent("yuksek_sicaklik", String("Sicaklik / Temp: ") + sicaklik + " C");
51    alarmGitti = true;
52  } else if (sicaklik < 28.0) {
53    alarmGitti = false;
54  }
55}
56
57void setup() {
58  Serial.begin(115200);
59  pinMode(ROLE_PIN, OUTPUT);
60  roleYaz(false);                   // açılışta röle kapalı / relay off at boot
61  dht.begin();
62  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
63  timer.setInterval(60000L, sensorGonder);   // 60 saniyede bir ölç ve gönder / measure and send every 60 seconds
64}
65
66void loop() {
67  Blynk.run();
68  timer.run();                      // loop'ta delay() ya da virtualWrite olmasın / no delay() or virtualWrite in loop
69}

La línea timer.setInterval(60000L, sensorGonder) llama a la función cada 60.000 milisegundos; la L final indica que el número es de tipo long. Para tareas de una sola vez se usa timer.setTimeout(), por ejemplo para encender el relé y apagarlo 5 segundos después. Un objeto BlynkTimer admite hasta 16 temporizadores, más que suficiente para la mayoría de proyectos. La comprobación con isnan() evita que llegue a la nube un valor NaN sin sentido cuando no se puede leer el sensor. La variable alarmGitti y la diferencia entre los umbrales de 30 y 28 °C (histéresis) evitan una notificación nueva en cada lectura mientras la temperatura oscila alrededor de 30 °C.

Mostrar los datos del sensor en una gráfica

Para que la gráfica se llene hacen falta dos cosas: que el ESP32 envíe datos con virtualWrite y que el datastream guarde historial. Si en los ajustes del datastream el historial (history) está en Last Value, el servidor guarda solo el último valor y no se dibuja ninguna gráfica; la media por minuto (1 Minute AVG) es suficiente para las gráficas. En el plan gratuito el historial se guarda 1 semana, y el almacenamiento de datos en bruto (RAW) es exclusivo de los planes de pago. En SuperChart puedes cambiar entre rangos de horas, días y semanas y ver temperatura y humedad en dos colores en la misma gráfica. Como los datos llegan cada 60 segundos, los primeros puntos tardan unos minutos en aparecer; no te impacientes bajando el intervalo a 1 segundo, verás por qué en la sección del plan gratuito.

Enviar notificaciones: eventos y Blynk.logEvent()

En el nuevo Blynk las notificaciones funcionan mediante eventos. Primero defines el evento en la plantilla y luego lo disparas en el código con Blynk.logEvent(); Blynk anota el evento en la línea de tiempo (Timeline) del dispositivo y, según su configuración, envía una notificación push o un correo a tu móvil. La descripción de un evento puede tener hasta 300 caracteres, pero como el búfer de envío de la librería es pequeño, es mejor que sea corta.

  1. Abre la plantilla en modo edición y ve a la pestaña Events & Notifications.
  2. Pulsa + Create Event, ponle al evento un nombre como "Temperatura alta" y usa yuksek_sicaklik como código del evento (event code). El código solo puede tener letras, números y guiones bajos y debe coincidir exactamente con el texto del sketch.
  3. Elige Warning como tipo de evento; Info, Warning y Critical indican la gravedad del aviso. Comprueba que la opción de línea de tiempo esté activada para que el evento aparezca en la app.
  4. En la pestaña Notifications activa las notificaciones, elige tu propia cuenta como destinatario y push y correo como canales; si quieres, limítalas a una por hora.
  5. Guarda la plantilla con Save y confirma la actualización del dispositivo. No olvides permitir las notificaciones de la app Blynk IoT en el móvil.
LímiteValor
Eventos por dispositivo y día (logEvent)100
Entre dos eventos del mismo tipoAl menos 1 segundo
Entre dos notificaciones (push, correo)Al menos 5 segundos
Descripción del eventoHasta 300 caracteres
Peticiones por dispositivoHasta 50 por segundo
Longitud de un valor de texto (String)Hasta 1024 bytes
No pongas nunca Blynk.logEvent() dentro de loop() ni dentro de una condición sin variable de control que se cumpla en cada lectura. Un código que envía un evento cada 60 segundos mientras la temperatura supera el umbral agota el límite de 100 eventos diarios en unos 100 minutos, y ese día ya no recibirás ninguna otra notificación. Usa una variable de control como la del código de arriba o activa las opciones de limitación de la pestaña Notifications.

Límites del plan gratuito: cómo calcular los mensajes

El plan gratuito de Blynk es suficiente para aprender y para proyectos pequeños, pero un proyecto montado sin conocer sus límites puede quedarse mudo a mitad de mes. A octubre de 2026, la página de precios de Blynk indica estos valores para el plan gratuito: 5 dispositivos, 1 usuario, 100.000 mensajes de dispositivo al mes, 1 semana de historial, 10 plantillas, 5 eventos por plantilla, 1 webhook y 5 automatizaciones. Estos límites han cambiado varias veces en los últimos años; antes de montar un proyecto de larga duración, comprueba los valores actuales en la página de precios de Blynk o en los ajustes del plan de tu cuenta. Lo que más cuenta son los comandos virtualWrite, syncVirtual y logEvent que envía tu dispositivo, y cada virtualWrite es un mensaje. Un mes tiene unos 2.592.000 segundos, así que la cuenta es sencilla:

Intervalo de envío1 datastream (30 días)2 datastreams (30 días)¿Cabe en el límite de 100.000?
2 segundos1.296.0002.592.000No
10 segundos259.200518.400No
30 segundos86.400172.800Un valor cabe, dos no
60 segundos43.20086.400Cabe, pero con dos valores queda poco margen
5 minutos8.64017.280Cabe de sobra
Hay tres formas de ahorrar mensajes: alarga el intervalo de medida tanto como de verdad puedas (la temperatura de una habitación cada 5 minutos es suficiente), envía un valor solo cuando cambie una cantidad concreta (por ejemplo 0,5 °C) y no mandes datos a datastreams que no usas. Los propios ejemplos de la librería aconsejan no enviar más de 10 valores por segundo.

Una conexión que no se bloquea sin Wi-Fi

Blynk.begin() es cómodo pero tiene un inconveniente: si no consigue conectar al Wi-Fi o a Blynk, se queda esperando para siempre dentro de setup() y el resto de la placa nunca se ejecuta. En proyectos que deben seguir funcionando aunque se caiga internet, como un termostato o un riego, conviene que gestiones tú la conexión. El esqueleto de abajo inicia el Wi-Fi sin esperar, con Blynk.config() solo aplica los ajustes y comprueba la conexión cada 10 segundos; mientras tanto, las tareas locales que añadas al temporizador siguen funcionando con o sin internet.

Arduino (C++)
1#define BLYNK_TEMPLATE_ID   "TMPLxxxxxxxx"
2#define BLYNK_TEMPLATE_NAME "ESP32 Ev"
3#define BLYNK_AUTH_TOKEN    "CihazTokeniniBurayaYapistir"
4#define BLYNK_PRINT Serial
5
6#include <WiFi.h>
7#include <WiFiClient.h>
8#include <BlynkSimpleEsp32.h>
9
10char ssid[] = "AgAdi";
11char pass[] = "Sifre123";
12
13BlynkTimer timer;
14
15// Wi-Fi varsa ama Blynk bağlı değilse yeniden dene / retry Blynk when Wi-Fi is up but Blynk is not
16void baglantiKontrol() {
17  if (WiFi.status() == WL_CONNECTED && !Blynk.connected()) {
18    Serial.println("Blynk'e yeniden baglaniliyor / reconnecting to Blynk");
19    Blynk.connect(3000);            // en fazla 3 saniye bekle / wait at most 3 seconds
20  }
21}
22
23void setup() {
24  Serial.begin(115200);
25  WiFi.mode(WIFI_STA);
26  WiFi.begin(ssid, pass);           // beklemeden başlat / start without waiting
27  Blynk.config(BLYNK_AUTH_TOKEN);   // yalnız ayarla, bağlanmayı bekleme / configure only, don't block
28  timer.setInterval(10000L, baglantiKontrol);   // 10 saniyede bir kontrol / check every 10 seconds
29}
30
31void loop() {
32  if (Blynk.connected()) {
33    Blynk.run();
34  }
35  timer.run();                      // yerel işler internet yokken de çalışır / local tasks keep running offline
36}

El ESP32 intenta reconectarse al Wi-Fi por su cuenta cuando se corta; el código solo vuelve a conectar con Blynk cuando el Wi-Fi ha vuelto. Si quieres que tus datos viajen cifrados, basta con incluir BlynkSimpleEsp32_SSL.h en lugar de BlynkSimpleEsp32.h; la conexión usa entonces TLS por el puerto 443 en vez del 80 y además esquiva los bloqueos de puertos de algunas redes de colegios o empresas. Si no quieres escribir los datos del Wi-Fi en el código, el ejemplo Blynk.Edgent > Edgent_ESP32 de la librería te permite introducir el nombre de la red y la contraseña desde la app Blynk IoT; con este método el Auth Token se asigna solo al añadir el dispositivo y el código se puede actualizar de forma inalámbrica (OTA). El mismo código funciona también en placas ESP8266: para un NodeMCU basta con usar ESP8266WiFi.h y BlynkSimpleEsp8266.h.

Blynk con la Raspberry Pi Pico W y MicroPython

Blynk no es solo cosa del ESP32. Si usas MicroPython en una Raspberry Pi Pico W, solo tienes que copiar a la Pico con Thonny el archivo único BlynkLib.py de la librería de Python de Blynk. Ten en cuenta que esta librería ya no se desarrolla activamente y que Blynk recomienda su API MQTT para proyectos nuevos; aun así, sirve para aprender y para proyectos sencillos. El código de abajo controla con V0 el LED integrado de la Pico W y envía una vez por minuto a V2 el valor del sensor de temperatura del chip. Crea un dispositivo aparte para la Pico W en Blynk.Console y usa su token. Si eres nuevo en MicroPython, Fundamentos de MicroPython es un buen punto de partida.

MicroPython
1import network, time
2from machine import Pin, ADC
3import BlynkLib                      # BlynkLib.py Pico'da olmalı / BlynkLib.py must be on the Pico
4
5WIFI_SSID = "AgAdi"
6WIFI_PASS = "Sifre123"
7BLYNK_AUTH = "PicoTokeniniBurayaYapistir"
8
9led = Pin("LED", Pin.OUT)            # Pico W dahili LED / Pico W onboard LED
10sensor = ADC(4)                      # yongadaki sıcaklık sensörü / on-chip temperature sensor
11
12wlan = network.WLAN(network.STA_IF)
13wlan.active(True)
14wlan.connect(WIFI_SSID, WIFI_PASS)
15while not wlan.isconnected():
16    time.sleep(0.5)
17print("IP:", wlan.ifconfig()[0])
18
19blynk = BlynkLib.Blynk(BLYNK_AUTH, insecure=True)   # 80 portu, TLS'siz / port 80, no TLS
20
21@blynk.on("V0")
22def v0_yazildi(value):               # uygulamadaki anahtar / switch in the app
23    led.value(int(value[0]))
24
25@blynk.on("connected")
26def baglandi(ping):
27    print("Blynk hazir / ready, ping:", ping, "ms")
28    blynk.sync_virtual(0)            # son V0 değerini iste / ask for the last V0 value
29
30son = time.ticks_ms()
31while True:
32    blynk.run()
33    if time.ticks_diff(time.ticks_ms(), son) >= 60000:   # 60 saniyede bir / every 60 seconds
34        son = time.ticks_ms()
35        volt = sensor.read_u16() * 3.3 / 65535
36        sicaklik = 27 - (volt - 0.706) / 0.001721
37        blynk.virtual_write(2, round(sicaklik, 1))      # V2: sıcaklık / temperature

En el ejemplo la conexión se hace sin cifrar por el puerto 80 con insecure=True; es la opción que menos memoria gasta y está al mismo nivel que BlynkSimpleEsp32.h en el ESP32. Si quitas este parámetro, la librería intenta usar TLS por el puerto 443. Medimos el tiempo con ticks_ms en el bucle en lugar de time.sleep() por la misma razón que en Arduino: si blynk.run() no se llama a menudo, las órdenes llegan tarde y la conexión se cae. El sensor de temperatura del chip puede desviarse unos grados de la temperatura ambiente; para medidas reales conecta un DHT11 o un DS18B20.

Ideas de proyectos con Blynk

  • Enchufe inteligente: enciende y apaga una lámpara o un ventilador desde cualquier parte del mundo con un relé; para conectarlo mira ¿Qué es un módulo de relé?
  • Riego de plantas a distancia: activa la bomba cuando el sensor de humedad del suelo detecte tierra seca y sigue la humedad en una gráfica.
  • Invernadero inteligente: enciende un ventilador cuando suban la temperatura y la humedad y recibe un aviso si se pasa un umbral; detalles en Proyecto de invernadero inteligente.
  • Alarma antirrobo: envía con logEvent una notificación crítica al móvil cuando el sensor de movimiento PIR detecte a alguien.
  • Aviso de fuga de gas: cuando el sensor de gas MQ-2 supere su umbral, que suene un zumbador y vibre tu móvil.
  • Estación meteorológica: compara en una gráfica semanal la temperatura, la humedad y la presión de un BME280.
  • Control de puertas y ventanas: mira en la app si una puerta se ha quedado abierta con un interruptor reed.

Errores comunes y soluciones

Síntoma o mensajeCausaSolución
Al compilar: "Please specify your BLYNK_TEMPLATE_ID and BLYNK_TEMPLATE_NAME"Faltan líneas, están después del #include o se usa el antiguo BLYNK_DEVICE_NAMEPon las tres líneas #define arriba del todo, antes de los includes; cambia DEVICE_NAME por TEMPLATE_NAME
Al compilar: "'class BlynkWifi' has no member named 'notify'"El comando Blynk.notify() de un código de Blynk antiguoCrea un evento en la plantilla y usa Blynk.logEvent()
"Invalid auth token" en el Monitor SerieToken ausente o mal copiado, dispositivo borrado o token del Blynk antiguoCopia otra vez el token desde la página del dispositivo, sin espacios al principio ni al final
No pasa de la línea "Connecting to AgAdi"La placa no se conecta al Wi-Fi: red de 5 GHz, contraseña incorrecta o señal débilUsa una red de 2,4 GHz; mira la guía de Wi-Fi del ESP32 para más detalles
"Connecting to blynk.cloud:80" se repite o "Login timeout"La red no tiene internet o una red de colegio o empresa bloquea la conexiónPrueba con la zona Wi-Fi del móvil; usa el puerto 443 con BlynkSimpleEsp32_SSL.h
"Heartbeat timeout", dispositivo Offline a menudodelay() largo o bucle bloqueante en loop, alimentación insuficientePasa las esperas a BlynkTimer y usa un buen cable y un buen cargador
No pasa nada al pulsar el interruptorEl widget está ligado a otro datastream o el pin de BLYNK_WRITE es distintoEl pin de los ajustes del widget debe coincidir con el Vx del código
El indicador marca siempre 1 o la gráfica está vacíaEl Max del datastream se quedó en 1 o el historial está en Last ValueAjusta Min y Max al rango del sensor y cambia el ajuste del historial
Al cabo de un tiempo dejan de llegar datosSe ha agotado la cuota mensual de mensajesAlarga el intervalo de envío y envía solo cuando cambie el valor
El relé funciona al revés o no se suelta nuncaMódulo activo a nivel bajo o la señal de 3,3 V no bastaCambia ROLE_AKTIF_LOW y usa un módulo compatible con 3,3 V
Sigue un orden al buscar fallos: primero comprueba en el Monitor Serie la conexión Wi-Fi, luego la línea "Ready" y, solo al final, que los widgets coincidan con los datastreams. Si te quedas atascado en el Wi-Fi, consulta El ESP32 no se conecta al Wi-Fi; si la placa se reinicia al activar el Wi-Fi, lee ESP32 Brownout y Guru Meditation.

¿Blynk, tu propio servidor web o MQTT?

MétodoVentajasInconvenientes¿Cuándo elegirlo?
Blynk IoTPanel listo sin programar una app, acceso desde fuera de casa, notificacionesLímites del plan gratuito, depende de la nubePrototipos rápidos y control remoto
Servidor web en el ESP32Totalmente gratis, funciona sin internetNormalmente solo accesible desde la misma red, la interfaz la escribes túPanel de control dentro de casa
MQTT y Home AssistantMensajes ilimitados, funciona en local, automatizaciones potentesMontaje más largo, necesita un servidor siempre encendidoSistema domótico permanente
Bot de TelegramGratis, ideal para avisos y órdenesSin gráficas ni panelAlarmas y órdenes sencillas

En resumen, Blynk es la forma más fácil de conseguir resultados rápidos con un panel listo y bonito y de acceder a tu proyecto desde fuera de casa. Si quieres un sistema ilimitado y totalmente local, lee Servidor web y WebSocket con ESP32 o ESP32 con MQTT y Home Assistant; si solo quieres enviar avisos al móvil, echa un vistazo a la guía Bot de Telegram con ESP32.

Cuando entiendes el trío plantilla, datastream y Auth Token, conectar un nuevo proyecto con ESP32 al móvil mediante Blynk te lleva solo unos minutos. Combina los ejemplos de LED, relé y sensor de esta guía y tendrás el punto de partida de tu propia casa inteligente. En la app BlueGrays también encontrarás proyectos con ESP32 como encender un LED, conectarse al Wi-Fi, medir la temperatura con un DHT22, iluminación inteligente, riego de plantas y una alarma de movimiento con Telegram, cada uno con su esquema y su código paso a paso.

Preguntas frecuentes

¿Blynk es gratis?

Sí, Blynk tiene un plan gratuito para uso personal. A octubre de 2026 ofrece 5 dispositivos, 100.000 mensajes de dispositivo al mes y 1 semana de historial. Para más dispositivos, mensajes ilimitados y un historial más largo hay que pasar a un plan mensual de pago.

¿Dónde encuentro el Auth Token de Blynk?

En Blynk.Console abre tu dispositivo desde la sección Devices; en Device Info verás las líneas BLYNK_TEMPLATE_ID, BLYNK_TEMPLATE_NAME y BLYNK_AUTH_TOKEN listas para pegar en tu código. En el nuevo Blynk el token ya no llega por correo y cada dispositivo tiene su propio token.

¿La app antigua de Blynk sigue funcionando?

No. La app antigua Blynk (Legacy) se retiró de las tiendas en 2022 y sus servidores en la nube se apagaron el 31 de diciembre de 2022. Tienes que rehacer los proyectos antiguos en la plataforma Blynk IoT con plantillas y datastreams; la mayor parte del código del ESP32 se puede reutilizar con pequeños cambios.

¿Qué es un pin virtual en Blynk?

Un pin virtual es un canal de datos numerado entre la app y tu código, y no corresponde a ninguna patilla física de la placa. Van de V0 a V255; los valores de la app se leen con BLYNK_WRITE(Vx) y los de la placa se envían a la app con Blynk.virtualWrite(Vx, valor). Así puedes procesar los valores recibidos como quieras y llevar los datos del sensor al panel.

¿Por qué mi ESP32 aparece offline en Blynk?

Las causas más habituales son un Auth Token incorrecto o ausente, un ESP32 que intenta conectarse a una red de 5 GHz, llamadas largas a delay() dentro de loop() y una alimentación insuficiente. Si en el Monitor Serie no aparece la línea "Ready", el problema está en la conexión; si aparece, asegúrate de que en la app estás mirando el dispositivo correcto.

¿Blynk funciona sin internet?

No. En Blynk IoT las órdenes y los datos pasan por Blynk.Cloud, así que tanto el ESP32 como el móvil necesitan acceso a internet. Para controlar sin internet puedes usar el servidor web propio del ESP32, ESP-NOW o Bluetooth.

Ver todos los proyectos
LED Parpadeante con ESP32
#103Principiante

LED Parpadeante con ESP32

Enseña el uso básico de la salida GPIO con ESP32. Conseguimos un efecto de parpadeo encendiendo y apagando un LED desde el pin digital. Versión para ESP32 del clásico proyecto blink en Arduino UNO; los comandos básicos de blink en el entorno Arduino son los mismos, pero la distribución de pines y los niveles GPIO de 3,3 V del ESP32 difieren de los del Arduino UNO.

4.7(36)
96
Parpadeo del LED interno del ESP32
#106Principiante

Parpadeo del LED interno del ESP32

Parpadeo del LED azul incorporado en el ESP32 DevKit V1. ¡No se necesitan componentes externos! El primer proyecto que debe probar cuando compra un ESP32. GPIO 2 está conectado al LED interno.

4.8(29)
53
Lectura de la intensidad luminosa con el módulo LDR del ESP32
#113Principiante

Lectura de la intensidad luminosa con el módulo LDR del ESP32

Visualización en tiempo real en el monitor serie del valor bruto del ADC del módulo LDR y del porcentaje relativo de luz calculado a partir de referencias de oscuridad y claridad. Este porcentaje no es una medición en lux. Explica el funcionamiento de la calibración del módulo. Es recomendable realizarlo antes del Proyecto 10, ya que se utiliza para determinar el valor umbral.

4.6(36)
55
Conexión Wi-Fi STA con ESP32 (con pantalla LCD)
#127Avanzado
Premium

Conexión Wi-Fi STA con ESP32 (con pantalla LCD)

En este proyecto, conectamos el ESP32 a la red Wi-Fi doméstica en modo Station (STA) de forma segura y tolerante a fallos. Separamos el SSID y la contraseña en el archivo `secrets.h` para evitar que se filtren a Git, configuramos un mecanismo de reconexión automática y mostramos el nivel de señal RSSI y la dirección IP en una pantalla LCD I2C. El LED interno actúa como indicador de estado.

4.4(21)
33
ESP32 DHT22 Temperatura y humedad (con pantalla LCD)
#117Intermedio

ESP32 DHT22 Temperatura y humedad (con pantalla LCD)

Se trata de un proyecto que mide la temperatura y la humedad ambientales mediante el sensor DHT22 y las muestra en tiempo real en una pantalla LCD I2C 16x2. Los datos del sensor se leen mediante el protocolo de un solo cable (one-wire) utilizando la biblioteca DHT de Adafruit. Este proyecto constituye la base para estaciones meteorológicas IoT, sistemas de automatización doméstica inteligente o sistemas de monitorización ambiental en invernaderos.

4.8(38)
54
Iluminación Inteligente ESP32 (PIR + LDR + Relé + OLED)
#141Avanzado
Premium

Iluminación Inteligente ESP32 (PIR + LDR + Relé + OLED)

¡Convierte tu pasillo, baño o despensa en iluminación inteligente con ESP32! Utilizando un sensor de movimiento PIR, un sensor de luz LDR y un módulo de relé, construimos el escenario clásico "la luz se enciende cuando se detecta movimiento en la oscuridad" — si el ambiente ya está iluminado, el movimiento NO activa la luz, ahorrando energía durante el día. La luz permanece encendida durante 30 segundos; si el movimiento continúa, el temporizador se reinicia y la luz permanece encendida más tiem

4.3(6)
11
Sistema inteligente de riego de plantas ESP 32
#139Avanzado
Premium

Sistema inteligente de riego de plantas ESP 32

En este proyecto se ha desarrollado un sistema de riego automático para plantas utilizando un ESP32 y un sensor de humedad del suelo. El sensor mide continuamente el nivel de humedad del suelo. Cuando la humedad cae por debajo del nivel establecido, el ESP32 activa el relé para poner en marcha la bomba de agua y regar la planta. Cuando el suelo está lo suficientemente húmedo, la bomba se detiene automáticamente. Gracias a este proyecto, las plantas se pueden regar de forma regular y se ahorra ag

4.7(10)
14
Sistema de Alarma de Movimiento ESP32 (PIR + Buzzer + LED + Telegram)
#145Avanzado
Premium

Sistema de Alarma de Movimiento ESP32 (PIR + Buzzer + LED + Telegram)

Un sistema inteligente de alarma de seguridad que activa el buzzer y el LED cuando el sensor PIR detecta movimiento, y envía simultáneamente una notificación instantánea al propietario vía Telegram. Cuenta con un tiempo de espera de 30 segundos para limitar la frecuencia de las alarmas repetidas; este mecanismo no comprueba la validez de las detecciones del sensor PIR ni elimina las falsas detecciones. Ideal para seguridad del hogar, vigilancia de garajes, almacenes o salas de trabajo. Con ESP32

0.0(0)
8