Fundamentos · 10 min de lectura

Programación por bloques Arduino: encender un LED paso a paso

Programación por bloques con Arduino: conecta un LED con resistencia de 220 Ω, mira la línea C++ de cada bloque, cambia la espera de 100 ms y crea un semáforo.

En la programación por bloques con Arduino, el primer programa casi siempre es el mismo: hacer parpadear un LED. En este artículo lo hacemos de principio a fin. Conectamos un LED al pin 9 con una resistencia de 220 Ω, leemos uno a uno los bloques del proyecto Parpadeo de LED de BlueGrays y vemos, lado a lado, en qué línea del código C++ que se carga en la placa se convierte cada bloque. También probarás a cambiar un solo número, el 100 del bloque "esperar 100 ms", para controlar la velocidad del parpadeo.

Este artículo es la parte 2 de la serie De los bloques al código. En qué es la programación por bloques explicamos qué son los bloques y cómo se convierten en código real. En la siguiente parte añadimos un pulsador y vemos el bloque "si" y el if/else.

No nos quedamos en un solo LED. Vamos a ampliar la misma lógica paso a paso hasta programas que encienden dos LED por turnos, funcionan como un semáforo y destellan como las luces de la policía. Después verás la misma idea en el ESP32 y en la Raspberry Pi Pico con MicroPython. Al final tienes una tabla con los errores que casi todo principiante comete alguna vez. Todos los proyectos de este artículo son gratuitos en BlueGrays, con bloques y código, y puedes ver todos los proyectos con bloques por plataforma en la página de programación por bloques.

¿Qué necesitas?

MaterialCantidadNota
Arduino Uno (o Nano)1Se conecta al ordenador por USB
LED de 5 mm (el rojo es el más fácil)1Pata larga +, pata corta -
Resistencia de 220 Ω1Bandas: rojo, rojo, marrón
Protoboard1Sin soldar
Cables jumper macho-macho2Para D9 y GND
Ordenador con Arduino IDE1Para cargar el código en la placa

El circuito: conectar el LED al pin 9

Un LED tiene dos patas y la polaridad importa. La pata larga es el ánodo (+) y la corta el cátodo (-); en el lado del cátodo el encapsulado de plástico tiene un borde plano. La corriente solo circula del ánodo al cátodo, así que si lo pones al revés no pasa nada. Conecta el pin 9 del Arduino a un extremo de la resistencia de 220 Ω y el otro extremo a la pata larga del LED. La pata corta va a GND. La resistencia limita la corriente: a los 5 V les restas los unos 2 V del LED rojo, quedan 3 V en la resistencia, y 3 V / 220 Ω son unos 14 mA. Es una corriente cómoda para el LED y segura para el pin del Arduino. Puedes comprobar el valor para el color de tu LED con la calculadora de resistencia para LED. Cómo funciona un LED lo cuentas en qué es un LED, y cómo se conectan por dentro las filas de la protoboard en qué es una protoboard.

ConexiónArduino Uno (Parpadeo de LED)ESP32 (LED parpadeante con ESP32)Raspberry Pi Pico (LED externo)
Pata larga del LED (ánodo, +)D9 a través de 220 ΩGPIO 5 a través de 220 ΩGP14 a través de 220 Ω
Pata corta del LED (cátodo, -)GNDGNDGND
Pin en los bloques y el código95LED_PIN = 14
Espera del proyecto100 ms500 ms0,5 segundos
Tensión del pin5 V3,3 V3,3 V
Nunca conectes un LED directamente a un pin sin resistencia. Sin ella nada limita la corriente: el LED brilla demasiado, se calienta y puede estropearse pronto, y el pin del Arduino también puede dañarse. Si pusiste el LED al revés, tranquilo: simplemente no se enciende, basta con darle la vuelta. Puedes ver dónde están los pines de tu placa en la herramienta Pinout.

Tu primer programa con bloques: Parpadeo de LED

