El Hello World del hardware es hacer parpadear un LED. Es un ritual sencillo, pero toca todos los puntos importantes de una placa nueva: alimentación, toolchain, GPIO y carga del programa.
Qué necesitas
| Elemento | Detalle |
|---|---|
| Placa | ESP32 DevKitC, ESP32-WROOM-32 o similar |
| LED | Cualquier color, 2 V de caída típica |
| Resistencia | 220 Ω a 330 Ω |
| Software | PlatformIO (recomendado) o Arduino IDE 2.x |
Consejo: muchos DevKits ya traen un LED en el pin
GPIO2. Puedes usarlo para probar sin cablear nada, aunque suele estar invertido.
El pinout, en dos minutos
El ESP32 tiene GPIOs numerados del 0 al 39, pero no todos se pueden usar:
GPIO6–GPIO11están conectados a la memoria flash SPI. No los toques.GPIO34–GPIO39son solo entrada (no tienen pull-up interno).GPIO1(TX0) yGPIO3(RX0) se usan para el puerto serie.GPIO0define el modo de arranque; evita usarlo como salida.
Para un LED, cualquier GPIO de salida sirve. Usaremos GPIO2.
Código con Arduino
El core de Arduino simplifica muchísimo el arranque:
#include <Arduino.h>
constexpr int LED_PIN = 2;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}delay() bloquea (y a veces importa)
delay() detiene la CPU entera. En un parpadeo da igual, pero en cuanto
añadas Wi-Fi o varios sensores querrás usar millis():
unsigned long last = 0;
constexpr unsigned long INTERVAL = 1000;
void loop() {
if (millis() - last >= INTERVAL) {
last = millis();
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}
}Lo mismo con ESP-IDF (Rust)
Si prefieres Rust, el crate esp-idf-hal ofrece una API tipada. Así se ve
un blink con esp-idf-svc:
use esp_idf_svc::hal::delay::FreeRtos;
use esp_idf_svc::hal::gpio::PinDriver;
use esp_idf_svc::hal::peripherals::Peripherals;
fn main() -> anyhow::Result<()> {
esp_idf_svc::sys::link_patches();
let peripherals = Peripherals::take()?;
let mut led = PinDriver::output(peripherals.pins.gpio2)?;
loop {
led.set_high()?;
FreeRtos::delay_ms(1000);
led.set_low()?;
FreeRtos::delay_ms(1000);
}
}
La gran diferencia: en Rust el compilador te obliga a declarar el pin como salida antes de escribirlo. Muchos errores de hardware desaparecen en tiempo de compilación.
Configuración con PlatformIO
platformio.ini mínimo para el core de Arduino:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
Y para Rust con esp-idf:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = espidf
monitor_speed = 115200Comprobaciones si no funciona
- No compila / no encuentra la placa. Instala los drivers
cp210xoch34xsegún el chip USB de tu placa. - Se sube pero no parpadea. Revisa la polaridad del LED y la resistencia.
- Se reinicia en bucle. Suele ser falta de corriente: usa un puerto USB que entregue al menos 500 mA.
Siguiente paso
Con el GPIO dominado, ya tienes lo esencial. El siguiente salto natural es la conectividad (Wi-Fi, MQTT), que iremos cubriendo en el blog. De momento, puedes seguir con el monitor serie y depuración o volver al hub de la serie.