Con el circuito listo, veamos el programa. Abre el proyecto Parpadeo de LED en BlueGrays y activa Ver en bloques en la sección de código; verás los bloques de abajo. Son siete bloques en total, repartidos en dos grandes grupos: arriba configuración (una vez) y debajo repetir siempre. Los bloques aparecen en el idioma de la app: en español dicen "escribir ALTO en pin" y en inglés "write HIGH to pin".

Bloques del proyecto Parpadeo de LED: configurar pin 9 como SALIDA en configuración, y escribir ALTO, esperar 100 ms, escribir BAJO, esperar 100 ms dentro de repetir siempre
Bloques de Parpadeo de LED (proyecto 1): el pin 9 se configura como salida una vez y los cuatro bloques de repetir siempre se repiten sin fin.

Los bloques de configuración (una vez) se ejecutan una sola vez, al encender la placa o al pulsar reset. Aquí hay un único bloque: "configurar pin 9 como SALIDA". Los pines digitales del Arduino pueden ser entradas o salidas. Como vamos a controlar un LED, le decimos a la placa "por este pin voy a sacar corriente". El grupo repetir siempre empieza cuando termina la configuración y se ejecuta de arriba abajo una y otra vez mientras la placa esté encendida. Sus cuatro bloques encienden el LED, esperan 100 milisegundos, lo apagan y esperan otros 100 milisegundos. Tras el último bloque el programa vuelve arriba y el LED se enciende de nuevo. Lo que llamamos parpadeo no es más que estos cuatro pasos repitiéndose cinco veces por segundo.

Bloque → línea C++: ¿en qué se convierte cada bloque?

BloqueLínea C++Qué hace
configuración (una vez)void setup() { ... }Ejecuta su contenido una vez al arrancar
configurar pin 9 como SALIDApinMode(9,OUTPUT);Convierte el pin 9 en salida
repetir siemprevoid loop() { ... }Repite su contenido para siempre
escribir ALTO en pin 9digitalWrite(9,HIGH);Pone 5 V en el pin, el LED se enciende
esperar 100 msdelay(100);Detiene el programa 0,1 s
escribir BAJO en pin 9digitalWrite(9,LOW);Pone el pin a 0 V, el LED se apaga
esperar 100 msdelay(100);Se queda apagado 0,1 s
C++ (Arduino IDE)
1// Led Yakma (proje 1): D9'daki LED 100 ms yanar, 100 ms söner
2// LED Blink (project 1): the LED on D9 is on for 100 ms, off for 100 ms
3void setup() {
4  pinMode(9,OUTPUT);     // LED pini çıkış / LED pin as output
5}
6
7void loop() {
8  digitalWrite(9,HIGH);  // LED'i yak / turn the LED on
9  delay(100);            // 100 ms bekle (1000 ms = 1 s) / wait 100 ms (1000 ms = 1 s)
10  digitalWrite(9,LOW);   // LED'i söndür / turn the LED off
11  delay(100);            // 100 ms bekle / wait 100 ms
12}
13

Si pones la tabla junto al código, ves todo lo que los bloques resuelven por ti. La forma de los grupos configuración y repetir siempre corresponde a las llaves de las funciones void setup() y void loop(): el grupo en el que está un bloque decide dentro de qué llaves se escribe su línea. Con bloques no tienes que pensar en el punto y coma al final de cada instrucción, en mayúsculas y minúsculas (pinMode, digitalWrite) ni en los paréntesis. Pero cuando empiezas a modificar el código tú mismo en el Arduino IDE, sí importan; basta un punto y coma olvidado para tener un error de compilación. Esa es la gran ventaja de los bloques: primero asientas la lógica del programa y luego aprendes cómo se escribe esa misma lógica en código.

¿Qué pasa si cambias "esperar 100 ms"?

El tiempo de espera va en milisegundos (ms), y 1000 ms son un segundo. Los dos bloques de espera del proyecto están en 100 ms, así que el LED pasa 0,1 segundos encendido y 0,1 segundos apagado. Un ciclo completo dura 200 ms, es decir, el LED parpadea cinco veces por segundo. Si subes el número en los dos bloques el LED va más lento, y si lo bajas, más rápido. A partir de cierto punto el ojo ya no distingue los parpadeos y el LED parece encendido todo el tiempo. La tabla muestra lo que verás al cambiar las dos esperas:

Bloques de esperaUn ciclo completoParpadeos por segundoLo que ves
10 ms + 10 ms20 ms50Parece fijo, algo más tenue
100 ms + 100 ms (el del proyecto)200 ms5Parpadeo rápido y claro
250 ms + 250 ms500 ms2Parpadeo fácil de seguir
500 ms + 500 ms1 s1Una vez por segundo, ritmo tranquilo
1000 ms + 1000 ms2 s0,51 segundo encendido, 1 segundo apagado
100 ms + 900 ms1 s1Destello corto, oscuridad larga
Los dos bloques de espera no tienen por qué ser iguales. Si pones el primero en 100 y el segundo en 900, el LED da un destello corto cada segundo, como el piloto de "estoy funcionando" de muchos aparatos. En código son delay(100); y delay(900);. Cambiar un número y volver a cargar es el ejercicio más rápido para entender la relación entre bloques y código.

Ampliar el programa: dos LED, semáforo y luces de policía

Si ya sabes hacer parpadear un LED, para controlar varios no necesitas nada nuevo: repites los mismos tres bloques con otros pines. En el proyecto Dos LED parpadeando alternadamente se configuran dos pines como salida: 8 y 9. Dentro de repetir siempre van "escribir ALTO en pin 8" y "escribir BAJO en pin 9", y luego "esperar 200 ms". Después se escribe al revés y se esperan otros 200 ms. El truco está en que los dos bloques de escritura se ejecutan seguidos, sin espera entre ellos, así que los LED parecen cambiar en el mismo instante. El bloque de espera decide cuánto dura cada estado.

El proyecto Semáforo lleva la misma idea a tres LED: rojo en D2, amarillo en D3 y verde en D4. El grupo repetir siempre tiene cuatro fases y todas siguen el mismo patrón: un bloque escribir ALTO o BAJO para cada uno de los tres LED y después un bloque de espera. Los bloques de escritura deciden qué LED queda encendido y el de espera, durante cuánto tiempo. Más bloques no lo hacen más difícil, solo más largo. Una versión con pulsador peatonal, más cercana a un cruce real, está en el artículo semáforo con Arduino.

Bloques del proyecto Semáforo: pines 2, 3 y 4 como salida, bloques escribir ALTO y BAJO en cuatro fases, esperas de 2000 ms y 300 ms
Bloques del Semáforo (proyecto 3): cada fase tiene tres bloques de escritura y uno de espera.
FaseRojo (D2)Amarillo (D3)Verde (D4)Espera
1ALTOBAJOBAJO2000 ms (2 s)
2BAJOALTOBAJO300 ms
3BAJOBAJOALTO2000 ms (2 s)
4BAJOALTOBAJO300 ms
C++ (Arduino IDE)
1// Trafik Lambası (proje 3) / Traffic Light (project 3)
2void setup() {
3  pinMode(2,OUTPUT);    // Kırmızı / Red
4  pinMode(3,OUTPUT);    // Sarı / Yellow
5  pinMode(4,OUTPUT);    // Yeşil / Green
6}
7
8void loop() {
9  // Kırmızı yanar, 2 s bekle / Red on, wait 2 s
10  digitalWrite(2,HIGH);
11  digitalWrite(3,LOW);
12  digitalWrite(4,LOW);
13  delay(2000);
14  // Sarı yanar, 0,3 s bekle / Yellow on, wait 0.3 s
15  digitalWrite(2,LOW);
16  digitalWrite(3,HIGH);
17  digitalWrite(4,LOW);
18  delay(300);
19  // Yeşil yanar, 2 s bekle / Green on, wait 2 s
20  digitalWrite(2,LOW);
21  digitalWrite(3,LOW);
22  digitalWrite(4,HIGH);
23  delay(2000);
24  // Sarı yanar, sonra başa (kırmızıya) dön / Yellow on, then back to red
25  digitalWrite(2,LOW);
26  digitalWrite(3,HIGH);
27  digitalWrite(4,LOW);
28  delay(300);
29}
30

En el proyecto Luces de policía LED aparecen dos tipos de bloque nuevos. El primero es el grupo variables globales (al principio) con el bloque "declarar entero (int) delayTime = 60". Es la línea int delayTime = 60; del código y le pone nombre al tiempo de destello. Como los bloques de espera usan delayTime en lugar de un número, para cambiar la velocidad solo modificas el 60, no cuatro bloques distintos. El segundo es el bloque verde "repetir 3 veces": ejecuta tres veces los cuatro bloques que contiene y en C++ se convierte en el bucle for(int i=0;i<3;i++).

Bloques del proyecto Luces de policía LED: variable delayTime, pines 2 y 3 como salida, dos bloques repetir 3 veces
Bloques de Luces de policía LED (proyecto 4): el LED rojo (D2) destella tres veces y después el azul (D3) otras tres.

Hagamos cuentas: en cada destello el LED rojo está 60 ms encendido y 60 ms apagado, así que un destello dura 120 ms. Tres destellos son 360 ms, y lo mismo para el LED azul. Un ciclo completo dura unos 0,7 segundos. Con delayTime en 30 destella el doble de rápido y con 120, más despacio. Las variables y los bucles son el tema de la parte 4 de la serie; los vemos en detalle en "repetir siempre", bloques de contar y arrays. El proyecto Luz secuencial LED, que hace correr la luz por una fila de LED, es el siguiente paso del mismo camino.

La misma idea en ESP32 y Raspberry Pi Pico

En el ESP32 los bloques son casi idénticos a los de Arduino, porque el ESP32 también se programa en C++ con el Arduino IDE. En el proyecto LED parpadeante con ESP32 el LED está en el GPIO 5 y los bloques de espera son de 500 ms. Las líneas de código también son iguales: pinMode(5, OUTPUT); digitalWrite(5, HIGH); delay(500);. Las únicas diferencias son el número de pin, que los pines del ESP32 dan 3,3 V y que en el Arduino IDE hay que elegir una placa ESP32. Todo lo que aprendes con el Uno pasa directamente al ESP32.

En los proyectos de Raspberry Pi Pico los bloques se convierten en código MicroPython y los nombres de los bloques cambian un poco. En el proyecto LED externo con la Pico el LED está en GP14. El bloque "pin led : GP LED_PIN, SALIDA" corresponde a led = Pin(LED_PIN, Pin.OUT), "encender (on) el pin led" a led.on(), "esperar 0.5 segundos" a time.sleep(0.5) y repetir siempre al bucle while True:. Ojo: en MicroPython la espera va en segundos, no en milisegundos; el delay(500) de Arduino aquí es time.sleep(0.5). Si quieres probar sin ningún cable, el proyecto LED integrado de la Pico enciende el LED de la propia placa en GP25; en la Pico W al LED integrado se accede con el nombre "LED" en lugar de GP25.

MicroPython
1# Pico harici LED (proje 8163), seri port satırları çıkarıldı
2# Pico external LED (project 8163), serial print lines removed
3from machine import Pin
4import time
5
6LED_PIN = 14                    # GP14, herhangi bir boş GPIO / any free GPIO
7led = Pin(LED_PIN, Pin.OUT)     # pini çıkış yap / set the pin as output
8
9while True:                     # sürekli tekrarla / loop forever
10    led.on()                    # LED'i yak / turn the LED on
11    time.sleep(0.5)             # 0,5 saniye bekle / wait 0.5 s
12    led.off()                   # LED'i söndür / turn the LED off
13    time.sleep(0.5)
14

Errores frecuentes y cómo solucionarlos

ErrorSíntomaSolución
LED puesto al revésEl LED no se enciende nuncaPata larga al pin a través de la resistencia, pata corta a GND; dale la vuelta al LED
Sin resistenciaLED demasiado brillante, se calienta, puede fallar prontoPon una resistencia de 220 Ω en serie con el LED
El pin del bloque no coincide con el circuitoEl código se carga bien, pero el LED sigue apagadoEl 9 del bloque y el D9 que cableaste deben coincidir; cambia el cable o el número
Falta el segundo bloque de esperaEl LED parece siempre encendidoDespués del bloque escribir BAJO también tiene que haber una espera (delay)
Espera demasiado corta (p. ej. 5 ms)El LED se ve fijo y algo tenuePrueba al menos 50–100 ms
Las dos patas del LED en la misma fila de la protoboardEl LED no se enciende nuncaPon las patas en filas distintas; los agujeros de una fila están unidos por dentro
Placa o puerto equivocadosEl Arduino IDE da un error al cargarElige la placa y el puerto correctos en el menú Herramientas

Paso a paso en la app: de los bloques a la placa

  1. En BlueGrays, abre el proyecto Parpadeo de LED, que lleva la insignia de bloques en la lista de proyectos. Con el filtro también puedes mostrar solo los proyectos con bloques.
  2. Siguiendo el esquema, coloca en la protoboard el LED, la resistencia de 220 Ω y dos cables.
  3. En la sección de código, activa Ver en bloques. En lugar del código verás los bloques; al tocar la imagen se abre a pantalla completa.
  4. Pasa a la pestaña Entiende los bloques. El programa se explica paso a paso y en cada paso solo ves sus bloques y lo que hacen.
  5. Desactiva el interruptor para volver al código real, cópialo y pégalo en el Arduino IDE. Los bloques no se cargan directamente en la placa; lo que va a la placa es siempre este código.
  6. En el Arduino IDE elige Arduino Uno como placa y el puerto correcto, y pulsa Subir. Si aún no tienes el IDE, el artículo instalar Arduino IDE te guía paso a paso.
  7. Cuando el LED parpadee, cambia las dos líneas delay(100) por delay(1000), vuelve a cargar y comprueba la diferencia con tus propios ojos.

En este artículo el LED siempre parpadeó al mismo ritmo; el programa no escuchaba nada del exterior. El siguiente paso es que la placa tome decisiones: la parte 3 de la serie, el pulsador y el bloque "si", muestra un programa que enciende el LED al pulsar un botón y cómo ese bloque se convierte en if/else en C++.

En la app BlueGrays puedes ver Parpadeo de LED, Dos LED parpadeando alternadamente, Semáforo, Luces de policía LED y los proyectos de LED para ESP32 y Pico con su esquema y su código, pasar a la versión en bloques del mismo programa con Ver en bloques y leer qué hace cada paso con Entiende los bloques.

Preguntas frecuentes

¿Qué es la programación por bloques en Arduino?

Es una forma de mostrar un programa de Arduino con bloques que encajan como piezas de puzle en lugar de texto. Cada bloque, como "escribir ALTO en pin 9" o "esperar 100 ms", corresponde a una línea del código C++ que se carga en la placa. Sin puntos y coma ni paréntesis, quien empieza se centra primero en la lógica del programa.

¿Cómo se enciende un LED con programación por bloques?

En el grupo de configuración pones "configurar pin 9 como SALIDA" y en repetir siempre, en orden, "escribir ALTO en pin 9", "esperar 100 ms", "escribir BAJO en pin 9" y "esperar 100 ms". En el circuito el LED va a D9 a través de una resistencia de 220 Ω. Esos bloques se convierten en las líneas pinMode, digitalWrite y delay.

¿Por qué mi LED se queda encendido en vez de parpadear?

Lo más habitual es que falte el bloque de espera después de escribir BAJO. En ese caso el LED solo se apaga durante microsegundos y el ojo no lo nota. Si las esperas son muy cortas (por ejemplo 5 ms), el LED también parece fijo; prueba con 100 ms o más.

¿Qué resistencia se usa para un LED en Arduino?

En los pines de 5 V de un Arduino Uno, 220 Ω es la opción más común y deja pasar unos 14 mA por un LED rojo. También sirve 330 Ω, con el LED algo más tenue. La resistencia limita la corriente esté en la pata que esté; lo importante es que vaya en serie.

¿Puedo cargar los bloques directamente en el Arduino?

No. Los bloques de BlueGrays hacen que el programa sea más fácil de leer y entender; a la placa siempre va el código real del proyecto. Lo copias en el Arduino IDE (en Thonny para la Pico) y lo cargas desde allí.

¿Cuántos segundos son 1000 ms y cómo cambio la velocidad del parpadeo?

1000 milisegundos son 1 segundo. Un número mayor en los bloques de espera hace el LED más lento y uno menor, más rápido: con 100 ms en los dos bloques parpadea 5 veces por segundo y con 500 ms, una vez por segundo. En los bloques MicroPython de la Pico el tiempo va en segundos, así que 0.5 es medio segundo.

Ver todos los proyectos
Parpadeo de LED
#1Principiante

Parpadeo de LED

El primer hola de la electrónica: encender y apagar un solo LED. El Arduino enciende y apaga el LED a intervalos cortos, así que la luz parpadea rápido. Ves de la forma más sencilla cómo la placa cont

4.6(188)
1127
Dos LED parpadeando alternadamente
#2Principiante

Dos LED parpadeando alternadamente

Dos LED parpadean rápido por turnos: cuando uno se enciende, el otro se apaga, como si se pasaran una pelota. El Arduino deja cada luz encendida una quinta parte de segundo y luego le toca a la otra.

4.6(105)
343
Semáforo
#3Principiante

Semáforo

Una copia en miniatura del semáforo que ves cada día en la calle. El rojo se queda dos segundos, el amarillo brilla un instante, el verde se queda dos segundos y luego vuelve al rojo pasando otra vez

4.8(131)
397
Luces de policía LED
#4Principiante

Luces de policía LED

Como las luces de un coche de policía: el LED rojo destella tres veces muy rápido, después el azul destella otras tres, y la secuencia se repite sin parar. Solo necesitas dos LED y dos resistencias co

4.7(103)
258
Luz secuencial LED
#5Intermedio

Luz secuencial LED

Luces que se encienden una tras otra, como si corrieran. El Arduino enciende seis LED de uno en uno; cada uno brilla un instante y se apaga, así que la luz recorre la fila de principio a fin y vuelve

4.6(85)
207
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(37)
99
ESP32 Semáforo
#107Principiante

ESP32 Semáforo

Simulación de un semáforo real con 3 LED rojo-amarillo-verde. Los tiempos se aproximan a la lógica del tráfico real: rojo largo, amarillo corto, verde largo. Ejemplo clásico de control GPIO secuencial.

4.4(21)
44
Encendido de un LED externo con la Raspberry Pi Pico (placa de pruebas)
#148Principiante

Encendido de un LED externo con la Raspberry Pi Pico (placa de pruebas)

El siguiente paso tras el LED integrado de Pico: conectar un LED externo a la placa de pruebas y controlarlo a través del pin GP14. Con este proyecto aprenderás a utilizar cualquier pin GPIO de uso general del Pico como salida, la polaridad del LED (patilla larga = ánodo/+, patilla corta = cátodo/–) y por qué es imprescindible utilizar una resistencia limitadora de corriente (220 Ω). Si no colocas la resistencia, el LED recibirá una corriente excesiva y podría quemarse. El circuito es muy sencil

4.5(2)
7