<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
    <title>TunaTek ESP32</title>
    <subtitle>Tutoriales, proyectos y notas sobre el microcontrolador ESP32: GPIO, Wi-Fi, BLE, MQTT, energía y más.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://esp32.tunatek.tech/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-07T00:00:00+00:00</updated>
    <id>https://esp32.tunatek.tech/atom.xml</id>
    <entry xml:lang="es">
        <title>Monitor serie y depuración en el ESP32: deja de adivinar</title>
        <published>2026-10-07T00:00:00+00:00</published>
        <updated>2026-10-07T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/monitor-serie-depuracion-esp32/"/>
        <id>https://esp32.tunatek.tech/blog/monitor-serie-depuracion-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/monitor-serie-depuracion-esp32/">&lt;p&gt;Cuando algo no funciona, la tentación es cambiar código a ciegas. Eso alarga el
problema. Lo que de verdad ahorra tiempo es &lt;strong&gt;ver qué está pasando&lt;/strong&gt;. Y para eso
tienes el monitor serie y los logs.&lt;/p&gt;
&lt;h2 id=&quot;el-monitor-serie-bien-configurado&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#el-monitor-serie-bien-configurado&quot; aria-label=&quot;Anchor link for: el-monitor-serie-bien-configurado&quot;&gt;El monitor serie, bien configurado&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;begin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;115200&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Arrancando…&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tres cosas que casi todos olvidan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La velocidad debe coincidir&lt;/strong&gt; (115200 es el estándar). Si ves &lt;code&gt;����&lt;/code&gt;, no
coincide.&lt;/li&gt;
&lt;li&gt;Tras &lt;code&gt;Serial.begin()&lt;/code&gt; da un respiro antes de imprimir; a veces las primeras
líneas se pierden.&lt;/li&gt;
&lt;li&gt;El monitor &lt;strong&gt;resetea la placa&lt;/strong&gt; al abrirse en muchas configuraciones: no te
asustes si «arranca solo».&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si no ves nada:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;¿Está el monitor en el &lt;strong&gt;puerto correcto&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;¿La placa usa &lt;strong&gt;USB nativo&lt;/strong&gt; (S3/C3) y estás mirando el puerto equivocado?&lt;/li&gt;
&lt;li&gt;¿Cerraste otro programa que tenía el puerto abierto?&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;logs-por-niveles-si-usas-esp-idf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#logs-por-niveles-si-usas-esp-idf&quot; aria-label=&quot;Anchor link for: logs-por-niveles-si-usas-esp-idf&quot;&gt;Logs por niveles (si usas ESP-IDF)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En lugar de &lt;code&gt;printf&lt;/code&gt; a lo loco, usa niveles:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;include&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;esp_log.h&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; char&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;/span&gt;&lt;span&gt;TAG &lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ESP_LOGI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;info&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ESP_LOGW&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;aviso&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ESP_LOGE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puedes subir o bajar el nivel &lt;strong&gt;por componente&lt;/strong&gt; desde &lt;code&gt;menuconfig&lt;/code&gt;, y en
producción dejar solo errores. Eso no lo da un &lt;code&gt;printf&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;los-mensajes-que-te-estan-contando-el-problema&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-mensajes-que-te-estan-contando-el-problema&quot; aria-label=&quot;Anchor link for: los-mensajes-que-te-estan-contando-el-problema&quot;&gt;Los mensajes que te están contando el problema&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Al arrancar, el ESP32 imprime un montón de información útil:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rst:0x...&lt;/code&gt;&lt;/strong&gt; → por qué se reinició: power-on, watchdog, pánico, brownout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Brownout detector was triggered&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;falta de corriente&lt;/strong&gt;. Cambia el
cable, el puerto USB o añade un condensador.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Guru Meditation Error&lt;/code&gt;&lt;/strong&gt; → un &lt;em&gt;panic&lt;/em&gt;. Debajo viene un &lt;strong&gt;backtrace&lt;/strong&gt; con las
direcciones; con &lt;code&gt;idf.py monitor&lt;/code&gt; se traduce solo a nombres de función.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Task watchdog got triggered&lt;/code&gt;&lt;/strong&gt; → tu &lt;code&gt;loop()&lt;/code&gt; o una tarea se quedó atascada.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aprender a leer &lt;strong&gt;esas cuatro líneas&lt;/strong&gt; resuelve la mitad de los problemas.&lt;/p&gt;
&lt;h2 id=&quot;tecnicas-que-funcionan&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tecnicas-que-funcionan&quot; aria-label=&quot;Anchor link for: tecnicas-que-funcionan&quot;&gt;Técnicas que funcionan&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bisección&lt;/strong&gt;: comenta la mitad del código. El problema está en la otra
mitad. Repite.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Serial.println&lt;/code&gt; estratégico&lt;/strong&gt;: marca por dónde pasa, no valores sueltos.
Mejor &lt;code&gt;[sensor] leído: %d&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LED de estado&lt;/strong&gt;: un LED que parpadea rápido = «estoy aquí». Sin monitor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multímetro&lt;/strong&gt;: mide alimentación y niveles antes de culpar al código.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analizador lógico&lt;/strong&gt; (barato): imprescindible para I2C/SPI. Ver el bus es
otro nivel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JTAG&lt;/strong&gt; (S3/C3): puntos de ruptura de verdad cuando el bug es escurridizo.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;errores-tipicos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos&quot; aria-label=&quot;Anchor link for: errores-tipicos&quot;&gt;Errores típicos&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cambiar código al azar&lt;/strong&gt; sin mirar el monitor.&lt;/li&gt;
&lt;li&gt;Ignorar un &lt;strong&gt;brownout&lt;/strong&gt; pensando que es software.&lt;/li&gt;
&lt;li&gt;No leer el &lt;strong&gt;backtrace&lt;/strong&gt; (ahí está la línea exacta).&lt;/li&gt;
&lt;li&gt;Usar &lt;code&gt;delay()&lt;/code&gt; en el loop y comerse el &lt;strong&gt;watchdog&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Depurar a 9600 baudios y esperar que salga todo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;un-loop-que-no-bloquea-y-no-dispara-el-watchdog&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#un-loop-que-no-bloquea-y-no-dispara-el-watchdog&quot; aria-label=&quot;Anchor link for: un-loop-que-no-bloquea-y-no-dispara-el-watchdog&quot;&gt;Un &lt;code&gt;loop()&lt;/code&gt; que no bloquea (y no dispara el watchdog)&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;unsigned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; long&lt;/span&gt;&lt;span&gt; last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;/span&gt;&lt;span&gt; last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; trabajo pesado aquí&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; el resto del tiempo, respira&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Configura el &lt;strong&gt;monitor a 115200&lt;/strong&gt; y comprueba puerto y velocidad.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;logs con nivel&lt;/strong&gt; (ESP-IDF) en lugar de &lt;code&gt;printf&lt;/code&gt; sueltos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rst:&lt;/code&gt;, brownout, backtrace y watchdog&lt;/strong&gt; te dicen qué pasa; apréndelos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bisección + LED de estado + multímetro&lt;/strong&gt; resuelven la mayoría.&lt;/li&gt;
&lt;li&gt;Para buses (I2C/SPI), un &lt;strong&gt;analizador lógico&lt;/strong&gt; vale su peso en oro.&lt;/li&gt;
&lt;li&gt;Cuando el bug se esconde, &lt;strong&gt;JTAG&lt;/strong&gt; (S3/C3).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; con esto cierras la &lt;em&gt;Introducción al ESP32&lt;/em&gt;. Ahora puedes
seguir con &lt;a href=&quot;https://esp32.tunatek.tech/explorar/&quot;&gt;Explorar&lt;/a&gt; o volver al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Leer un pulsador bien: pull-up, antirrebote e interrupciones</title>
        <published>2026-10-06T00:00:00+00:00</published>
        <updated>2026-10-06T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/pulsador-antirrebote-esp32/"/>
        <id>https://esp32.tunatek.tech/blog/pulsador-antirrebote-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/pulsador-antirrebote-esp32/">&lt;p&gt;Leer un botón parece lo más fácil del mundo: &lt;code&gt;digitalRead()&lt;/code&gt; y ya. Y luego pasa
lo de siempre: una pulsación cuenta como cinco, o el pin lee ruido aleatorio
cuando nadie toca nada. Ambas cosas tienen explicación y solución.&lt;/p&gt;
&lt;h2 id=&quot;primero-nunca-dejes-un-pin-al-aire&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#primero-nunca-dejes-un-pin-al-aire&quot; aria-label=&quot;Anchor link for: primero-nunca-dejes-un-pin-al-aire&quot;&gt;Primero: nunca dejes un pin «al aire»&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si conectas un botón entre el pin y &lt;code&gt;3V3&lt;/code&gt; sin nada más, cuando &lt;strong&gt;no&lt;/strong&gt; está
pulsado el pin queda flotando y lee basura. Necesitas una resistencia que lo
lleve a un nivel conocido:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pull-up&lt;/strong&gt;: el pin a &lt;code&gt;HIGH&lt;/code&gt; en reposo; al pulsar, a &lt;code&gt;GND&lt;/code&gt;. &lt;strong&gt;Es lo que uso
casi siempre.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull-down&lt;/strong&gt;: el pin a &lt;code&gt;LOW&lt;/code&gt; en reposo; al pulsar, a &lt;code&gt;3V3&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El ESP32 tiene &lt;strong&gt;pull-up interno&lt;/strong&gt;, así que normalmente no hace falta resistencia:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;constexpr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; int&lt;/span&gt;&lt;span&gt; BTN&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;begin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;115200&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  pinMode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BTN&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; INPUT_PULLUP&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;   //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; reposo = HIGH, pulsado = LOW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;digitalRead&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BTN&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; ==&lt;/span&gt;&lt;span&gt; LOW&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;pulsado&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Ojo: los &lt;strong&gt;GPIO34–39 no tienen pull-up interno&lt;/strong&gt; (son solo entrada). Si usas
uno de esos, necesitas resistencia externa.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;por-que-rebota-y-por-que-ves-5-pulsaciones&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#por-que-rebota-y-por-que-ves-5-pulsaciones&quot; aria-label=&quot;Anchor link for: por-que-rebota-y-por-que-ves-5-pulsaciones&quot;&gt;Por qué «rebota» (y por qué ves 5 pulsaciones)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un pulsador &lt;strong&gt;no&lt;/strong&gt; pasa de &lt;code&gt;HIGH&lt;/code&gt; a &lt;code&gt;LOW&lt;/code&gt; limpiamente. Durante unos milisegundos
hace contacto y lo pierde varias veces. El ESP32, que va a 240 MHz, &lt;strong&gt;lo detecta
todo&lt;/strong&gt;. Eso es el &lt;em&gt;bounce&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;antirrebote-por-software-mi-favorito&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#antirrebote-por-software-mi-favorito&quot; aria-label=&quot;Anchor link for: antirrebote-por-software-mi-favorito&quot;&gt;Antirrebote por software (mi favorito)&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;constexpr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; int&lt;/span&gt;&lt;span&gt; BTN&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;constexpr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; unsigned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; long&lt;/span&gt;&lt;span&gt; DEBOUNCE_MS&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 30&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;bool&lt;/span&gt;&lt;span&gt; estable&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span&gt; HIGH&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;bool&lt;/span&gt;&lt;span&gt; ultimo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span&gt; HIGH&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;unsigned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; long&lt;/span&gt;&lt;span&gt; cambio&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  bool&lt;/span&gt;&lt;span&gt; lectura&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; digitalRead&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BTN&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;lectura&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !=&lt;/span&gt;&lt;span&gt; ultimo&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cambio&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ultimo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span&gt; lectura&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;/span&gt;&lt;span&gt; cambio&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; DEBOUNCE_MS&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; lectura&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !=&lt;/span&gt;&lt;span&gt; estable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    estable&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span&gt; lectura&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;estable&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; ==&lt;/span&gt;&lt;span&gt; LOW&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;pulsación válida&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La idea: solo aceptas un cambio si se mantiene &lt;strong&gt;estable&lt;/strong&gt; 30 ms. Es
suficiente para el 99 % de los botones.&lt;/p&gt;
&lt;h2 id=&quot;antirrebote-por-hardware&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#antirrebote-por-hardware&quot; aria-label=&quot;Anchor link for: antirrebote-por-hardware&quot;&gt;Antirrebote por hardware&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si el botón es crítico o hay mucho ruido, un &lt;strong&gt;RC&lt;/strong&gt; (10 kΩ + 100 nF) y, si hace
falta, un &lt;strong&gt;Schmitt trigger&lt;/strong&gt; (74HC14) lo arreglan. Más piezas, pero cero
código.&lt;/p&gt;
&lt;h2 id=&quot;interrupciones-potentes-y-peligrosas&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#interrupciones-potentes-y-peligrosas&quot; aria-label=&quot;Anchor link for: interrupciones-potentes-y-peligrosas&quot;&gt;Interrupciones: potentes y peligrosas&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;attachInterrupt()&lt;/code&gt; el ESP32 ejecuta tu función al instante. Es ideal para
no perder pulsaciones, pero tiene reglas:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;volatile&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; bool&lt;/span&gt;&lt;span&gt; pulsado&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; IRAM_ATTR&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; alPulsar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;   //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; IRAM_ATTR: debe vivir en IRAM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  pulsado&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  pinMode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BTN&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; INPUT_PULLUP&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  attachInterrupt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;digitalPinToInterrupt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BTN&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; alPulsar&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; FALLING&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;pulsado&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    pulsado&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;interrupción&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reglas de oro:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La variable compartida debe ser &lt;strong&gt;&lt;code&gt;volatile&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La función debe llevar &lt;strong&gt;&lt;code&gt;IRAM_ATTR&lt;/code&gt;&lt;/strong&gt; (si no, puede fallar con el Wi-Fi).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No hagas trabajo pesado dentro de la ISR&lt;/strong&gt;: marca una bandera y procésala en
el &lt;code&gt;loop()&lt;/code&gt;. Nada de &lt;code&gt;Serial.print&lt;/code&gt; ni &lt;code&gt;delay&lt;/code&gt; ahí dentro.&lt;/li&gt;
&lt;li&gt;Aun con interrupción, &lt;strong&gt;el rebote existe&lt;/strong&gt;: añade antirrebote igualmente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;errores-tipicos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos&quot; aria-label=&quot;Anchor link for: errores-tipicos&quot;&gt;Errores típicos&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Botón sin pull-up y pines leyendo ruido → crees que el ESP32 está roto.&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;GPIO34–39&lt;/strong&gt; para un botón y descubrir que no hay pull-up interno.&lt;/li&gt;
&lt;li&gt;Poner &lt;code&gt;Serial.println&lt;/code&gt; dentro de la ISR → cuelgues aleatorios.&lt;/li&gt;
&lt;li&gt;Olvidar &lt;code&gt;volatile&lt;/code&gt; → el compilador «optimiza» y la bandera nunca cambia.&lt;/li&gt;
&lt;li&gt;No hacer antirrebote y contar 5 pulsaciones por cada una.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nunca&lt;/strong&gt; dejes un pin de entrada flotando: usa &lt;strong&gt;&lt;code&gt;INPUT_PULLUP&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Los botones &lt;strong&gt;rebotan&lt;/strong&gt;; con 30 ms de antirrebote se soluciona.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interrupciones&lt;/strong&gt;: &lt;code&gt;volatile&lt;/code&gt;, &lt;code&gt;IRAM_ATTR&lt;/code&gt;, trabajo mínimo y antirrebote
también.&lt;/li&gt;
&lt;li&gt;GPI34–39 no tienen pull-up: resistencia externa obligatoria.&lt;/li&gt;
&lt;li&gt;Con hardware (RC + Schmitt) te ahorras código si el ruido es serio.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;monitor serie y depuración básica&lt;/a&gt;,
para dejar de adivinar por qué no funciona. O vuelve al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Primeros pasos con el ESP32: parpadea un LED</title>
        <published>2026-10-05T00:00:00+00:00</published>
        <updated>2026-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/primeros-pasos-esp32-blink/"/>
        <id>https://esp32.tunatek.tech/blog/primeros-pasos-esp32-blink/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/primeros-pasos-esp32-blink/">&lt;p&gt;El &lt;em&gt;Hello World&lt;/em&gt; del hardware es hacer parpadear un LED. Es un ritual sencillo,
pero toca todos los puntos importantes de una placa nueva: &lt;strong&gt;alimentación&lt;/strong&gt;,
&lt;strong&gt;toolchain&lt;/strong&gt;, &lt;strong&gt;GPIO&lt;/strong&gt; y &lt;strong&gt;carga del programa&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;que-necesitas&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-necesitas&quot; aria-label=&quot;Anchor link for: que-necesitas&quot;&gt;Qué necesitas&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Elemento&lt;/th&gt;&lt;th&gt;Detalle&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Placa&lt;/td&gt;&lt;td&gt;ESP32 DevKitC, ESP32-WROOM-32 o similar&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;LED&lt;/td&gt;&lt;td&gt;Cualquier color, 2 V de caída típica&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Resistencia&lt;/td&gt;&lt;td&gt;220 Ω a 330 Ω&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Software&lt;/td&gt;&lt;td&gt;PlatformIO (recomendado) o Arduino IDE 2.x&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Consejo:&lt;/strong&gt; muchos DevKits ya traen un LED en el pin &lt;code&gt;GPIO2&lt;/code&gt;. Puedes usarlo
para probar sin cablear nada, aunque suele estar invertido.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;el-pinout-en-dos-minutos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#el-pinout-en-dos-minutos&quot; aria-label=&quot;Anchor link for: el-pinout-en-dos-minutos&quot;&gt;El pinout, en dos minutos&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El ESP32 tiene GPIOs numerados del 0 al 39, pero &lt;strong&gt;no todos se pueden usar&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GPIO6&lt;/code&gt;–&lt;code&gt;GPIO11&lt;/code&gt; están conectados a la memoria flash SPI. &lt;strong&gt;No los toques.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPIO34&lt;/code&gt;–&lt;code&gt;GPIO39&lt;/code&gt; son &lt;strong&gt;solo entrada&lt;/strong&gt; (no tienen pull-up interno).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPIO1&lt;/code&gt; (&lt;code&gt;TX0&lt;/code&gt;) y &lt;code&gt;GPIO3&lt;/code&gt; (&lt;code&gt;RX0&lt;/code&gt;) se usan para el puerto serie.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPIO0&lt;/code&gt; define el modo de arranque; evita usarlo como salida.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para un LED, cualquier GPIO de salida sirve. Usaremos &lt;code&gt;GPIO2&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;codigo-con-arduino&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#codigo-con-arduino&quot; aria-label=&quot;Anchor link for: codigo-con-arduino&quot;&gt;Código con Arduino&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El &lt;em&gt;core&lt;/em&gt; de Arduino simplifica muchísimo el arranque:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;include&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Arduino.h&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;constexpr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; int&lt;/span&gt;&lt;span&gt; LED_PIN&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  pinMode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;LED_PIN&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; OUTPUT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  digitalWrite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;LED_PIN&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; HIGH&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  delay&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  digitalWrite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;LED_PIN&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; LOW&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  delay&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;delay-bloquea-y-a-veces-importa&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#delay-bloquea-y-a-veces-importa&quot; aria-label=&quot;Anchor link for: delay-bloquea-y-a-veces-importa&quot;&gt;&lt;code&gt;delay()&lt;/code&gt; bloquea (y a veces importa)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;delay()&lt;/code&gt; detiene la CPU entera. En un parpadeo da igual, pero en cuanto
añadas Wi-Fi o varios sensores querrás usar &lt;code&gt;millis()&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;unsigned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; long&lt;/span&gt;&lt;span&gt; last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;constexpr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; unsigned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; long&lt;/span&gt;&lt;span&gt; INTERVAL&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;/span&gt;&lt;span&gt; last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span&gt; INTERVAL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    digitalWrite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;LED_PIN&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;digitalRead&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;LED_PIN&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;lo-mismo-con-esp-idf-rust&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-mismo-con-esp-idf-rust&quot; aria-label=&quot;Anchor link for: lo-mismo-con-esp-idf-rust&quot;&gt;Lo mismo con ESP-IDF (Rust)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si prefieres &lt;strong&gt;Rust&lt;/strong&gt;, el crate &lt;code&gt;esp-idf-hal&lt;/code&gt; ofrece una API tipada. Así se ve
un &lt;em&gt;blink&lt;/em&gt; con &lt;code&gt;esp-idf-svc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; esp_idf_svc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;hal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delay&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;FreeRtos&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; esp_idf_svc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;hal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;gpio&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;PinDriver&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; esp_idf_svc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;hal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;peripherals&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Peripherals&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; anyhow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    esp_idf_svc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;link_patches&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; peripherals&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Peripherals&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;take&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; PinDriver&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;output&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;peripherals&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span&gt;pins&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span&gt;gpio2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    loop&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;set_high&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        FreeRtos&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delay_ms&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;set_low&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        FreeRtos&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delay_ms&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La gran diferencia: en Rust el compilador &lt;strong&gt;te obliga&lt;/strong&gt; a declarar el pin como
salida antes de escribirlo. Muchos errores de hardware desaparecen en tiempo de
compilación.&lt;/p&gt;
&lt;h2 id=&quot;configuracion-con-platformio&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#configuracion-con-platformio&quot; aria-label=&quot;Anchor link for: configuracion-con-platformio&quot;&gt;Configuración con PlatformIO&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;platformio.ini&lt;/code&gt; mínimo para el &lt;em&gt;core&lt;/em&gt; de Arduino:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;env:esp32dev&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;platform&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; espressif32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;board&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; esp32dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;framework&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; arduino&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;monitor_speed&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 115200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Y para Rust con &lt;code&gt;esp-idf&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;env:esp32dev&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;platform&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; espressif32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;board&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; esp32dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;framework&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; espidf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;monitor_speed&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 115200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;comprobaciones-si-no-funciona&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#comprobaciones-si-no-funciona&quot; aria-label=&quot;Anchor link for: comprobaciones-si-no-funciona&quot;&gt;Comprobaciones si no funciona&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No compila / no encuentra la placa.&lt;/strong&gt; Instala los drivers
&lt;code&gt;cp210x&lt;/code&gt; o &lt;code&gt;ch34x&lt;/code&gt; según el chip USB de tu placa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Se sube pero no parpadea.&lt;/strong&gt; Revisa la polaridad del LED y la resistencia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Se reinicia en bucle.&lt;/strong&gt; Suele ser falta de corriente: usa un puerto USB
que entregue al menos 500 mA.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;siguiente-paso&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#siguiente-paso&quot; aria-label=&quot;Anchor link for: siguiente-paso&quot;&gt;Siguiente paso&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;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 &lt;a href=&quot;https://esp32.tunatek.tech/blog/monitor-serie-depuracion-esp32/&quot;&gt;monitor serie y depuración&lt;/a&gt;
o volver al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>VS Code + ESP-IDF: el entorno oficial con JTAG incluido</title>
        <published>2026-10-04T00:00:00+00:00</published>
        <updated>2026-10-04T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/vscode-esp-idf/"/>
        <id>https://esp32.tunatek.tech/blog/vscode-esp-idf/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/vscode-esp-idf/">&lt;p&gt;Si has decidido usar &lt;strong&gt;ESP-IDF&lt;/strong&gt;, la extensión oficial para VS Code te da lo
mejor de los dos mundos: la comodidad de un editor moderno y &lt;strong&gt;depuración por
JTAG&lt;/strong&gt; de verdad.&lt;/p&gt;
&lt;h2 id=&quot;instalacion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#instalacion&quot; aria-label=&quot;Anchor link for: instalacion&quot;&gt;Instalación&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;En VS Code, instala la extensión &lt;strong&gt;ESP-IDF&lt;/strong&gt; (de Espressif).&lt;/li&gt;
&lt;li&gt;Ejecuta el &lt;em&gt;setup wizard&lt;/em&gt; (icono de ESP-IDF → &lt;strong&gt;Setup&lt;/strong&gt;). La extensión
descarga ESP-IDF, el &lt;em&gt;toolchain&lt;/em&gt; y Python.&lt;/li&gt;
&lt;li&gt;Elige la versión: hoy &lt;strong&gt;ESP-IDF 6.1&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tarda bastante porque baja todo (ESP-IDF es grande). Es normal.&lt;/p&gt;
&lt;h2 id=&quot;crear-un-proyecto&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#crear-un-proyecto&quot; aria-label=&quot;Anchor link for: crear-un-proyecto&quot;&gt;Crear un proyecto&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;ESP-IDF: New Project&lt;/em&gt; → plantilla (&lt;code&gt;sample_project&lt;/code&gt;, &lt;code&gt;blink&lt;/code&gt;…), nombre y chip.
La estructura es la de ESP-IDF:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mi-proyecto/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── CMakeLists.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── sdkconfig&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── main/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ├── CMakeLists.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    └── main.c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;menuconfig-desde-vs-code&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#menuconfig-desde-vs-code&quot; aria-label=&quot;Anchor link for: menuconfig-desde-vs-code&quot;&gt;&lt;code&gt;menuconfig&lt;/code&gt; desde VS Code&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;ESP-IDF: SDK Configuration Editor&lt;/em&gt; abre &lt;code&gt;menuconfig&lt;/code&gt; en una vista web
integrada: cambias opciones, buscas por texto y guarda el &lt;code&gt;sdkconfig&lt;/code&gt;. Mucho más
cómodo que la terminal.&lt;/p&gt;
&lt;h2 id=&quot;compilar-flashear-y-monitorizar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#compilar-flashear-y-monitorizar&quot; aria-label=&quot;Anchor link for: compilar-flashear-y-monitorizar&quot;&gt;Compilar, flashear y monitorizar&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En la barra inferior tienes los botones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Build&lt;/strong&gt;, &lt;strong&gt;Flash&lt;/strong&gt;, &lt;strong&gt;Monitor&lt;/strong&gt; y &lt;strong&gt;Build + Flash + Monitor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Selección de &lt;strong&gt;puerto serie&lt;/strong&gt; y &lt;strong&gt;velocidad de monitor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Selección de &lt;strong&gt;target&lt;/strong&gt; (&lt;code&gt;esp32&lt;/code&gt;, &lt;code&gt;esp32s3&lt;/code&gt;, &lt;code&gt;esp32c3&lt;/code&gt;…).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Equivale a:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;idf.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;idf.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; /dev/ttyUSB0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; flash&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; monitor&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;depuracion-por-jtag&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#depuracion-por-jtag&quot; aria-label=&quot;Anchor link for: depuracion-por-jtag&quot;&gt;Depuración por JTAG&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aquí está la joya. Con una placa ESP32-S3/C3 (y su USB nativo) o una sonda
externa, tienes &lt;strong&gt;puntos de ruptura&lt;/strong&gt;, &lt;em&gt;step over&lt;/em&gt;, inspección de variables y
pila de llamadas — sin &lt;code&gt;printf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En ESP-IDF se configura con &lt;code&gt;idf.py openocd&lt;/code&gt; y la extensión lo integra. Es de las
cosas que más tiempo ahorran cuando un bug no se deja ver.&lt;/p&gt;
&lt;h2 id=&quot;extensiones-que-pegan-bien&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#extensiones-que-pegan-bien&quot; aria-label=&quot;Anchor link for: extensiones-que-pegan-bien&quot;&gt;Extensiones que pegan bien&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C/C++&lt;/strong&gt; (IntelliSense) — la extensión la configura.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;clang-format&lt;/strong&gt; — formato automático al guardar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error Lens&lt;/strong&gt; — errores en línea, sin abrir la consola.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cuando-elegirlo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegirlo&quot; aria-label=&quot;Anchor link for: cuando-elegirlo&quot;&gt;Cuándo elegirlo&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sí&lt;/strong&gt;: vas en serio con ESP-IDF, quieres &lt;code&gt;menuconfig&lt;/code&gt; cómodo y depurar por
JTAG.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No&lt;/strong&gt;: si usas Arduino o MicroPython (no aplica) o si te vale la línea de
comandos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;La extensión &lt;strong&gt;ESP-IDF&lt;/strong&gt; instala el SDK y el &lt;em&gt;toolchain&lt;/em&gt; por ti.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;menuconfig&lt;/code&gt;&lt;/strong&gt; integrado, con búsqueda.&lt;/li&gt;
&lt;li&gt;Botones de build/flash/monitor y selección de chip y puerto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JTAG&lt;/strong&gt; para depurar de verdad (S3/C3 o sonda externa).&lt;/li&gt;
&lt;li&gt;Versión actual de ESP-IDF: &lt;strong&gt;6.1&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; el bloque práctico:
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;parpadea un LED&lt;/a&gt; con lo que ya tienes montado. O
vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>VS Code + PlatformIO para ESP32: el entorno que uso a diario</title>
        <published>2026-10-03T00:00:00+00:00</published>
        <updated>2026-10-03T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/vscode-platformio-esp32/"/>
        <id>https://esp32.tunatek.tech/blog/vscode-platformio-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/vscode-platformio-esp32/">&lt;p&gt;Si tuviera que quedarme con un solo entorno para el ESP32, sería este. PlatformIO
convierte VS Code en un IDE de verdad: &lt;strong&gt;build, upload, monitor y depuración&lt;/strong&gt;,
con la configuración del proyecto en un fichero de texto.&lt;/p&gt;
&lt;h2 id=&quot;instalacion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#instalacion&quot; aria-label=&quot;Anchor link for: instalacion&quot;&gt;Instalación&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Instala &lt;strong&gt;VS Code&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;En &lt;em&gt;Extensions&lt;/em&gt;, busca &lt;strong&gt;PlatformIO IDE&lt;/strong&gt; e instálala.&lt;/li&gt;
&lt;li&gt;Espera a que termine de preparar el &lt;em&gt;toolchain&lt;/em&gt; la primera vez.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Y ya. PlatformIO se encarga de descargar compiladores y herramientas por ti.&lt;/p&gt;
&lt;h2 id=&quot;crear-un-proyecto&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#crear-un-proyecto&quot; aria-label=&quot;Anchor link for: crear-un-proyecto&quot;&gt;Crear un proyecto&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;PlatformIO Home → New Project&lt;/em&gt;: nombre, placa (&lt;code&gt;Espressif ESP32 Dev Module&lt;/code&gt;) y
framework (&lt;code&gt;Arduino&lt;/code&gt; o &lt;code&gt;ESP-IDF&lt;/code&gt;). La estructura que genera:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mi-proyecto/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── platformio.ini     # configuración&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── src/main.cpp       # tu código&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── lib/               # librerías propias&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;platformio-ini-el-corazon&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#platformio-ini-el-corazon&quot; aria-label=&quot;Anchor link for: platformio-ini-el-corazon&quot;&gt;&lt;code&gt;platformio.ini&lt;/code&gt;: el corazón&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;env:esp32dev&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;platform&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; espressif32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;board&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; esp32dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;framework&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; arduino&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;monitor_speed&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 115200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;upload_speed&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 921600&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cambiar de placa es cambiar &lt;strong&gt;una línea&lt;/strong&gt;. Esto es oro cuando tienes varios
proyectos:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;env:s3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;platform&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; espressif32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;board&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; esp32-s3-devkitc-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;framework&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; arduino&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;monitor_speed&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 115200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;env:c3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;platform&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; espressif32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;board&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; esp32-c3-devkitm-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;framework&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; arduino&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eliges el entorno en la barra inferior y subes.&lt;/p&gt;
&lt;h2 id=&quot;subir-y-monitorizar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#subir-y-monitorizar&quot; aria-label=&quot;Anchor link for: subir-y-monitorizar&quot;&gt;Subir y monitorizar&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En la barra de estado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;✓ Build&lt;/strong&gt; — compila.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;→ Upload&lt;/strong&gt; — compila y sube.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🔌 Serial Monitor&lt;/strong&gt; — abre el monitor a los baudios que pusiste.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O desde la terminal:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;pio&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; upload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;pio&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; device&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; monitor&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;librerias-por-proyecto&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#librerias-por-proyecto&quot; aria-label=&quot;Anchor link for: librerias-por-proyecto&quot;&gt;Librerías por proyecto&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En lugar de instalarlas globalmente, las declaras:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;lib_deps&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    adafruit/Adafruit BME280 Library@^2.2.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    knolleary/PubSubClient@^2.8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ventaja enorme: &lt;strong&gt;el proyecto lleva sus propias versiones&lt;/strong&gt;. Si mañana una
librería rompe, tu código sigue igual.&lt;/p&gt;
&lt;h2 id=&quot;depuracion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#depuracion&quot; aria-label=&quot;Anchor link for: depuracion&quot;&gt;Depuración&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Con una placa que lo soporte (ESP32-S3/C3) y una sonda JTAG:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;debug_tool&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; esp-builtin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Y ya tienes &lt;strong&gt;puntos de ruptura&lt;/strong&gt; de verdad, no &lt;code&gt;printf&lt;/code&gt;. Es el salto de calidad
cuando el proyecto crece.&lt;/p&gt;
&lt;h2 id=&quot;lo-que-me-gusta-y-lo-que-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-que-me-gusta-y-lo-que-no&quot; aria-label=&quot;Anchor link for: lo-que-me-gusta-y-lo-que-no&quot;&gt;Lo que me gusta (y lo que no)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;A favor:&lt;/strong&gt; un entorno para casi todo, configuración versionable, dependencias
por proyecto, debugging real, multiplataforma.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En contra:&lt;/strong&gt; la primera compilación descarga mucho; y si eres nuevo, hay más
conceptos que en el Arduino IDE.&lt;/p&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Instala &lt;strong&gt;PlatformIO IDE&lt;/strong&gt; en VS Code y olvídate del resto.&lt;/li&gt;
&lt;li&gt;Toda la configuración vive en &lt;strong&gt;&lt;code&gt;platformio.ini&lt;/code&gt;&lt;/strong&gt; (versionable).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;lib_deps&lt;/code&gt;&lt;/strong&gt; fija las librerías &lt;strong&gt;por proyecto&lt;/strong&gt;, no globalmente.&lt;/li&gt;
&lt;li&gt;Cambiar de placa es cambiar una línea: ideal para tener un &lt;code&gt;env&lt;/code&gt; por variante.&lt;/li&gt;
&lt;li&gt;Con JTAG tienes &lt;strong&gt;depuración real&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;VS Code + ESP-IDF&lt;/a&gt; si vas a fondo
con el SDK oficial. O vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Arduino IDE 2.x para ESP32: instalación paso a paso (y los errores de siempre)</title>
        <published>2026-10-02T00:00:00+00:00</published>
        <updated>2026-10-02T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/arduino-ide-esp32/"/>
        <id>https://esp32.tunatek.tech/blog/arduino-ide-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/arduino-ide-esp32/">&lt;p&gt;El Arduino IDE 2.x es la forma más rápida de tener un LED parpadeando. Tiene
fricciones conocidas (placas, drivers, puerto), así que aquí va la guía con los
tropiezos típicos ya resueltos.&lt;/p&gt;
&lt;h2 id=&quot;1-instalar-el-ide&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-instalar-el-ide&quot; aria-label=&quot;Anchor link for: 1-instalar-el-ide&quot;&gt;1. Instalar el IDE&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Descárgalo de arduino.cc (versión 2.x). Trae editor, gestor de librerías, monitor
serie y gestor de placas.&lt;/p&gt;
&lt;h2 id=&quot;2-anadir-el-soporte-de-esp32&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-anadir-el-soporte-de-esp32&quot; aria-label=&quot;Anchor link for: 2-anadir-el-soporte-de-esp32&quot;&gt;2. Añadir el soporte de ESP32&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En &lt;em&gt;File → Preferences → Additional boards manager URLs&lt;/em&gt; pega:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;https://espressif.github.io/arduino-esp32/package_esp32_index.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Luego ve a &lt;em&gt;Boards Manager&lt;/em&gt;, busca &lt;strong&gt;esp32&lt;/strong&gt; e instala &lt;strong&gt;esp32 by Espressif
Systems&lt;/strong&gt;. Tarda un rato: son cientos de MB.&lt;/p&gt;
&lt;h2 id=&quot;3-elegir-la-placa-correcta&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-elegir-la-placa-correcta&quot; aria-label=&quot;Anchor link for: 3-elegir-la-placa-correcta&quot;&gt;3. Elegir la placa correcta&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En &lt;em&gt;Tools → Board&lt;/em&gt; escoge la tuya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP32 Dev Module&lt;/strong&gt; → el clásico.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32S3 Dev Module&lt;/strong&gt;, &lt;strong&gt;ESP32C3 Dev Module&lt;/strong&gt;, etc. → la variante.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-WROVER&lt;/strong&gt; solo si el módulo lleva PSRAM.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Si eliges mal la placa, suele compilar y subir, pero &lt;strong&gt;no arranca&lt;/strong&gt; o se queda
en bucle. Es el error número uno.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;4-el-puerto-serie-y-los-drivers&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#4-el-puerto-serie-y-los-drivers&quot; aria-label=&quot;Anchor link for: 4-el-puerto-serie-y-los-drivers&quot;&gt;4. El puerto serie y los drivers&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aquí está el 90 % de los problemas. Mira qué chip USB-serie lleva tu placa:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Chip&lt;/th&gt;&lt;th&gt;Driver&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CP2102&lt;/strong&gt; (Silicon Labs)&lt;/td&gt;&lt;td&gt;CP210x VCP&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CH340 / CH341&lt;/strong&gt; (WCH)&lt;/td&gt;&lt;td&gt;CH341SER&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;USB nativo&lt;/strong&gt; (S3/C3/C6)&lt;/td&gt;&lt;td&gt;no necesita driver&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Si no aparece el puerto en &lt;em&gt;Tools → Port&lt;/em&gt;, es el driver. En Linux, además,
puede que necesites pertenecer al grupo &lt;code&gt;dialout&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;5-subir-el-primer-programa&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#5-subir-el-primer-programa&quot; aria-label=&quot;Anchor link for: 5-subir-el-primer-programa&quot;&gt;5. Subir el primer programa&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;begin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;115200&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  pinMode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; OUTPUT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  digitalWrite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;digitalRead&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  delay&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;500&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;parpadeo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pulsa &lt;strong&gt;Upload&lt;/strong&gt;. Si se queda en &lt;code&gt;Connecting...&lt;/code&gt;, mantén pulsado &lt;strong&gt;BOOT&lt;/strong&gt; unos
segundos; es el truco clásico.&lt;/p&gt;
&lt;h2 id=&quot;6-el-monitor-serie&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#6-el-monitor-serie&quot; aria-label=&quot;Anchor link for: 6-el-monitor-serie&quot;&gt;6. El monitor serie&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ábrelo con el icono de la lupa y pon &lt;strong&gt;115200 baudios&lt;/strong&gt;. Si ves caracteres raros
(«����»), es que la velocidad no coincide.&lt;/p&gt;
&lt;h2 id=&quot;errores-tipicos-y-su-causa&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos-y-su-causa&quot; aria-label=&quot;Anchor link for: errores-tipicos-y-su-causa&quot;&gt;Errores típicos y su causa&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Síntoma&lt;/th&gt;&lt;th&gt;Causa habitual&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;«No such file» o puerto ausente&lt;/td&gt;&lt;td&gt;Driver USB-serie&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Connecting........&lt;/code&gt; eterno&lt;/td&gt;&lt;td&gt;Botón BOOT, cable malo o placa incorrecta&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Se sube pero no hace nada&lt;/td&gt;&lt;td&gt;Placa mal elegida (variante)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Reinicios en bucle&lt;/td&gt;&lt;td&gt;Falta de corriente o &lt;code&gt;GPIO12&lt;/code&gt; en alto&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Basura en el monitor&lt;/td&gt;&lt;td&gt;Velocidad distinta a 115200&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;ajustes-que-ahorran-tiempo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ajustes-que-ahorran-tiempo&quot; aria-label=&quot;Anchor link for: ajustes-que-ahorran-tiempo&quot;&gt;Ajustes que ahorran tiempo&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Activa &lt;strong&gt;«Show verbose output during: upload»&lt;/strong&gt; cuando algo falle: dice la
verdad.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;nombre de puerto fijo&lt;/strong&gt; si tienes varias placas.&lt;/li&gt;
&lt;li&gt;Guarda tus placas favoritas para no elegir cada vez.&lt;/li&gt;
&lt;li&gt;Para proyectos grandes, salta a &lt;strong&gt;VS Code + PlatformIO&lt;/strong&gt;: el IDE de Arduino se
queda corto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Instala el IDE y añade la URL de placas de Espressif.&lt;/li&gt;
&lt;li&gt;Instala «esp32 by Espressif» desde el &lt;strong&gt;Boards Manager&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Elige la &lt;strong&gt;placa correcta&lt;/strong&gt; (esto rompe más proyectos que el código).&lt;/li&gt;
&lt;li&gt;Resuelve el &lt;strong&gt;driver&lt;/strong&gt; del chip USB-serie.&lt;/li&gt;
&lt;li&gt;Sube, abre el &lt;strong&gt;monitor a 115200&lt;/strong&gt; y disfruta.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;VS Code + PlatformIO&lt;/a&gt; cuando el
proyecto crezca. O vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>¿Qué IDE usar para el ESP32? Arduino IDE, VS Code y compañía</title>
        <published>2026-10-01T00:00:00+00:00</published>
        <updated>2026-10-01T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/ide-esp32-comparativa/"/>
        <id>https://esp32.tunatek.tech/blog/ide-esp32-comparativa/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/ide-esp32-comparativa/">&lt;p&gt;Elegir IDE parece una decisión pequeña y no lo es: es donde vas a pasar
&lt;strong&gt;cientos de horas&lt;/strong&gt;. La buena noticia es que la elección depende casi por
completo del framework que hayas elegido.&lt;/p&gt;
&lt;h2 id=&quot;la-tabla&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-tabla&quot; aria-label=&quot;Anchor link for: la-tabla&quot;&gt;La tabla&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;IDE&lt;/th&gt;&lt;th&gt;Framework ideal&lt;/th&gt;&lt;th&gt;A favor&lt;/th&gt;&lt;th&gt;En contra&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Arduino IDE 2.x&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Arduino&lt;/td&gt;&lt;td&gt;Sencillo, todo incluido&lt;/td&gt;&lt;td&gt;Limitado, sin depuración real&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;VS Code + PlatformIO&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Arduino, ESP-IDF, Rust, MicroPython&lt;/td&gt;&lt;td&gt;Potente, multi-placa, debugging&lt;/td&gt;&lt;td&gt;Más configuración&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;VS Code + ESP-IDF&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;ESP-IDF&lt;/td&gt;&lt;td&gt;Oficial, JTAG, &lt;em&gt;menuconfig&lt;/em&gt;&lt;/td&gt;&lt;td&gt;Ceñido a ESP-IDF&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Thonny&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;MicroPython&lt;/td&gt;&lt;td&gt;Perfecto para empezar&lt;/td&gt;&lt;td&gt;Solo MicroPython&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CLion / RustRover&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Rust&lt;/td&gt;&lt;td&gt;Refactor y depuración top&lt;/td&gt;&lt;td&gt;Comercial / pesado&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;arduino-ide-2-x&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#arduino-ide-2-x&quot; aria-label=&quot;Anchor link for: arduino-ide-2-x&quot;&gt;Arduino IDE 2.x&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Es el «abre y funciona». Instalas la URL de placas, eliges la placa, pulsas
subir. Punto.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A favor:&lt;/strong&gt; cero fricción, gestión de librerías integrada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En contra:&lt;/strong&gt; editor flojo, sin &lt;em&gt;IntelliSense&lt;/em&gt; serio, sin depurador por JTAG,
y se atraganta con proyectos grandes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; aprender, sketches pequeños, taller.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vs-code-platformio&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#vs-code-platformio&quot; aria-label=&quot;Anchor link for: vs-code-platformio&quot;&gt;VS Code + PlatformIO&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mi recomendación general. PlatformIO convierte VS Code en un IDE de verdad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Un solo entorno&lt;/strong&gt; para Arduino, ESP-IDF, Rust o MicroPython, con el mismo
flujo (build / upload / monitor).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;platformio.ini&lt;/code&gt;&lt;/strong&gt;: la configuración del proyecto es texto, versionable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiplataforma&lt;/strong&gt; y multi-placa: cambias de ESP32 a ESP8266, STM32 o RP2040.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Depuración&lt;/strong&gt; con &lt;code&gt;debug_tool&lt;/code&gt; y hardware adecuado.&lt;/li&gt;
&lt;li&gt;Gestión de dependencias por proyecto (no global).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; casi todo, sobre todo si vas a tener varios proyectos.&lt;/p&gt;
&lt;h2 id=&quot;vs-code-extension-esp-idf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#vs-code-extension-esp-idf&quot; aria-label=&quot;Anchor link for: vs-code-extension-esp-idf&quot;&gt;VS Code + extensión ESP-IDF&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si eliges &lt;strong&gt;ESP-IDF&lt;/strong&gt;, esta es la opción oficial: integra &lt;code&gt;idf.py&lt;/code&gt;,
&lt;code&gt;menuconfig&lt;/code&gt;, el monitor serie y &lt;strong&gt;depuración por JTAG&lt;/strong&gt; dentro de VS Code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A favor:&lt;/strong&gt; oficial, JTAG de verdad, Kconfig a un clic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En contra:&lt;/strong&gt; está pensado &lt;em&gt;solo&lt;/em&gt; para ESP-IDF; el flujo es algo distinto al
de PlatformIO.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; proyectos serios con ESP-IDF.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;thonny-micropython&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#thonny-micropython&quot; aria-label=&quot;Anchor link for: thonny-micropython&quot;&gt;Thonny (MicroPython)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Para MicroPython, Thonny es lo más amable que existe: un botón para flashear el
firmware, REPL integrado y explorador de ficheros de la placa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; enseñar, aprender, prototipos rápidos.&lt;/p&gt;
&lt;h2 id=&quot;clion-rustrover-vs-code-rust&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#clion-rustrover-vs-code-rust&quot; aria-label=&quot;Anchor link for: clion-rustrover-vs-code-rust&quot;&gt;CLion / RustRover / VS Code (Rust)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si programas en &lt;strong&gt;Rust&lt;/strong&gt;, el flujo es &lt;code&gt;cargo&lt;/code&gt; + &lt;code&gt;espflash&lt;/code&gt;, así que casi
cualquier editor vale. VS Code con &lt;code&gt;rust-analyzer&lt;/code&gt; es suficiente; CLion aporta
mejor refactor y depurador.&lt;/p&gt;
&lt;h2 id=&quot;como-elegir-sin-equivocarte&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#como-elegir-sin-equivocarte&quot; aria-label=&quot;Anchor link for: como-elegir-sin-equivocarte&quot;&gt;Cómo elegir (sin equivocarte)&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Si usas…&lt;/th&gt;&lt;th&gt;Usa…&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Arduino core&lt;/td&gt;&lt;td&gt;&lt;strong&gt;VS Code + PlatformIO&lt;/strong&gt; (o Arduino IDE si empiezas)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP-IDF&lt;/td&gt;&lt;td&gt;&lt;strong&gt;VS Code + ESP-IDF&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MicroPython&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Thonny&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rust&lt;/td&gt;&lt;td&gt;&lt;strong&gt;VS Code&lt;/strong&gt; + &lt;code&gt;rust-analyzer&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Varios frameworks&lt;/td&gt;&lt;td&gt;&lt;strong&gt;VS Code + PlatformIO&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;No hace falta decidir para siempre: VS Code + PlatformIO cubre casi todos los
frameworks, así que puedes empezar ahí y añadir la extensión de ESP-IDF cuando
la necesites.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;extras-que-marcan-la-diferencia&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#extras-que-marcan-la-diferencia&quot; aria-label=&quot;Anchor link for: extras-que-marcan-la-diferencia&quot;&gt;Extras que marcan la diferencia&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monitor serie con colores y timestamps&lt;/strong&gt;: es un 30 % de tu tiempo de trabajo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Depuración JTAG&lt;/strong&gt; (ESP32-S3/C3): puntos de ruptura reales, no &lt;code&gt;printf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Formateo automático&lt;/strong&gt; (&lt;code&gt;clang-format&lt;/code&gt;) y linting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git integrado&lt;/strong&gt;: el firmware también se versiona.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Arduino IDE 2.x&lt;/strong&gt;: empeizar rápido. &lt;strong&gt;PlatformIO&lt;/strong&gt;: el más completo y
versátil. &lt;strong&gt;VS Code + ESP-IDF&lt;/strong&gt;: el oficial para ESP-IDF. &lt;strong&gt;Thonny&lt;/strong&gt;:
MicroPython.&lt;/li&gt;
&lt;li&gt;Elige según tu &lt;strong&gt;framework&lt;/strong&gt;, no por costumbre.&lt;/li&gt;
&lt;li&gt;PlatformIO es la apuesta más segura si vas a tocar varios frameworks.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;depuración JTAG&lt;/strong&gt; es el salto de calidad cuando el proyecto crece.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;Arduino IDE 2.x paso a paso&lt;/a&gt; o
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;VS Code + PlatformIO&lt;/a&gt;. O vuelve al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Rust en el ESP32: esp-idf-hal, esp-hal y embassy sin dramas</title>
        <published>2026-09-30T00:00:00+00:00</published>
        <updated>2026-09-30T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/rust-esp32/"/>
        <id>https://esp32.tunatek.tech/blog/rust-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/rust-esp32/">&lt;p&gt;Rust en el ESP32 dejó de ser un experimento hace tiempo. Hoy el ecosistema
&lt;code&gt;esp-rs&lt;/code&gt; es &lt;strong&gt;estable y sorprendentemente agradable&lt;/strong&gt;, con una ventaja enorme: el
compilador te evita errores de memoria y de concurrencia que en C te cuestan una
tarde de depuración.&lt;/p&gt;
&lt;p&gt;La contrapartida: hay que aprender Rust y montar una toolchain aparte.&lt;/p&gt;
&lt;h2 id=&quot;dos-rutas-no-una&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dos-rutas-no-una&quot; aria-label=&quot;Anchor link for: dos-rutas-no-una&quot;&gt;Dos rutas, no una&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruta&lt;/th&gt;&lt;th&gt;Qué es&lt;/th&gt;&lt;th&gt;Ideal para&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;esp-idf-hal&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Rust sobre ESP-IDF, con &lt;strong&gt;&lt;code&gt;std&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Reutilizar ESP-IDF, Wi-Fi, proyectos grandes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;esp-hal&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;no_std&lt;/code&gt;&lt;/strong&gt;, sin ESP-IDF&lt;/td&gt;&lt;td&gt;Control total, binarios pequeños, async&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;embassy&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Framework &lt;strong&gt;async&lt;/strong&gt; sobre &lt;code&gt;esp-hal&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Tareas concurrentes elegantes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La regla: si quieres Wi-Fi fácil y las APIs de Espressif, &lt;strong&gt;&lt;code&gt;esp-idf-hal&lt;/code&gt;&lt;/strong&gt;. Si
quieres exprimir y no te importa lo &lt;code&gt;no_std&lt;/code&gt;, &lt;strong&gt;&lt;code&gt;esp-hal&lt;/code&gt; + &lt;code&gt;embassy&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;toolchain&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#toolchain&quot; aria-label=&quot;Anchor link for: toolchain&quot;&gt;Toolchain&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El instalador oficial es &lt;code&gt;espup&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; espup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;espup&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; instala targets Xtensa y RISC-V&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;.&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;/export-esp.sh&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; o el script que genera&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Y para flashear, &lt;code&gt;cargo-espflash&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cargo-espflash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; espflash&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; flash&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-monitor&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Versión actual del HAL: &lt;strong&gt;&lt;code&gt;esp-hal&lt;/code&gt; 1.2.0&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;ejemplo-blink-con-esp-idf-hal-con-std&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ejemplo-blink-con-esp-idf-hal-con-std&quot; aria-label=&quot;Anchor link for: ejemplo-blink-con-esp-idf-hal-con-std&quot;&gt;Ejemplo: blink con &lt;code&gt;esp-idf-hal&lt;/code&gt; (con &lt;code&gt;std&lt;/code&gt;)&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; esp_idf_svc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;hal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delay&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;FreeRtos&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; esp_idf_svc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;hal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;gpio&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;PinDriver&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; esp_idf_svc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;hal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;peripherals&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Peripherals&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; anyhow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    esp_idf_svc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;link_patches&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; peripherals&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Peripherals&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;take&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; PinDriver&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;output&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;peripherals&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span&gt;pins&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span&gt;gpio2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    loop&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;set_high&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        FreeRtos&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delay_ms&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;set_low&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        FreeRtos&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delay_ms&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fíjate en el detalle: &lt;strong&gt;el compilador te obliga&lt;/strong&gt; a declarar el pin como salida
antes de escribir. En C, un &lt;code&gt;pinMode&lt;/code&gt; olvidado es un bug silencioso; aquí no
compila.&lt;/p&gt;
&lt;h2 id=&quot;async-con-embassy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#async-con-embassy&quot; aria-label=&quot;Anchor link for: async-con-embassy&quot;&gt;Async con &lt;code&gt;embassy&lt;/code&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lo mejor del camino &lt;code&gt;no_std&lt;/code&gt; es &lt;code&gt;embassy&lt;/code&gt;: tareas asíncronas de verdad, sin
&lt;code&gt;loop()&lt;/code&gt; ni máquinas de estado a mano.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;embassy_executor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; parpadeo&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;mut&lt;/span&gt;&lt;span&gt; led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Output&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;static&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Gpio2&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    loop&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;toggle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        Timer&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;after_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;500&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dos tareas que «duermen» a la vez sin bloquearse: es la forma moderna de escribir
firmware concurrente.&lt;/p&gt;
&lt;h2 id=&quot;ventajas-reales&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ventajas-reales&quot; aria-label=&quot;Anchor link for: ventajas-reales&quot;&gt;Ventajas reales&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seguridad&lt;/strong&gt;: sin &lt;em&gt;use-after-free&lt;/em&gt;, sin carreras de datos, sin &lt;em&gt;null&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrencia honesta&lt;/strong&gt;: si compila, normalmente no se pisa la memoria.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binarios pequeños&lt;/strong&gt; en &lt;code&gt;no_std&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cargo&lt;/code&gt;&lt;/strong&gt;: dependencias, tests y documentación en un solo sitio.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;inconvenientes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#inconvenientes&quot; aria-label=&quot;Anchor link for: inconvenientes&quot;&gt;Inconvenientes&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Curva de aprendizaje&lt;/strong&gt; de Rust (préstamos, &lt;code&gt;async&lt;/code&gt;, &lt;code&gt;no_std&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ecosistema más joven&lt;/strong&gt; que Arduino: menos librerías listas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Toolchain aparte&lt;/strong&gt;: &lt;code&gt;espup&lt;/code&gt;, targets, versión de Rust concreta.&lt;/li&gt;
&lt;li&gt;Menos ejemplos y tutoriales que en C/C++.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cuando-elegirlo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegirlo&quot; aria-label=&quot;Anchor link for: cuando-elegirlo&quot;&gt;¿Cuándo elegirlo?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Te importa la &lt;strong&gt;fiabilidad&lt;/strong&gt; y quieres menos bugs raros.&lt;/li&gt;
&lt;li&gt;Ya sabes Rust (o quieres aprenderlo en serio).&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;async&lt;/strong&gt; real o binarios muy pequeños.&lt;/li&gt;
&lt;li&gt;Es un proyecto a largo plazo donde el mantenimiento importa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Es tu primer contacto con microcontroladores: empieza en Arduino o MicroPython.&lt;/li&gt;
&lt;li&gt;Necesitas una librería concreta que solo existe en C++.&lt;/li&gt;
&lt;li&gt;Vas con prisa.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dos rutas: &lt;strong&gt;&lt;code&gt;esp-idf-hal&lt;/code&gt;&lt;/strong&gt; (con &lt;code&gt;std&lt;/code&gt;, sobre ESP-IDF) y &lt;strong&gt;&lt;code&gt;esp-hal&lt;/code&gt;&lt;/strong&gt;
(&lt;em&gt;no_std&lt;/em&gt;), más &lt;strong&gt;&lt;code&gt;embassy&lt;/code&gt;&lt;/strong&gt; para async.&lt;/li&gt;
&lt;li&gt;Toolchain con &lt;strong&gt;&lt;code&gt;espup&lt;/code&gt;&lt;/strong&gt; y flasheo con &lt;strong&gt;&lt;code&gt;cargo-espflash&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;El compilador &lt;strong&gt;evita errores&lt;/strong&gt; que en C son silenciosos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;esp-hal&lt;/code&gt; va por la &lt;strong&gt;1.2.0&lt;/strong&gt; y el ecosistema ya es maduro.&lt;/li&gt;
&lt;li&gt;Merece la pena si te importa el mantenimiento y la seguridad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; cambiamos de tercio con los &lt;strong&gt;IDE&lt;/strong&gt;:
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;cuál usar y por qué&lt;/a&gt;. O vuelve al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>MicroPython y Lua en el ESP32: programar sin compilar</title>
        <published>2026-09-29T00:00:00+00:00</published>
        <updated>2026-09-29T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/micropython-lua-esp32/"/>
        <id>https://esp32.tunatek.tech/blog/micropython-lua-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/micropython-lua-esp32/">&lt;p&gt;Hay una forma de programar el ESP32 en la que &lt;strong&gt;no compilas nada&lt;/strong&gt;: flasheas un
firmware, abres una consola y escribes Python. En cinco minutos tienes un LED
parpadeando. Se llama &lt;strong&gt;MicroPython&lt;/strong&gt; y es la mejor puerta de entrada que existe.&lt;/p&gt;
&lt;p&gt;La otra cara: es más lento y no todo está cubierto. Vamos a verlo con honestidad.&lt;/p&gt;
&lt;h2 id=&quot;que-es-micropython&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-es-micropython&quot; aria-label=&quot;Anchor link for: que-es-micropython&quot;&gt;Qué es MicroPython&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Es una implementación de Python 3 &lt;strong&gt;hecha para microcontroladores&lt;/strong&gt;. Ocupa poco,
cabe en el ESP32 y te da un &lt;strong&gt;REPL&lt;/strong&gt; (consola interactiva) por USB o Wi-Fi.&lt;/p&gt;
&lt;h2 id=&quot;flashear-y-conectar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#flashear-y-conectar&quot; aria-label=&quot;Anchor link for: flashear-y-conectar&quot;&gt;Flashear y conectar&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Se instala con &lt;code&gt;esptool&lt;/code&gt; (el firmware lo publica micropython.org):&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;esptool.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-chip&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; esp32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; /dev/ttyUSB0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; erase_flash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;esptool.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-chip&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; esp32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; /dev/ttyUSB0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; write_flash&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;z&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0x1000&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; esp32-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.bin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Y para hablar con la placa, &lt;code&gt;mpremote&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mpremote&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; connect&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; /dev/ttyUSB0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; machine,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; led&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; machine.Pin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;2,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; machine.Pin.OUT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;     led.value&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; led.value&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; time.sleep(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eso es todo. Sin compilar, sin &lt;code&gt;setup()&lt;/code&gt;, sin &lt;code&gt;loop()&lt;/code&gt;. Perfecto para aprender.&lt;/p&gt;
&lt;h2 id=&quot;subir-tu-codigo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#subir-tu-codigo&quot; aria-label=&quot;Anchor link for: subir-tu-codigo&quot;&gt;Subir tu código&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El ESP32 aparece como un &lt;strong&gt;sistema de ficheros&lt;/strong&gt; (en &lt;code&gt;boot.py&lt;/code&gt; y &lt;code&gt;main.py&lt;/code&gt;):&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mpremote&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cp&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; main.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; :main.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;     #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; copiar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mpremote&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; main.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;             #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; ejecutar sin copiar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;main.py&lt;/code&gt; se ejecuta solo al arrancar.&lt;/p&gt;
&lt;h2 id=&quot;lo-bueno&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-bueno&quot; aria-label=&quot;Anchor link for: lo-bueno&quot;&gt;Lo bueno&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Curva mínima&lt;/strong&gt; si sabes Python (o si no, también).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteración instantánea&lt;/strong&gt;: pruebas una línea y ves el resultado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ideal para enseñar&lt;/strong&gt; y para taller.&lt;/li&gt;
&lt;li&gt;Buenos módulos: &lt;code&gt;machine&lt;/code&gt;, &lt;code&gt;network&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;, &lt;code&gt;socket&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lo-malo-importante&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-malo-importante&quot; aria-label=&quot;Anchor link for: lo-malo-importante&quot;&gt;Lo malo (importante)&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Velocidad&lt;/strong&gt;: es interpretado, así que olvídate de &lt;em&gt;timing&lt;/em&gt; fino o de
procesar audio/vídeo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memoria&lt;/strong&gt;: el intérprete ocupa parte de la RAM; con PSRAM mejora, pero no
es C.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Periféricos&lt;/strong&gt;: no todos los del ESP32 están expuestos. Si algo falta,
normalmente hay que bajar a C.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tiempo real&lt;/strong&gt;: no hay tareas con prioridad real como en FreeRTOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Producción&lt;/strong&gt;: para un producto serio, casi siempre se acaba en C/C++ o Rust.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;y-lua-nodemcu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#y-lua-nodemcu&quot; aria-label=&quot;Anchor link for: y-lua-nodemcu&quot;&gt;¿Y Lua (NodeMCU)?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fue popular con el ESP8266. Hoy está prácticamente aparcado: menos soporte, menos
librerías y MicroPython es más cómodo y está más vivo. &lt;strong&gt;Para proyectos nuevos, no
lo recomiendo.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;comparativa-rapida&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#comparativa-rapida&quot; aria-label=&quot;Anchor link for: comparativa-rapida&quot;&gt;Comparativa rápida&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;MicroPython&lt;/th&gt;&lt;th&gt;Arduino&lt;/th&gt;&lt;th&gt;ESP-IDF&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Compilar&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Velocidad&lt;/td&gt;&lt;td&gt;Baja&lt;/td&gt;&lt;td&gt;Alta&lt;/td&gt;&lt;td&gt;Alta&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;RAM disponible&lt;/td&gt;&lt;td&gt;Menos&lt;/td&gt;&lt;td&gt;Mucha&lt;/td&gt;&lt;td&gt;Mucha&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tareas&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;1 loop&lt;/td&gt;&lt;td&gt;&lt;strong&gt;N tareas&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Curva&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Muy baja&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Baja&lt;/td&gt;&lt;td&gt;Alta&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ideal para&lt;/td&gt;&lt;td&gt;Aprender, prototipos&lt;/td&gt;&lt;td&gt;Todo&lt;/td&gt;&lt;td&gt;Producto&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;cuando-usarlo-y-cuando-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-usarlo-y-cuando-no&quot; aria-label=&quot;Anchor link for: cuando-usarlo-y-cuando-no&quot;&gt;Cuándo usarlo (y cuándo no)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estás aprendiendo o enseñando.&lt;/li&gt;
&lt;li&gt;Quieres probar una idea en 10 minutos.&lt;/li&gt;
&lt;li&gt;El proyecto es un sensor que publica y no necesita velocidad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Necesitas &lt;em&gt;timing&lt;/em&gt; preciso o DSP.&lt;/li&gt;
&lt;li&gt;Vas a producción con requisitos de memoria o consumo.&lt;/li&gt;
&lt;li&gt;Necesitas un periférico que no está expuesto en Python.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MicroPython&lt;/strong&gt;: Python en el ESP32, sin compilar, con REPL y sistema de
ficheros. Versión actual: &lt;strong&gt;1.29&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Es &lt;strong&gt;la mejor forma de empezar&lt;/strong&gt; y de prototipar rápido.&lt;/li&gt;
&lt;li&gt;Es más lento y usa más RAM: no sirve para todo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lua/NodeMCU&lt;/strong&gt; ya no merece la pena para proyectos nuevos.&lt;/li&gt;
&lt;li&gt;Puedes empezar en MicroPython y bajar a C/Rust cuando el proyecto lo pida.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;Rust en el ESP32&lt;/a&gt;, el otro extremo:
máxima seguridad y control. O vuelve al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>ESP-IDF a fondo: proyectos, tareas, logs y particiones</title>
        <published>2026-09-28T00:00:00+00:00</published>
        <updated>2026-09-28T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp-idf-a-fondo/"/>
        <id>https://esp32.tunatek.tech/blog/esp-idf-a-fondo/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp-idf-a-fondo/">&lt;p&gt;Si el core de Arduino esconde el ESP32, &lt;strong&gt;ESP-IDF lo enseña todo&lt;/strong&gt;. Es el SDK
oficial de Espressif y la base sobre la que se construye todo lo demás. Tiene más
curva, sí, pero también te da el control que un producto necesita.&lt;/p&gt;
&lt;p&gt;Vamos con lo importante sin perderse en la documentación.&lt;/p&gt;
&lt;h2 id=&quot;estructura-de-un-proyecto&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#estructura-de-un-proyecto&quot; aria-label=&quot;Anchor link for: estructura-de-un-proyecto&quot;&gt;Estructura de un proyecto&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mi-proyecto/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── CMakeLists.txt          # proyecto (casi siempre igual)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── sdkconfig               # configuración generada&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── main/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ├── CMakeLists.txt      # registra el main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    └── main.c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El &lt;code&gt;CMakeLists.txt&lt;/code&gt; raíz:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.16)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;include&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;$ENV{IDF_PATH}&lt;/span&gt;&lt;span&gt;/tools/cmake/project.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;project&lt;/span&gt;&lt;span&gt;(mi-proyecto)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Y el de &lt;code&gt;main/&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;idf_component_register(SRCS &lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;main.c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                       INCLUDE_DIRS &lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;los-comandos-que-vas-a-usar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-comandos-que-vas-a-usar&quot; aria-label=&quot;Anchor link for: los-comandos-que-vas-a-usar&quot;&gt;Los comandos que vas a usar&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;idf.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set-target&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; esp32s3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;   #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; elige el chip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;idf.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; menuconfig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;           #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; configura (Kconfig)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;idf.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;                #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; compila&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;idf.py&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; flash&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; monitor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;        #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; flashea y abre el monitor&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;menuconfig&lt;/code&gt; es una de las mejores cosas de ESP-IDF: cambias opciones (Wi-Fi,
logs, particiones, PSRAM) sin tocar el código, y quedan guardadas en &lt;code&gt;sdkconfig&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;hola-mundo-con-logs&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hola-mundo-con-logs&quot; aria-label=&quot;Anchor link for: hola-mundo-con-logs&quot;&gt;Hola mundo con logs&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;include&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;esp_log.h&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; char&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;/span&gt;&lt;span&gt;TAG &lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; app_main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    ESP_LOGI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Arrancando…&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    ESP_LOGW&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Esto es un aviso&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    ESP_LOGE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Y esto un error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nada de &lt;code&gt;printf&lt;/code&gt;: usa los &lt;strong&gt;niveles de log&lt;/strong&gt;. Puedes subir o bajar el nivel por
componente desde &lt;code&gt;menuconfig&lt;/code&gt;, y en producción apagarlos casi todos.&lt;/p&gt;
&lt;h2 id=&quot;tareas-el-corazon-de-esp-idf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tareas-el-corazon-de-esp-idf&quot; aria-label=&quot;Anchor link for: tareas-el-corazon-de-esp-idf&quot;&gt;Tareas: el corazón de ESP-IDF&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aquí está la gran diferencia con Arduino. En lugar de un &lt;code&gt;loop()&lt;/code&gt;, creas
&lt;strong&gt;tareas&lt;/strong&gt; de FreeRTOS con prioridad y tamaño de pila propios:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; tarea_sensor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        leer_sensor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        vTaskDelay&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;pdMS_TO_TICKS&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; app_main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    xTaskCreate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tarea_sensor&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;sensor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4096&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; NULL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ventajas reales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Paralelismo de verdad&lt;/strong&gt;: una tarea mide, otra publica por MQTT.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vTaskDelay&lt;/code&gt; no bloquea&lt;/strong&gt; el resto del sistema.&lt;/li&gt;
&lt;li&gt;Controlas &lt;strong&gt;pila&lt;/strong&gt; y &lt;strong&gt;prioridad&lt;/strong&gt;, que es lo que evita los reinicios raros.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;particiones-y-ota&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#particiones-y-ota&quot; aria-label=&quot;Anchor link for: particiones-y-ota&quot;&gt;Particiones y OTA&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La flash no es un bloque único: está &lt;strong&gt;particionada&lt;/strong&gt; (tabla &lt;code&gt;partitions.csv&lt;/code&gt;).
Por defecto hay dos ranuras de aplicación (&lt;code&gt;app0&lt;/code&gt; y &lt;code&gt;app1&lt;/code&gt;) para poder hacer
&lt;strong&gt;OTA&lt;/strong&gt; (actualización por Wi-Fi) con &lt;em&gt;rollback&lt;/em&gt; si algo falla.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;csv&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Name,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   Type,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; SubType,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Offset,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Size&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nvs,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;      data,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; nvs,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;     0x9000,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  0x4000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;factory,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  app,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  factory,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 0x10000,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 1M&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ejemplo de partición con OTA:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;csv&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Name,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   Type,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; SubType,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  Size&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nvs,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;      data,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; nvs,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;      0x4000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;otadata,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  data,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; ota,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;      0x2000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;phy_init,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; data,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; phy,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;      0x1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;factory,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  app,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  factory,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  1M&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ota_0,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    app,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  ota_0,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    1M&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ota_1,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    app,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  ota_1,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    1M&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;wire-arduino-o-esp-idf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wire-arduino-o-esp-idf&quot; aria-label=&quot;Anchor link for: wire-arduino-o-esp-idf&quot;&gt;Wire: ¿Arduino o ESP-IDF?&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Arduino core&lt;/th&gt;&lt;th&gt;ESP-IDF&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Curva&lt;/td&gt;&lt;td&gt;Baja&lt;/td&gt;&lt;td&gt;Alta&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Control&lt;/td&gt;&lt;td&gt;Medio&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tareas&lt;/td&gt;&lt;td&gt;1 &lt;em&gt;loop&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;N tareas&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Memoria&lt;/td&gt;&lt;td&gt;Automática&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Tú decides&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;OTA&lt;/td&gt;&lt;td&gt;Fácil&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Completo&lt;/strong&gt; (rollback)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Logs&lt;/td&gt;&lt;td&gt;&lt;code&gt;Serial&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Niveles por componente&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;cuando-merece-la-pena&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-merece-la-pena&quot; aria-label=&quot;Anchor link for: cuando-merece-la-pena&quot;&gt;Cuándo merece la pena&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sí&lt;/strong&gt;: producto, batería, &lt;em&gt;timing&lt;/em&gt; fino, OTA serio, muchos periféricos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No&lt;/strong&gt;: si solo quieres leer un sensor y publicar, Arduino te lleva en una
tarde y te sobra.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Consejo: puedes mezclar. El core de Arduino &lt;strong&gt;es&lt;/strong&gt; ESP-IDF por debajo, así que
desde un sketch puedes llamar a APIs de ESP-IDF cuando las necesites.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ESP-IDF es el SDK oficial: &lt;strong&gt;CMake + &lt;code&gt;idf.py&lt;/code&gt; + &lt;code&gt;menuconfig&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;tareas de FreeRTOS&lt;/strong&gt;, no un &lt;code&gt;loop()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs por niveles&lt;/strong&gt; con &lt;code&gt;ESP_LOGx&lt;/code&gt; en lugar de &lt;code&gt;printf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La flash está &lt;strong&gt;particionada&lt;/strong&gt;; el OTA con &lt;em&gt;rollback&lt;/em&gt; viene casi gratis.&lt;/li&gt;
&lt;li&gt;Versión actual: &lt;strong&gt;6.1&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;MicroPython y Lua&lt;/a&gt; para el extremo
opuesto: cero compilación. O vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Arduino core para ESP32 a fondo: instalar, entender y no pelearse</title>
        <published>2026-09-27T00:00:00+00:00</published>
        <updated>2026-09-27T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/arduino-core-esp32/"/>
        <id>https://esp32.tunatek.tech/blog/arduino-core-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/arduino-core-esp32/">&lt;p&gt;El «Arduino core para ESP32» es la razón por la que medio mundo usa este chip.
Te deja escribir &lt;code&gt;pinMode()&lt;/code&gt; y &lt;code&gt;digitalWrite()&lt;/code&gt; como en un Arduino UNO, pero por
debajo hay un &lt;strong&gt;ESP32 con FreeRTOS&lt;/strong&gt;. Entender esa capa es la diferencia entre
copiar ejemplos y saber lo que haces.&lt;/p&gt;
&lt;h2 id=&quot;que-es-exactamente&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-es-exactamente&quot; aria-label=&quot;Anchor link for: que-es-exactamente&quot;&gt;Qué es exactamente&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No es un Arduino emulado. Desde la versión 3.x, el core es un &lt;strong&gt;envoltorio sobre
ESP-IDF&lt;/strong&gt;: tus &lt;code&gt;setup()&lt;/code&gt; y &lt;code&gt;loop()&lt;/code&gt; corren dentro de un &lt;strong&gt;FreeRTOS task&lt;/strong&gt; real
(se llama &lt;em&gt;loopTask&lt;/em&gt;), en el &lt;strong&gt;núcleo 1&lt;/strong&gt;, con 8 KB de pila por defecto.&lt;/p&gt;
&lt;p&gt;Eso explica dos cosas muy típicas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si tu &lt;code&gt;loop()&lt;/code&gt; se queda colgado, salta el &lt;strong&gt;watchdog&lt;/strong&gt; y la placa se reinicia.&lt;/li&gt;
&lt;li&gt;Si tu proyecto crece, puedes &lt;strong&gt;crear tareas&lt;/strong&gt; con &lt;code&gt;xTaskCreatePinnedToCore()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instalacion-dos-caminos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#instalacion-dos-caminos&quot; aria-label=&quot;Anchor link for: instalacion-dos-caminos&quot;&gt;Instalación (dos caminos)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Arduino IDE&lt;/strong&gt; — añade la URL de placas en &lt;em&gt;Preferences&lt;/em&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;https://espressif.github.io/arduino-esp32/package_esp32_index.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Luego instala «esp32 by Espressif» desde el &lt;strong&gt;Boards Manager&lt;/strong&gt; y elige tu placa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PlatformIO&lt;/strong&gt; (mi recomendación) — &lt;code&gt;platformio.ini&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;env:esp32dev&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;platform&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; espressif32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;board&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; esp32dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;framework&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; arduino&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;monitor_speed&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 115200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;setup-y-loop-por-dentro&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#setup-y-loop-por-dentro&quot; aria-label=&quot;Anchor link for: setup-y-loop-por-dentro&quot;&gt;&lt;code&gt;setup()&lt;/code&gt; y &lt;code&gt;loop()&lt;/code&gt; por dentro&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Serial&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;begin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;115200&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  pinMode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; OUTPUT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  digitalWrite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;digitalRead&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  delay&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Funciona, pero conviene saber:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;delay()&lt;/code&gt; &lt;strong&gt;bloquea&lt;/strong&gt; el &lt;em&gt;task&lt;/em&gt;. Con Wi-Fi o varios sensores, usa &lt;code&gt;millis()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setup()&lt;/code&gt; se ejecuta &lt;strong&gt;una vez&lt;/strong&gt;; si quieres tareas paralelas, créalas ahí.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;watchdog&lt;/strong&gt; vigila el &lt;em&gt;loop&lt;/em&gt;: si tardas demasiado, reinicio.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Versión anti-bloqueo:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;unsigned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; long&lt;/span&gt;&lt;span&gt; last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;constexpr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; unsigned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; long&lt;/span&gt;&lt;span&gt; INTERVAL&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;/span&gt;&lt;span&gt; last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span&gt; INTERVAL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    last&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    digitalWrite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;digitalRead&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;librerias-no-todas-valen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#librerias-no-todas-valen&quot; aria-label=&quot;Anchor link for: librerias-no-todas-valen&quot;&gt;Librerías: no todas valen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Las &lt;strong&gt;de Arduino genéricas&lt;/strong&gt; suelen funcionar si no tocan registros del AVR.&lt;/li&gt;
&lt;li&gt;Las que usan &lt;strong&gt;timers&lt;/strong&gt; o interrupciones específicas pueden fallar.&lt;/li&gt;
&lt;li&gt;Para sensores, busca la versión «ESP32» o usa la librería del fabricante.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Wire&lt;/code&gt;&lt;/strong&gt; (I2C) y &lt;strong&gt;&lt;code&gt;SPI&lt;/code&gt;&lt;/strong&gt; existen, pero puedes elegir pines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;diferencias-con-un-arduino-uno&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#diferencias-con-un-arduino-uno&quot; aria-label=&quot;Anchor link for: diferencias-con-un-arduino-uno&quot;&gt;Diferencias con un Arduino UNO&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cosa&lt;/th&gt;&lt;th&gt;Arduino UNO&lt;/th&gt;&lt;th&gt;ESP32&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Voltaje&lt;/td&gt;&lt;td&gt;5 V&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3,3 V&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bits&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;strong&gt;32&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;EEPROM&lt;/td&gt;&lt;td&gt;1 KB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;no hay&lt;/strong&gt; (usa &lt;code&gt;Preferences&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ADC&lt;/td&gt;&lt;td&gt;10 bits&lt;/td&gt;&lt;td&gt;&lt;strong&gt;12 bits&lt;/strong&gt; (y ADC2 con Wi-Fi, ojo)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Núcleos&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Guardar algo en la «EEPROM» del ESP32 se hace así:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;include&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Preferences.h&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Preferences&lt;/span&gt;&lt;span&gt; prefs&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  prefs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;begin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;mi-app&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; false&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  int&lt;/span&gt;&lt;span&gt; arranques&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;/span&gt;&lt;span&gt; prefs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getInt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  prefs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;putInt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; arranques&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  prefs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;end&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;buenas-practicas&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#buenas-practicas&quot; aria-label=&quot;Anchor link for: buenas-practicas&quot;&gt;Buenas prácticas&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No bloquees el loop&lt;/strong&gt;: usa &lt;code&gt;millis()&lt;/code&gt;, tareas o &lt;code&gt;vTaskDelay&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serial a 115200&lt;/strong&gt; y espera un momento tras &lt;code&gt;begin()&lt;/code&gt; si lo necesitas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No abuses de &lt;code&gt;String&lt;/code&gt;&lt;/strong&gt;: fragmenta la memoria. Usa &lt;code&gt;char[]&lt;/code&gt; y &lt;code&gt;snprintf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Separa el código&lt;/strong&gt; en ficheros; un &lt;code&gt;.ino&lt;/code&gt; de 2000 líneas es un dolor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Depura con logs&lt;/strong&gt;, no con &lt;code&gt;Serial.println&lt;/code&gt; por todas partes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;cuando-pasar-a-esp-idf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-pasar-a-esp-idf&quot; aria-label=&quot;Anchor link for: cuando-pasar-a-esp-idf&quot;&gt;¿Cuándo pasar a ESP-IDF?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cuando necesites control fino de tareas y memoria, &lt;em&gt;timing&lt;/em&gt; preciso, particiones
OTA serias o exprimir el consumo. El core de Arduino esconde mucho, y a veces eso
está bien… hasta que deja de estarlo.&lt;/p&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Es un &lt;strong&gt;envoltorio sobre ESP-IDF&lt;/strong&gt;; tus &lt;code&gt;setup&lt;/code&gt;/&lt;code&gt;loop&lt;/code&gt; son un &lt;em&gt;task&lt;/em&gt; de FreeRTOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;delay()&lt;/code&gt; bloquea&lt;/strong&gt;; aprende a usar &lt;code&gt;millis()&lt;/code&gt; desde el principio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3,3 V&lt;/strong&gt;, sin EEPROM (usa &lt;strong&gt;NVS/Preferences&lt;/strong&gt;), ADC de 12 bits.&lt;/li&gt;
&lt;li&gt;No todas las librerías de Arduino compilan: revisa la compatibilidad.&lt;/li&gt;
&lt;li&gt;Versión actual del core: &lt;strong&gt;3.3.11&lt;/strong&gt; (sobre ESP-IDF 5.5.5).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;ESP-IDF a fondo&lt;/a&gt; para cuando
necesites el control total. O vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>¿Qué framework usar en el ESP32? Arduino, ESP-IDF, MicroPython o Rust</title>
        <published>2026-09-26T00:00:00+00:00</published>
        <updated>2026-09-26T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/framework-esp32-comparativa/"/>
        <id>https://esp32.tunatek.tech/blog/framework-esp32-comparativa/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/framework-esp32-comparativa/">&lt;p&gt;Aquí llega la pregunta que más se repite: &lt;strong&gt;¿con qué programo el ESP32?&lt;/strong&gt; La
respuesta corta es «depende», y la respuesta útil es esta tabla. Elige por dónde
te sitúas y qué quieres conseguir.&lt;/p&gt;
&lt;h2 id=&quot;los-cinco-caminos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-cinco-caminos&quot; aria-label=&quot;Anchor link for: los-cinco-caminos&quot;&gt;Los cinco caminos&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Framework&lt;/th&gt;&lt;th&gt;Lenguaje&lt;/th&gt;&lt;th&gt;Curva&lt;/th&gt;&lt;th&gt;Control&lt;/th&gt;&lt;th&gt;Ideal para&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Arduino core&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;C++&lt;/td&gt;&lt;td&gt;Muy baja&lt;/td&gt;&lt;td&gt;Medio&lt;/td&gt;&lt;td&gt;Empezar, prototipos, sensores&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ESP-IDF&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;C (C++)&lt;/td&gt;&lt;td&gt;Alta&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Producto, RTOS, rendimiento&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;MicroPython&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Python&lt;/td&gt;&lt;td&gt;Muy baja&lt;/td&gt;&lt;td&gt;Bajo&lt;/td&gt;&lt;td&gt;Aprender, pruebas rápidas&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Rust&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Rust&lt;/td&gt;&lt;td&gt;Media-alta&lt;/td&gt;&lt;td&gt;Alto&lt;/td&gt;&lt;td&gt;Robustez, seguridad, &lt;em&gt;no_std&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Lua (NodeMCU)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Lua&lt;/td&gt;&lt;td&gt;Baja&lt;/td&gt;&lt;td&gt;Bajo&lt;/td&gt;&lt;td&gt;Legado, scripts muy simples&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Empecemos por lo importante: &lt;strong&gt;no hay uno mejor&lt;/strong&gt;, hay uno mejor &lt;em&gt;para ti ahora
mismo&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;arduino-core-el-que-casi-todos-empiezan&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#arduino-core-el-que-casi-todos-empiezan&quot; aria-label=&quot;Anchor link for: arduino-core-el-que-casi-todos-empiezan&quot;&gt;Arduino core: el que casi todos empiezan&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Escribes &lt;code&gt;setup()&lt;/code&gt; y &lt;code&gt;loop()&lt;/code&gt;, usas &lt;code&gt;pinMode()&lt;/code&gt;, &lt;code&gt;digitalWrite()&lt;/code&gt; y ya está. Hay
miles de librerías y ejemplos.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A favor:&lt;/strong&gt; arrancas en una tarde, comunidad enorme, todo el mundo te puede
ayudar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En contra:&lt;/strong&gt; te oculta cosas (tareas, memoria, particiones), y cuando algo
raro pasa, no sabes por dónde empezar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versión actual:&lt;/strong&gt; &lt;strong&gt;3.3.11&lt;/strong&gt; (construida sobre ESP-IDF 5.5.5).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Úsalo si&lt;/strong&gt; estás empezando, haces un prototipo o vienes del mundo Arduino.&lt;/p&gt;
&lt;h2 id=&quot;esp-idf-el-de-verdad&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp-idf-el-de-verdad&quot; aria-label=&quot;Anchor link for: esp-idf-el-de-verdad&quot;&gt;ESP-IDF: el «de verdad»&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Es el SDK oficial de Espressif. Aquí sí controlas todo: &lt;strong&gt;FreeRTOS&lt;/strong&gt;, tareas,
colas, particiones, &lt;em&gt;menuconfig&lt;/em&gt;, logs, consumo, seguridad.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A favor:&lt;/strong&gt; control total, mejor rendimiento, todo documentado por el
fabricante, base de todo lo demás.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En contra:&lt;/strong&gt; más conceptos que aprender y más código para lo mismo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versión actual:&lt;/strong&gt; &lt;strong&gt;6.1&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Úsalo si&lt;/strong&gt; vas a producción, necesitas &lt;em&gt;timing&lt;/em&gt; fino o quieres exprimir el
hardware.&lt;/p&gt;
&lt;h2 id=&quot;micropython-entender-en-5-minutos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#micropython-entender-en-5-minutos&quot; aria-label=&quot;Anchor link for: micropython-entender-en-5-minutos&quot;&gt;MicroPython: entender en 5 minutos&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Flasheas el firmware, abres un REPL y escribes Python. Perfecto para aprender y
para trastear sin compilar.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A favor:&lt;/strong&gt; inmediato, divertido, ideal para enseñar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En contra:&lt;/strong&gt; más lento, más RAM, y no todos los periféricos están cubiertos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versión actual:&lt;/strong&gt; &lt;strong&gt;1.29&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Úsalo si&lt;/strong&gt; quieres resultados ya, o si vienes de Python.&lt;/p&gt;
&lt;h2 id=&quot;rust-potencia-con-red-de-seguridad&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#rust-potencia-con-red-de-seguridad&quot; aria-label=&quot;Anchor link for: rust-potencia-con-red-de-seguridad&quot;&gt;Rust: potencia con red de seguridad&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El ecosistema &lt;code&gt;esp-rs&lt;/code&gt; te da dos caminos: &lt;strong&gt;&lt;code&gt;esp-idf-hal&lt;/code&gt;&lt;/strong&gt; (sobre ESP-IDF, con
&lt;code&gt;std&lt;/code&gt;) y &lt;strong&gt;&lt;code&gt;esp-hal&lt;/code&gt; / &lt;code&gt;embassy&lt;/code&gt;&lt;/strong&gt; (&lt;em&gt;no_std&lt;/em&gt;, más ligero y asíncrono).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A favor:&lt;/strong&gt; el compilador te evita errores de memoria y de concurrencia,
código muy robusto, async real con &lt;code&gt;embassy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En contra:&lt;/strong&gt; curva de aprendizaje, toolchain aparte (&lt;code&gt;espup&lt;/code&gt;), ecosistema
más joven.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versión actual:&lt;/strong&gt; &lt;code&gt;esp-hal&lt;/code&gt; &lt;strong&gt;1.2.0&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Úsalo si&lt;/strong&gt; te importa la fiabilidad, vienes de Rust o quieres aprender algo
serio.&lt;/p&gt;
&lt;h2 id=&quot;lua-nodemcu-el-pasado&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lua-nodemcu-el-pasado&quot; aria-label=&quot;Anchor link for: lua-nodemcu-el-pasado&quot;&gt;Lua (NodeMCU): el pasado&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fue popular con el ESP8266. Hoy está prácticamente abandonado frente a
MicroPython. Solo tiene sentido para mantener proyectos antiguos.&lt;/p&gt;
&lt;h2 id=&quot;la-decision-en-20-segundos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-decision-en-20-segundos&quot; aria-label=&quot;Anchor link for: la-decision-en-20-segundos&quot;&gt;La decisión, en 20 segundos&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tu situación&lt;/th&gt;&lt;th&gt;Empieza con&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Es mi primer microcontrolador&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Arduino core&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sé programar, pero no C/C++&lt;/td&gt;&lt;td&gt;&lt;strong&gt;MicroPython&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Necesito control y rendimiento&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ESP-IDF&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Quiero seguridad y robustez&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Rust (&lt;code&gt;esp-idf-hal&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Voy a un producto a batería&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ESP-IDF&lt;/strong&gt; (o Rust)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Quiero enseñar a alguien&lt;/td&gt;&lt;td&gt;&lt;strong&gt;MicroPython&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Truco:&lt;/strong&gt; no tienes que elegir para siempre. Mucha gente empieza con Arduino y
salta a ESP-IDF cuando el proyecto lo exige. Los conceptos (GPIO, I2C, tareas)
se comparten.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;lo-que-importa-mas-que-el-framework&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-que-importa-mas-que-el-framework&quot; aria-label=&quot;Anchor link for: lo-que-importa-mas-que-el-framework&quot;&gt;Lo que importa más que el framework&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Entender el hardware&lt;/strong&gt;: ADC, pines reservados, consumo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saber depurar&lt;/strong&gt;: logs, &lt;code&gt;printf&lt;/code&gt;, medir señales.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leer el datasheet&lt;/strong&gt; cuando algo no cuadra.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Con eso, cambiar de framework es un fin de semana. Sin eso, ninguno te salva.&lt;/p&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Arduino&lt;/strong&gt;: empezar rápido. &lt;strong&gt;ESP-IDF&lt;/strong&gt;: control y producción.
&lt;strong&gt;MicroPython&lt;/strong&gt;: aprender y prototipar. &lt;strong&gt;Rust&lt;/strong&gt;: robustez.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lua&lt;/strong&gt; ya no merece la pena para proyectos nuevos.&lt;/li&gt;
&lt;li&gt;La versión actual de cada uno está en la tabla de arriba.&lt;/li&gt;
&lt;li&gt;Elige por tu &lt;strong&gt;experiencia&lt;/strong&gt; y tu &lt;strong&gt;objetivo&lt;/strong&gt;, no por moda.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; vamos al detalle con el
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;Arduino core&lt;/a&gt;, el más usado. O vuelve al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>ESP8266 vs ESP32: cuándo (no) merece la pena el pequeño</title>
        <published>2026-09-25T00:00:00+00:00</published>
        <updated>2026-09-25T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp8266-vs-esp32/"/>
        <id>https://esp32.tunatek.tech/blog/esp8266-vs-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp8266-vs-esp32/">&lt;p&gt;El ESP8266 puso el Wi-Fi barato en manos de todo el mundo. Fue el chip que
convirtió al &lt;em&gt;maker&lt;/em&gt; en alguien capaz de tener una web en su salón por dos
dólares. Y todavía se vende, todavía se usa y todavía tiene su público.&lt;/p&gt;
&lt;p&gt;La pregunta honesta es: &lt;strong&gt;¿tiene sentido comprarlo hoy?&lt;/strong&gt; Casi siempre no, y aquí
está el porqué.&lt;/p&gt;
&lt;h2 id=&quot;las-diferencias-que-importan&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#las-diferencias-que-importan&quot; aria-label=&quot;Anchor link for: las-diferencias-que-importan&quot;&gt;Las diferencias que importan&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;ESP8266&lt;/th&gt;&lt;th&gt;ESP32 (clásico)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Núcleos&lt;/td&gt;&lt;td&gt;1 × Xtensa L106 @ 160 MHz&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2 × LX6 @ 240 MHz&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;RAM útil&lt;/td&gt;&lt;td&gt;~50 KB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;~320 KB&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi&lt;/td&gt;&lt;td&gt;Wi-Fi 4&lt;/td&gt;&lt;td&gt;Wi-Fi 4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;&lt;strong&gt;BT 4.2 + BLE&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIOs usables&lt;/td&gt;&lt;td&gt;~11&lt;/td&gt;&lt;td&gt;~25&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ADC&lt;/td&gt;&lt;td&gt;1 canal de 10 bits&lt;/td&gt;&lt;td&gt;18 canales de 12 bits&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DAC&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;USB nativo&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;No es solo «menos potente»: es que &lt;strong&gt;hay 10 veces menos memoria&lt;/strong&gt; y muy pocos
pines. Eso condiciona todo lo que puedes hacer.&lt;/p&gt;
&lt;h2 id=&quot;donde-el-esp8266-todavia-brilla&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#donde-el-esp8266-todavia-brilla&quot; aria-label=&quot;Anchor link for: donde-el-esp8266-todavia-brilla&quot;&gt;Dónde el ESP8266 todavía brilla&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Precio puro&lt;/strong&gt;: en AliExpress se encuentra por menos de 2 €.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplicidad&lt;/strong&gt;: para leer un sensor y publicar por Wi-Fi con un único
&lt;em&gt;endpoint&lt;/em&gt;, sobra.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legado&lt;/strong&gt;: hay toneladas de código y tutoriales funcionando.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumo muy bajo&lt;/strong&gt; en &lt;em&gt;deep sleep&lt;/em&gt; si el proyecto es sencillo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;donde-se-queda-corto-y-duele&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#donde-se-queda-corto-y-duele&quot; aria-label=&quot;Anchor link for: donde-se-queda-corto-y-duele&quot;&gt;Dónde se queda corto (y duele)&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Memoria&lt;/strong&gt;: un parser JSON grande o TLS te deja sin RAM y con reinicios
aleatorios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un solo núcleo&lt;/strong&gt;: el Wi-Fi y tu código comparten la CPU, así que cualquier
tarea larga provoca &lt;em&gt;watchdog resets&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pines&lt;/strong&gt;: con el ADC y la flash, te quedan muy pocos GPIOs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS&lt;/strong&gt;: los &lt;em&gt;handshakes&lt;/em&gt; modernos son caros para este chip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actualidad&lt;/strong&gt;: el ecosistema ya está centrado en el ESP32.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;la-comparacion-que-de-verdad-importa-hoy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-comparacion-que-de-verdad-importa-hoy&quot; aria-label=&quot;Anchor link for: la-comparacion-que-de-verdad-importa-hoy&quot;&gt;La comparación que de verdad importa hoy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si el ESP8266 te tienta por precio, &lt;strong&gt;compáralo con el ESP32-C3&lt;/strong&gt;, no con el
ESP32 clásico:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;ESP8266&lt;/th&gt;&lt;th&gt;&lt;strong&gt;ESP32-C3&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Precio&lt;/td&gt;&lt;td&gt;~1,5 €&lt;/td&gt;&lt;td&gt;~2–3 €&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Núcleo&lt;/td&gt;&lt;td&gt;Xtensa&lt;/td&gt;&lt;td&gt;&lt;strong&gt;RISC-V @ 160 MHz&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;RAM&lt;/td&gt;&lt;td&gt;~50 KB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;400 KB&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;&lt;strong&gt;BLE 5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;USB nativo&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Sí (Serial/JTAG)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ADC&lt;/td&gt;&lt;td&gt;10 bits&lt;/td&gt;&lt;td&gt;&lt;strong&gt;12 bits&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La diferencia de precio es de &lt;strong&gt;unos céntimos&lt;/strong&gt; y el C3 es mejor en todo. Por eso
recomiendo olvidarse del 8266 si el proyecto es nuevo.&lt;/p&gt;
&lt;h2 id=&quot;cuando-usar-cada-uno&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-usar-cada-uno&quot; aria-label=&quot;Anchor link for: cuando-usar-cada-uno&quot;&gt;¿Cuándo usar cada uno?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Usa el ESP8266 si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El precio es &lt;em&gt;lo único&lt;/em&gt; que importa (producción de volumen, juguetes).&lt;/li&gt;
&lt;li&gt;Tienes código viejo funcionando y no quieres tocarlo.&lt;/li&gt;
&lt;li&gt;El proyecto es un sensor mínimo que nunca crecerá.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Usa un ESP32 (C3) si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Necesitas &lt;strong&gt;BLE&lt;/strong&gt;, &lt;strong&gt;más pines&lt;/strong&gt; o &lt;strong&gt;más memoria&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Vas a hacer TLS, OTA o lógica no trivial.&lt;/li&gt;
&lt;li&gt;Quieres &lt;strong&gt;USB nativo&lt;/strong&gt; y depuración decente.&lt;/li&gt;
&lt;li&gt;Piensas que el proyecto &lt;strong&gt;crezca&lt;/strong&gt; (y siempre crece).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;migrar-del-8266-al-esp32-c3&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#migrar-del-8266-al-esp32-c3&quot; aria-label=&quot;Anchor link for: migrar-del-8266-al-esp32-c3&quot;&gt;Migrar del 8266 al ESP32-C3&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si vienes del 8266 y saltas al C3, ojo con esto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ESP8266WiFi.h&lt;/code&gt; pasa a &lt;code&gt;WiFi.h&lt;/code&gt;&lt;/strong&gt; (y algunas APIs cambian de nombre).&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;ADC es distinto&lt;/strong&gt;: en el 8266 es &lt;code&gt;A0&lt;/code&gt; (10 bits); en el C3 usa ADC1 con
12 bits.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;deep sleep&lt;/strong&gt; es más flexible: se pueden despertar GPIOs concretos.&lt;/li&gt;
&lt;li&gt;Las &lt;strong&gt;librerías&lt;/strong&gt; del 8266 no siempre compilan: busca su equivalente para
ESP32.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;mapeo de pines&lt;/strong&gt; no se parece en nada: no copies el cableado.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;El ESP8266 fue revolucionario, pero &lt;strong&gt;hoy está desfasado&lt;/strong&gt; frente al C3.&lt;/li&gt;
&lt;li&gt;Tiene &lt;strong&gt;~50 KB de RAM, un núcleo y pocos pines&lt;/strong&gt;: se queda corto enseguida.&lt;/li&gt;
&lt;li&gt;Solo gana cuando el &lt;strong&gt;precio&lt;/strong&gt; lo es todo o hay código heredado.&lt;/li&gt;
&lt;li&gt;Para proyectos nuevos, un &lt;strong&gt;ESP32-C3&lt;/strong&gt; cuesta casi lo mismo y es muy superior.&lt;/li&gt;
&lt;li&gt;Si migras, espera cambios en Wi-Fi, ADC y pines.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; con esto cerramos las variantes. Toca
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;elegir framework&lt;/a&gt;: Arduino, ESP-IDF, MicroPython o
Rust. O vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>ESP32-P4 a fondo: el ESP32 sin radio para pantallas y alto rendimiento</title>
        <published>2026-09-24T00:00:00+00:00</published>
        <updated>2026-09-24T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp32-p4-a-fondo/"/>
        <id>https://esp32.tunatek.tech/blog/esp32-p4-a-fondo/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp32-p4-a-fondo/">&lt;p&gt;El ESP32-P4 rompe el molde de la familia: &lt;strong&gt;no tiene Wi-Fi, ni Bluetooth, ni
802.15.4&lt;/strong&gt;. Nada de radios. A cambio, es el ESP32 más potente que existe y el
primero pensado como &lt;strong&gt;procesador de aplicación&lt;/strong&gt;: pantallas, interfaces, vídeo
ligero y cálculo.&lt;/p&gt;
&lt;p&gt;Suena raro para un ESP32… hasta que entiendes la jugada: &lt;strong&gt;tú decides la radio&lt;/strong&gt;.
Se le pone al lado un &lt;strong&gt;C6&lt;/strong&gt; y tienes lo mejor de los dos mundos.&lt;/p&gt;
&lt;h2 id=&quot;que-es&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-es&quot; aria-label=&quot;Anchor link for: que-es&quot;&gt;Qué es&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cosa&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Núcleos&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2 × RISC-V @ 400 MHz&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SRAM&lt;/td&gt;&lt;td&gt;&lt;strong&gt;768 KB&lt;/strong&gt; on-chip (+ 8 KB TCM)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Radio&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ninguna&lt;/strong&gt; (Wi-Fi/BT por un chip aparte)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIOs&lt;/td&gt;&lt;td&gt;&lt;strong&gt;55&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;USB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;OTG 2.0 de alta velocidad&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Otros&lt;/td&gt;&lt;td&gt;&lt;strong&gt;MIPI-CSI/DSI&lt;/strong&gt;, Ethernet, SDIO, CAN&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;IA&lt;/td&gt;&lt;td&gt;Extensiones de IA + FPU&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Dos detalles que lo separan del resto: &lt;strong&gt;MIPI-CSI/DSI&lt;/strong&gt; (interfaces de cámara y
pantalla de verdad, no SPI) y &lt;strong&gt;USB de alta velocidad&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;la-radio-se-la-pones-tu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-radio-se-la-pones-tu&quot; aria-label=&quot;Anchor link for: la-radio-se-la-pones-tu&quot;&gt;La radio se la pones tú&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El P4 no trae conectividad a propósito. Lo normal es emparejarlo con un &lt;strong&gt;C6&lt;/strong&gt;
(que sí tiene Wi-Fi 6, BLE y 802.15.4) y repartir el trabajo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El &lt;strong&gt;P4&lt;/strong&gt; se encarga de la pantalla, la cámara y la lógica.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;C6&lt;/strong&gt; se encarga de hablar con el mundo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por eso el kit oficial, la &lt;strong&gt;ESP32-P4-Function-EV-Board&lt;/strong&gt;, viene ya con un C6
incorporado.&lt;/p&gt;
&lt;h2 id=&quot;pines-muchisimos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pines-muchisimos&quot; aria-label=&quot;Anchor link for: pines-muchisimos&quot;&gt;Pines: muchísimos&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Con &lt;strong&gt;55 GPIOs&lt;/strong&gt; programables, este chip no tiene el problema de pines de sus
hermanos pequeños. Trae además bloques para SPI, I2C, I2S, UART, CAN, SDIO,
Ethernet (RMII) y las interfaces MIPI. Para el mapeo exacto, el
&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://docs.espressif.com/&quot;&gt;datasheet de Espressif&lt;/a&gt; es la referencia.&lt;/p&gt;
&lt;p&gt;Aviso importante: &lt;strong&gt;sí tiene ADC&lt;/strong&gt;, pero olvídate del Wi-Fi que rompía el ADC2 en
otros modelos — aquí no hay radio que interfiera.&lt;/p&gt;
&lt;h2 id=&quot;placas&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#placas&quot; aria-label=&quot;Anchor link for: placas&quot;&gt;Placas&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP32-P4-Function-EV-Board&lt;/strong&gt; — placa de evaluación con &lt;strong&gt;C6 integrado&lt;/strong&gt;,
pantalla MIPI y cámara. La forma más fácil de empezar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-P4-Module&lt;/strong&gt; — para tus propias PCB.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/familia-esp32.svg&quot; alt=&quot;La familia ESP32 con el P4 al final&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;El P4 (2024) cierra la línea: sin radio, pero como procesador de aplicación. Ilustración propia.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;cuando-elegirlo-y-cuando-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegirlo-y-cuando-no&quot; aria-label=&quot;Anchor link for: cuando-elegirlo-y-cuando-no&quot;&gt;¿Cuándo elegirlo (y cuándo no)?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí, elige el P4 si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vas a manejar &lt;strong&gt;pantallas grandes o táctiles&lt;/strong&gt; (MIPI, no SPI lento).&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;cámara&lt;/strong&gt; de verdad, con MIPI-CSI.&lt;/li&gt;
&lt;li&gt;Quieres &lt;strong&gt;USB de alta velocidad&lt;/strong&gt;, Ethernet o mucho cálculo.&lt;/li&gt;
&lt;li&gt;Divides el proyecto en &lt;strong&gt;procesador + radio&lt;/strong&gt; (P4 + C6).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No lo elijas si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quieres algo &lt;strong&gt;simple con Wi-Fi&lt;/strong&gt;: un &lt;strong&gt;C3&lt;/strong&gt; o un &lt;strong&gt;C6&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Buscas &lt;strong&gt;lo más barato&lt;/strong&gt;: el P4 no lo es.&lt;/li&gt;
&lt;li&gt;No necesitas pantalla ni mucho cálculo: estarías pagando de más.&lt;/li&gt;
&lt;li&gt;Esperas &lt;strong&gt;conectividad a bordo&lt;/strong&gt;: no la tiene (y eso confunde a mucha gente).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;errores-tipicos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos&quot; aria-label=&quot;Anchor link for: errores-tipicos&quot;&gt;Errores típicos&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Comprarlo esperando que traiga &lt;strong&gt;Wi-Fi integrado&lt;/strong&gt; (no trae; necesitas el C6).&lt;/li&gt;
&lt;li&gt;Intentar montar una pantalla seria por &lt;strong&gt;SPI&lt;/strong&gt; cuando tienes MIPI-DSI.&lt;/li&gt;
&lt;li&gt;Olvidar que es un chip &lt;strong&gt;nuevo&lt;/strong&gt;: requiere toolchain reciente (ESP-IDF 5.3+,
hoy &lt;strong&gt;6.1&lt;/strong&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dos RISC-V a 400 MHz&lt;/strong&gt;, &lt;strong&gt;768 KB de SRAM&lt;/strong&gt; y &lt;strong&gt;55 GPIOs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MIPI-CSI/DSI&lt;/strong&gt;, USB 2.0 HS y Ethernet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sin radio&lt;/strong&gt;: se combina con un &lt;strong&gt;C6&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Es el chip para &lt;strong&gt;HMI, pantallas y alto rendimiento&lt;/strong&gt;, no para un sensor tonto.&lt;/li&gt;
&lt;li&gt;Si dudas entre P4 y S3: el S3 es más barato y ya lleva radio; el P4 es para
cuando necesitas pantalla de verdad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; cerramos el bloque de variantes con
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;ESP8266 vs ESP32&lt;/a&gt; y, después, los &lt;strong&gt;frameworks&lt;/strong&gt;. O
vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>ESP32-H2 a fondo: el ESP32 sin Wi-Fi para nodos Matter a batería</title>
        <published>2026-09-23T00:00:00+00:00</published>
        <updated>2026-09-23T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp32-h2-a-fondo/"/>
        <id>https://esp32.tunatek.tech/blog/esp32-h2-a-fondo/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp32-h2-a-fondo/">&lt;p&gt;Puede sonar a broma: un ESP32 &lt;strong&gt;sin Wi-Fi&lt;/strong&gt;. Pero cuando lo piensas dos veces,
tiene todo el sentido. El H2 está pensado para &lt;strong&gt;domótica de bajo consumo&lt;/strong&gt;:
sensores, interruptores y nodos &lt;strong&gt;Matter/Thread&lt;/strong&gt; que tienen que durar meses con
una pila.&lt;/p&gt;
&lt;p&gt;Menos radios encendidas = menos batería. Y si ya tienes un &lt;em&gt;border router&lt;/em&gt; en
casa, un dispositivo no necesita Wi-Fi propio.&lt;/p&gt;
&lt;h2 id=&quot;que-es&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-es&quot; aria-label=&quot;Anchor link for: que-es&quot;&gt;Qué es&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Es un SoC &lt;strong&gt;RISC-V de un solo núcleo&lt;/strong&gt; centrado en lo inalámbrico de bajo
consumo, y con la flash &lt;strong&gt;dentro del propio chip&lt;/strong&gt; (2 o 4 MB), lo que simplifica
mucho el diseño.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cosa&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Núcleo&lt;/td&gt;&lt;td&gt;1 × RISC-V de bajo consumo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SRAM&lt;/td&gt;&lt;td&gt;&lt;strong&gt;320 KB&lt;/strong&gt; (+ 4 KB de memoria LP)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ROM&lt;/td&gt;&lt;td&gt;128 KB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ninguno&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;td&gt;&lt;strong&gt;BLE 5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;802.15.4&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Thread / Zigbee / Matter&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIOs&lt;/td&gt;&lt;td&gt;&lt;strong&gt;19&lt;/strong&gt; programables, con &lt;strong&gt;ADC&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;USB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Serial/JTAG nativo&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Flash&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2 o 4 MB integradas (SiP)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;por-que-no-tiene-wi-fi-y-por-que-esta-bien&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#por-que-no-tiene-wi-fi-y-por-que-esta-bien&quot; aria-label=&quot;Anchor link for: por-que-no-tiene-wi-fi-y-por-que-esta-bien&quot;&gt;Por qué no tiene Wi-Fi (y por qué está bien)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El H2 es un chip de &lt;strong&gt;nodo&lt;/strong&gt;, no de pasarela. En una red &lt;strong&gt;Thread&lt;/strong&gt; todos los
dispositivos hablan entre sí y &lt;strong&gt;solo uno&lt;/strong&gt; (el &lt;em&gt;border router&lt;/em&gt;) necesita salir a
Internet. Los demás pueden gastar su energía en lo importante: medir y dormir.&lt;/p&gt;
&lt;p&gt;Resultado: un H2 bien dormido consume muchísimo menos que un C6 con Wi-Fi activo.
Y encima no compite por el espectro con la red Wi-Fi de casa.&lt;/p&gt;
&lt;h2 id=&quot;pines-lo-que-debes-saber&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pines-lo-que-debes-saber&quot; aria-label=&quot;Anchor link for: pines-lo-que-debes-saber&quot;&gt;Pines: lo que debes saber&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El H2 trae &lt;strong&gt;19 GPIOs programables&lt;/strong&gt; con soporte de &lt;strong&gt;ADC&lt;/strong&gt;, SPI, UART, I2C, I2S,
RMT, GDMA y PWM. El mapeo exacto depende del módulo, así que para el detalle fino
conviene mirar el &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://docs.espressif.com/&quot;&gt;datasheet&lt;/a&gt;. Lo que sí conviene
tener claro:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un bloque de pines hace de &lt;strong&gt;ADC&lt;/strong&gt;; úsalo para sensores analógicos.&lt;/li&gt;
&lt;li&gt;Hay pines de &lt;em&gt;&lt;strong&gt;strapping&lt;/strong&gt;&lt;/em&gt; y pines ocupados por la &lt;strong&gt;flash interna&lt;/strong&gt;: no los
uses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB Serial/JTAG&lt;/strong&gt; para flashear y depurar sin chip externo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;placas-y-modulos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#placas-y-modulos&quot; aria-label=&quot;Anchor link for: placas-y-modulos&quot;&gt;Placas y módulos&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP32-H2-MINI-1&lt;/strong&gt; — el módulo pequeño (el habitual, con flash integrada).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-H2-DevKitM-1&lt;/strong&gt; — la placa de desarrollo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-H2-WROOM-1&lt;/strong&gt; — el módulo clásico.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-h2.svg&quot; alt=&quot;Ilustración del ESP32-H2 y sus características&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-H2: BLE 5 + Zigbee/Thread, sin Wi-Fi. Ilustración propia.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;cuando-elegirlo-y-cuando-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegirlo-y-cuando-no&quot; aria-label=&quot;Anchor link for: cuando-elegirlo-y-cuando-no&quot;&gt;¿Cuándo elegirlo (y cuándo no)?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí, elige el H2 si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Haces &lt;strong&gt;domótica Matter/Thread/Zigbee&lt;/strong&gt; y quieres &lt;strong&gt;máxima autonomía&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Necesitas un &lt;strong&gt;nodo pequeño y barato&lt;/strong&gt; que solo hable 802.15.4/BLE.&lt;/li&gt;
&lt;li&gt;Quieres &lt;strong&gt;flash integrada&lt;/strong&gt; para reducir componentes en tu PCB.&lt;/li&gt;
&lt;li&gt;Ya tienes un &lt;em&gt;border router&lt;/em&gt; y no necesitas Wi-Fi en el nodo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No lo elijas si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El dispositivo necesita &lt;strong&gt;salir a Internet por sí mismo&lt;/strong&gt; → &lt;strong&gt;C6&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Haces Wi-Fi normal → &lt;strong&gt;C3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;cámara, audio o IA&lt;/strong&gt; → &lt;strong&gt;S3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;muchos GPIOs&lt;/strong&gt; → &lt;strong&gt;S3&lt;/strong&gt; o &lt;strong&gt;P4&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;errores-tipicos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos&quot; aria-label=&quot;Anchor link for: errores-tipicos&quot;&gt;Errores típicos&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Comprarlo pensando que &lt;strong&gt;tiene Wi-Fi&lt;/strong&gt; (no lo tiene, y no hay firmware que lo
arregle).&lt;/li&gt;
&lt;li&gt;Intentar usarlo como &lt;strong&gt;pasarela&lt;/strong&gt;: para eso necesitas un &lt;strong&gt;C6&lt;/strong&gt; (o un C6 + H2).&lt;/li&gt;
&lt;li&gt;Olvidar que su gracia es &lt;strong&gt;dormir&lt;/strong&gt;: si lo tienes despierto todo el rato,
pierdes la ventaja.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RISC-V single&lt;/strong&gt; de bajo consumo, &lt;strong&gt;320 KB de SRAM&lt;/strong&gt; y &lt;strong&gt;flash integrada&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BLE 5 + 802.15.4&lt;/strong&gt; (Thread/Zigbee/Matter) y &lt;strong&gt;sin Wi-Fi&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;19 GPIOs con ADC&lt;/strong&gt; y USB Serial/JTAG.&lt;/li&gt;
&lt;li&gt;Es el chip ideal para &lt;strong&gt;nodos Matter a batería&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Para pasarela o Wi-Fi, mejor un &lt;strong&gt;C6&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; el &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;ESP32-P4&lt;/a&gt;, el nuevo chip sin
radio para pantallas y alto rendimiento. O vuelve al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>ESP32-C6 a fondo: Wi-Fi 6, Matter y Thread en un solo chip</title>
        <published>2026-09-22T00:00:00+00:00</published>
        <updated>2026-09-22T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp32-c6-a-fondo/"/>
        <id>https://esp32.tunatek.tech/blog/esp32-c6-a-fondo/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp32-c6-a-fondo/">&lt;p&gt;El ESP32-C6 es el chip de la &lt;strong&gt;domótica moderna&lt;/strong&gt;. No por ser el más potente, sino
porque trae algo que ninguno de sus hermanos tiene: &lt;strong&gt;radio 802.15.4&lt;/strong&gt;, que es la
base de &lt;strong&gt;Thread, Zigbee y Matter&lt;/strong&gt;. Y encima llega con &lt;strong&gt;Wi-Fi 6&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si vas a montar una casa conectada de verdad (la que habla con Apple Home,
Google Home o Home Assistant sin inventos), este es el chip.&lt;/p&gt;
&lt;h2 id=&quot;que-es&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-es&quot; aria-label=&quot;Anchor link for: que-es&quot;&gt;Qué es&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El C6 usa &lt;strong&gt;dos núcleos RISC-V&lt;/strong&gt;: uno de alto rendimiento (HP, 160 MHz) y uno de
bajo consumo (LP, 20 MHz) que puede quedarse vigilando sensores mientras el resto
duerme.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cosa&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Núcleos&lt;/td&gt;&lt;td&gt;RISC-V HP 160 MHz + LP 20 MHz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SRAM&lt;/td&gt;&lt;td&gt;512 KB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Wi-Fi 6 (802.11ax, 2,4 GHz)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;td&gt;&lt;strong&gt;BLE 5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;802.15.4&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Thread / Zigbee / Matter&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIOs&lt;/td&gt;&lt;td&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;USB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Serial/JTAG nativo&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;lo-que-lo-hace-unico-802-15-4-wi-fi-6&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-que-lo-hace-unico-802-15-4-wi-fi-6&quot; aria-label=&quot;Anchor link for: lo-que-lo-hace-unico-802-15-4-wi-fi-6&quot;&gt;Lo que lo hace único: 802.15.4 + Wi-Fi 6&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;802.15.4&lt;/strong&gt; es la radio de &lt;strong&gt;Matter, Thread y Zigbee&lt;/strong&gt;. Sin ella, tu dispositivo
no puede hablar el idioma de la casa conectada moderna.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wi-Fi 6&lt;/strong&gt; no es marketing: mejora la convivencia con muchas redes cerca y
añade &lt;strong&gt;TWT&lt;/strong&gt; (&lt;em&gt;Target Wake Time&lt;/em&gt;), que permite negociar con el router cuándo
despertar. Traducción: &lt;strong&gt;menos consumo&lt;/strong&gt; para el mismo Wi-Fi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y puede usar Wi-Fi y 802.15.4 a la vez, así que puedes montar un &lt;strong&gt;border router&lt;/strong&gt;
de Thread… o simplemente ser un dispositivo Matter que sale a Internet por Wi-Fi.&lt;/p&gt;
&lt;h2 id=&quot;pinout-lo-esencial&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pinout-lo-esencial&quot; aria-label=&quot;Anchor link for: pinout-lo-esencial&quot;&gt;Pinout: lo esencial&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pin(es)&lt;/th&gt;&lt;th&gt;Para qué&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO12 / GPIO13&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;USB D− / D+&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO0–6&lt;/td&gt;&lt;td&gt;ADC1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO8, GPIO9, GPIO15&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;em&gt;Strapping&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO24–30&lt;/td&gt;&lt;td&gt;Flash interna (no usar)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO5 / GPIO6&lt;/td&gt;&lt;td&gt;UART (RX / TX) habitual&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Como en toda la familia: &lt;strong&gt;sin DAC&lt;/strong&gt;, &lt;strong&gt;sin touch&lt;/strong&gt; y el &lt;strong&gt;ADC2 no funciona con
Wi-Fi&lt;/strong&gt; (aquí, usa ADC1).&lt;/p&gt;
&lt;h2 id=&quot;placas-y-modulos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#placas-y-modulos&quot; aria-label=&quot;Anchor link for: placas-y-modulos&quot;&gt;Placas y módulos&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP32-C6-WROOM-1&lt;/strong&gt; — módulo estándar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-C6-MINI-1&lt;/strong&gt; — versión pequeña.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-C6-DevKitC-1&lt;/strong&gt; — placa de desarrollo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-C6-DevKitM-1&lt;/strong&gt; — la reducida.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-c6.jpg&quot; alt=&quot;Placa de desarrollo ESP32-C6&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-C6: Wi-Fi 6 + BLE 5 + 802.15.4 (Thread/Zigbee/Matter). Foto: Popolon (CC BY-SA 4.0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;cuando-elegirlo-y-cuando-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegirlo-y-cuando-no&quot; aria-label=&quot;Anchor link for: cuando-elegirlo-y-cuando-no&quot;&gt;¿Cuándo elegirlo (y cuándo no)?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí, elige el C6 si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vas a hacer &lt;strong&gt;Matter, Thread o Zigbee&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Quieres &lt;strong&gt;Wi-Fi 6&lt;/strong&gt; y buen consumo con TWT.&lt;/li&gt;
&lt;li&gt;Necesitas un dispositivo compatible con los ecosistemas de casa modernos.&lt;/li&gt;
&lt;li&gt;Quieres montar un &lt;strong&gt;border router&lt;/strong&gt; de Thread.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No lo elijas si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solo haces Wi-Fi normal y barato: un &lt;strong&gt;C3&lt;/strong&gt; cuesta menos.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;cámara, audio o IA&lt;/strong&gt;: eso es el &lt;strong&gt;S3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;Bluetooth clásico&lt;/strong&gt; o &lt;strong&gt;DAC&lt;/strong&gt;: el &lt;strong&gt;clásico&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;No necesitas Wi-Fi: el &lt;strong&gt;H2&lt;/strong&gt; es más barato para un nodo 802.15.4/BLE.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;errores-tipicos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos&quot; aria-label=&quot;Anchor link for: errores-tipicos&quot;&gt;Errores típicos&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Comprar un C6 «para probar» sin toolchain reciente: Matter necesita
&lt;strong&gt;ESP-IDF 5.1+&lt;/strong&gt; (hoy vamos por la &lt;strong&gt;6.1&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Esperar un &lt;strong&gt;DAC&lt;/strong&gt; o &lt;strong&gt;touch&lt;/strong&gt; que no existen.&lt;/li&gt;
&lt;li&gt;Confundir Matter (protocolo de aplicación) con Thread (red): el C6 trae la
radio para ambos.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RISC-V doble&lt;/strong&gt; (HP + LP), 512 KB de SRAM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wi-Fi 6 + BLE 5 + 802.15.4&lt;/strong&gt;: el único de la familia con Matter por hardware.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;30 GPIOs&lt;/strong&gt; y USB Serial/JTAG.&lt;/li&gt;
&lt;li&gt;Es la elección para &lt;strong&gt;domótica moderna&lt;/strong&gt;; para todo lo demás, C3 o S3.&lt;/li&gt;
&lt;li&gt;Necesita toolchain actualizado (ESP-IDF 5.1+, idealmente 6.x).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; el &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;ESP32-H2&lt;/a&gt;, su hermano sin Wi-Fi
para nodos Matter a batería. O vuelve al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>ESP32-C3 a fondo: el que recomiendo para empezar (y por qué)</title>
        <published>2026-09-21T00:00:00+00:00</published>
        <updated>2026-09-21T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp32-c3-a-fondo/"/>
        <id>https://esp32.tunatek.tech/blog/esp32-c3-a-fondo/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp32-c3-a-fondo/">&lt;p&gt;Si me preguntas «¿qué ESP32 compro para empezar?», la respuesta corta es
&lt;strong&gt;ESP32-C3&lt;/strong&gt;. Es moderno, barato, con Bluetooth 5 y USB nativo, y para el 90 % de
los proyectos de sensores y domótica es &lt;strong&gt;más que suficiente&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;No es perfecto: tiene &lt;strong&gt;pocos pines&lt;/strong&gt; y le faltan cosas. Vamos a ver exactamente
qué te da y qué no.&lt;/p&gt;
&lt;h2 id=&quot;que-es&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-es&quot; aria-label=&quot;Anchor link for: que-es&quot;&gt;Qué es&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El C3 es el ESP32 «de nueva generación»: en vez de los núcleos Xtensa de siempre,
usa &lt;strong&gt;RISC-V&lt;/strong&gt;, la arquitectura libre que Espressif adoptó para sus chips más
recientes.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cosa&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Núcleo&lt;/td&gt;&lt;td&gt;1 × RISC-V @ 160 MHz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SRAM&lt;/td&gt;&lt;td&gt;400 KB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi&lt;/td&gt;&lt;td&gt;802.11 b/g/n (2,4 GHz)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;td&gt;&lt;strong&gt;BLE 5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIOs&lt;/td&gt;&lt;td&gt;&lt;strong&gt;22&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ADC&lt;/td&gt;&lt;td&gt;2 × 12 bits (6 canales)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DAC&lt;/td&gt;&lt;td&gt;ninguno&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Touch&lt;/td&gt;&lt;td&gt;no tiene&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;USB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Serial/JTAG nativo&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;lo-bueno&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-bueno&quot; aria-label=&quot;Anchor link for: lo-bueno&quot;&gt;Lo bueno&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Barato&lt;/strong&gt;: suele costar lo mismo que un ESP8266 y es mejor en todo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BLE 5&lt;/strong&gt;: perfecto para hablar con el móvil (no tiene Bluetooth clásico).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB nativo&lt;/strong&gt;: olvídate del CH340 y disfruta de &lt;strong&gt;JTAG integrado&lt;/strong&gt;, que
permite depurar con puntos de ruptura sin hardware extra.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumo bajo&lt;/strong&gt;: en &lt;em&gt;deep sleep&lt;/em&gt; queda por debajo del clásico, ideal para
nodos a batería.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RISC-V&lt;/strong&gt;: toolchain moderna y soporte de primera en ESP-IDF, Arduino y Rust.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lo-malo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-malo&quot; aria-label=&quot;Anchor link for: lo-malo&quot;&gt;Lo malo&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Solo 22 GPIOs&lt;/strong&gt;, y de esos hay que descontar los de la flash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sin DAC&lt;/strong&gt; y &lt;strong&gt;sin touch&lt;/strong&gt;: si necesitas salida analógica real o botones
capacitivos, vuelve al clásico o al S2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un solo núcleo&lt;/strong&gt;: no repartes tareas entre dos CPUs.&lt;/li&gt;
&lt;li&gt;Bluetooth &lt;strong&gt;solo BLE&lt;/strong&gt;, nada de clásico.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pinout-lo-esencial&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pinout-lo-esencial&quot; aria-label=&quot;Anchor link for: pinout-lo-esencial&quot;&gt;Pinout: lo esencial&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pin(es)&lt;/th&gt;&lt;th&gt;Para qué&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO18 / GPIO19&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;USB D− / D+&lt;/strong&gt; (USB Serial/JTAG)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO0–4&lt;/td&gt;&lt;td&gt;ADC1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO5&lt;/td&gt;&lt;td&gt;ADC2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO2, GPIO8, GPIO9&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;em&gt;Strapping&lt;/em&gt; (ojo con el 9: es el botón BOOT)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO11–17&lt;/td&gt;&lt;td&gt;Flash interna (no usar)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO20 / GPIO21&lt;/td&gt;&lt;td&gt;UART (RX / TX)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Como siempre: &lt;strong&gt;ADC2 no funciona con Wi-Fi encendido&lt;/strong&gt;, así que para sensores tira
de &lt;strong&gt;ADC1 (GPIO0–4)&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/pinout-esp32-c3.png&quot; alt=&quot;Pinout del ESP32-C3&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Pinout del ESP32-C3. Fuente: Wikimedia Commons, CC BY-SA 4.0.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;placas-y-modulos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#placas-y-modulos&quot; aria-label=&quot;Anchor link for: placas-y-modulos&quot;&gt;Placas y módulos&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP32-C3-WROOM-02&lt;/strong&gt; — el módulo estándar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-C3-MINI-1&lt;/strong&gt; — pequeño, para PCB propia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-C3-DevKitM-1&lt;/strong&gt; — la placa pequeña, tipo &lt;em&gt;stick&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-C3-DevKitC-02&lt;/strong&gt; — con más pines y botones.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-c3.jpg&quot; alt=&quot;Placa ESP32-C3 estilo NodeMCU&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Un ESP32-C3 tipo NodeMCU: pequeño, barato y con USB-C. Foto: Popolon (CC BY-SA 4.0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;cuando-elegirlo-y-cuando-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegirlo-y-cuando-no&quot; aria-label=&quot;Anchor link for: cuando-elegirlo-y-cuando-no&quot;&gt;¿Cuándo elegirlo (y cuándo no)?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí, elige el C3 si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estás &lt;strong&gt;empezando&lt;/strong&gt; y no quieres gastar de más.&lt;/li&gt;
&lt;li&gt;Haces &lt;strong&gt;domótica&lt;/strong&gt;, sensores o relés con Wi-Fi y BLE.&lt;/li&gt;
&lt;li&gt;Quieres &lt;strong&gt;USB nativo&lt;/strong&gt; y &lt;strong&gt;JTAG&lt;/strong&gt; sin chip extra.&lt;/li&gt;
&lt;li&gt;Buscas un nodo a &lt;strong&gt;batería&lt;/strong&gt; con buen &lt;em&gt;deep sleep&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No lo elijas si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Necesitas &lt;strong&gt;Bluetooth clásico&lt;/strong&gt; → ESP32 clásico.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;DAC&lt;/strong&gt; o &lt;strong&gt;touch&lt;/strong&gt; → clásico o S2.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;muchos GPIOs&lt;/strong&gt; → S2 o S3.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;cámara, audio o IA&lt;/strong&gt; → S3.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;Matter/Thread/Zigbee&lt;/strong&gt; → C6 o H2.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;errores-tipicos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos&quot; aria-label=&quot;Anchor link for: errores-tipicos&quot;&gt;Errores típicos&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Contar con &lt;strong&gt;22 GPIOs&lt;/strong&gt; y olvidar que &lt;strong&gt;GPIO11–17&lt;/strong&gt; son de la flash.&lt;/li&gt;
&lt;li&gt;Poner el &lt;strong&gt;botón BOOT en GPIO9&lt;/strong&gt; y que el chip arranque en modo descarga.&lt;/li&gt;
&lt;li&gt;Buscar el &lt;strong&gt;DAC&lt;/strong&gt; o el &lt;strong&gt;touch&lt;/strong&gt; en la documentación del C3 (no existen).&lt;/li&gt;
&lt;li&gt;Leer sensores por &lt;strong&gt;ADC2&lt;/strong&gt; con el Wi-Fi conectado.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1 núcleo RISC-V&lt;/strong&gt; a 160 MHz, 400 KB de SRAM, &lt;strong&gt;Wi-Fi 4 + BLE 5&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB Serial/JTAG nativo&lt;/strong&gt; y buen consumo en &lt;em&gt;deep sleep&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;22 GPIOs&lt;/strong&gt;, sin DAC y sin touch.&lt;/li&gt;
&lt;li&gt;Es &lt;strong&gt;la mejor compra para empezar&lt;/strong&gt; en 2026: barato, moderno y bien soportado.&lt;/li&gt;
&lt;li&gt;Si necesitas más músculo o pines, salta al &lt;strong&gt;S3&lt;/strong&gt; o al &lt;strong&gt;S2&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; el &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;ESP32-C6&lt;/a&gt;, con Wi-Fi 6 y radio
para &lt;strong&gt;Matter&lt;/strong&gt;. O vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>ESP32-S3 a fondo: núcleos, PSRAM, IA y USB para proyectos serios</title>
        <published>2026-09-20T00:00:00+00:00</published>
        <updated>2026-09-20T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp32-s3-a-fondo/"/>
        <id>https://esp32.tunatek.tech/blog/esp32-s3-a-fondo/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp32-s3-a-fondo/">&lt;p&gt;Si el S2 fue el experimento, el &lt;strong&gt;ESP32-S3&lt;/strong&gt; es la versión que salió bien:
&lt;strong&gt;dos núcleos&lt;/strong&gt;, Bluetooth, USB nativo y, encima, &lt;strong&gt;instrucciones vectoriales&lt;/strong&gt;
que aceleran la IA. Es el chip de las placas con cámara, de los asistentes de voz
y de casi cualquier proyecto «grande» con ESP32.&lt;/p&gt;
&lt;p&gt;Eso sí: es el más caro de la familia y, si no vas a usar lo que trae, estarás
pagando de más.&lt;/p&gt;
&lt;h2 id=&quot;que-es&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-es&quot; aria-label=&quot;Anchor link for: que-es&quot;&gt;Qué es&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cosa&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Núcleos&lt;/td&gt;&lt;td&gt;2 × Xtensa LX7 @ 240 MHz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SRAM&lt;/td&gt;&lt;td&gt;512 KB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi&lt;/td&gt;&lt;td&gt;802.11 b/g/n (2,4 GHz)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;td&gt;&lt;strong&gt;BLE 5&lt;/strong&gt; (sin Bluetooth clásico)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIOs&lt;/td&gt;&lt;td&gt;&lt;strong&gt;hasta 45&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ADC&lt;/td&gt;&lt;td&gt;20 canales de 12 bits&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Touch&lt;/td&gt;&lt;td&gt;14 canales&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;USB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;OTG nativo&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PSRAM&lt;/td&gt;&lt;td&gt;hasta 8 MB (según módulo)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Fíjate en dos cosas: &lt;strong&gt;no tiene DAC&lt;/strong&gt; (a diferencia del clásico y el S2) y su
Bluetooth es &lt;strong&gt;solo BLE&lt;/strong&gt;, igual que el C3.&lt;/p&gt;
&lt;h2 id=&quot;lo-que-lo-hace-especial-las-instrucciones-vectoriales&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-que-lo-hace-especial-las-instrucciones-vectoriales&quot; aria-label=&quot;Anchor link for: lo-que-lo-hace-especial-las-instrucciones-vectoriales&quot;&gt;Lo que lo hace especial: las instrucciones vectoriales&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El S3 añade &lt;strong&gt;SIMD de 128 bits&lt;/strong&gt; pensado para redes neuronales. En la práctica,
eso significa que un modelo pequeño de detección de voz o de gestos corre
&lt;strong&gt;varias veces más rápido&lt;/strong&gt; que en un clásico, sin GPU ni acelerador externo.&lt;/p&gt;
&lt;p&gt;Es la razón por la que las placas con cámara y los «asistentes» caseros llevan
S3 y no C3.&lt;/p&gt;
&lt;h2 id=&quot;psram-quad-vs-octal-y-el-precio-en-pines&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#psram-quad-vs-octal-y-el-precio-en-pines&quot; aria-label=&quot;Anchor link for: psram-quad-vs-octal-y-el-precio-en-pines&quot;&gt;PSRAM: quad vs octal (y el precio en pines)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aquí hay una trampa que muerde a mucha gente. Los módulos S3 vienen en varias
combinaciones, por ejemplo &lt;strong&gt;N8R2&lt;/strong&gt; (8 MB flash + 2 MB PSRAM) o &lt;strong&gt;N8R8&lt;/strong&gt; (8 MB +
8 MB), y la PSRAM puede ser &lt;strong&gt;quad&lt;/strong&gt; u &lt;strong&gt;octal&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quad PSRAM&lt;/strong&gt; — usa menos pines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Octal PSRAM&lt;/strong&gt; — más rápida, pero &lt;strong&gt;se come GPIO33–GPIO37&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y en cualquier configuración, &lt;strong&gt;GPIO26–GPIO32&lt;/strong&gt; están ocupados por la flash (y
por la PSRAM si existe). Traducción: no cuentes con 45 GPIOs si el módulo lleva
memoria. Mira siempre el datasheet del módulo concreto.&lt;/p&gt;
&lt;h2 id=&quot;pinout-lo-esencial&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pinout-lo-esencial&quot; aria-label=&quot;Anchor link for: pinout-lo-esencial&quot;&gt;Pinout: lo esencial&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pin(es)&lt;/th&gt;&lt;th&gt;Para qué&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO19 / GPIO20&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;USB D− / D+&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO1–10&lt;/td&gt;&lt;td&gt;ADC1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO11–20&lt;/td&gt;&lt;td&gt;ADC2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO1–14&lt;/td&gt;&lt;td&gt;Touch&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO0, 3, 45, 46&lt;/td&gt;&lt;td&gt;&lt;em&gt;Strapping&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO26–32&lt;/td&gt;&lt;td&gt;Flash/PSRAM (no usar)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO33–37&lt;/td&gt;&lt;td&gt;&lt;strong&gt;extra&lt;/strong&gt; si el módulo lleva &lt;strong&gt;PSRAM octal&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Los periféricos de siempre siguen ahí (SPI, I2C, I2S, UART, PWM, RMT) y se añade
una &lt;strong&gt;interfaz de cámara&lt;/strong&gt; (LCD_CAM) capaz de mover vídeo.&lt;/p&gt;
&lt;h2 id=&quot;placas-y-modulos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#placas-y-modulos&quot; aria-label=&quot;Anchor link for: placas-y-modulos&quot;&gt;Placas y módulos&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S3-WROOM-1 / 1U&lt;/strong&gt; — el módulo estándar (la «U», con antena externa).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S3-MINI-1&lt;/strong&gt; — pequeño, para PCB propia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S3-DevKitC-1 / DevKitM-1&lt;/strong&gt; — las placas de desarrollo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S3-EYE&lt;/strong&gt; — placa con cámara y pantalla, para visión.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S3-DevKitC-1 N16R8&lt;/strong&gt; — la versión con más memoria.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-s3.jpg&quot; alt=&quot;Placa ESP32-S3&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-S3: la variante más capaz para IA en el borde y multimedia. Foto: VectorVoyager (CC BY-SA 4.0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;cuando-elegirlo-y-cuando-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegirlo-y-cuando-no&quot; aria-label=&quot;Anchor link for: cuando-elegirlo-y-cuando-no&quot;&gt;¿Cuándo elegirlo (y cuándo no)?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí, elige el S3 si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vas a hacer &lt;strong&gt;visión, audio o IA&lt;/strong&gt; en el propio dispositivo.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;cámara&lt;/strong&gt; o mover &lt;strong&gt;pantallas&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Quieres &lt;strong&gt;dos núcleos&lt;/strong&gt; y USB nativo.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;PSRAM&lt;/strong&gt; para buffers grandes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No lo elijas si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solo quieres leer sensores y publicar por Wi-Fi: un &lt;strong&gt;C3&lt;/strong&gt; hace lo mismo por
mucho menos.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;Bluetooth clásico&lt;/strong&gt; (solo tiene BLE): eso es el &lt;strong&gt;clásico&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;DAC&lt;/strong&gt;: el S3 no tiene; usa el clásico o el S2.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;errores-tipicos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos&quot; aria-label=&quot;Anchor link for: errores-tipicos&quot;&gt;Errores típicos&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Comprar un S3 &lt;strong&gt;sin PSRAM&lt;/strong&gt; y luego querer hacer visión o audio.&lt;/li&gt;
&lt;li&gt;Comprar &lt;strong&gt;PSRAM octal&lt;/strong&gt; y descubrir que pierdes GPIO33–37.&lt;/li&gt;
&lt;li&gt;Asumir que tiene &lt;strong&gt;Bluetooth clásico&lt;/strong&gt; (solo tiene BLE).&lt;/li&gt;
&lt;li&gt;Contar con &lt;strong&gt;GPIO26–32&lt;/strong&gt; cuando están ocupados por la memoria.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2 núcleos LX7&lt;/strong&gt;, 512 KB de SRAM, &lt;strong&gt;BLE 5&lt;/strong&gt; y &lt;strong&gt;USB OTG&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Las &lt;strong&gt;instrucciones vectoriales&lt;/strong&gt; lo hacen el mejor ESP32 para IA y multimedia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PSRAM quad u octal&lt;/strong&gt;: la octal es más rápida pero ocupa más pines.&lt;/li&gt;
&lt;li&gt;No tiene &lt;strong&gt;DAC&lt;/strong&gt; ni &lt;strong&gt;Bluetooth clásico&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Es la opción «grande»: si no necesitas cámara/IA, un C3 te sobra.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; el &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;ESP32-C3&lt;/a&gt;, el que recomiendo para
empezar. O vuelve al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>ESP32-S2 a fondo: el ESP32 con USB de verdad (y sin Bluetooth)</title>
        <published>2026-09-19T00:00:00+00:00</published>
        <updated>2026-09-19T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp32-s2-a-fondo/"/>
        <id>https://esp32.tunatek.tech/blog/esp32-s2-a-fondo/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp32-s2-a-fondo/">&lt;p&gt;El ESP32-S2 es el hermano raro de la familia. Llegó en 2019 con una idea muy
clara: &lt;strong&gt;USB nativo&lt;/strong&gt;, muchos pines y Wi-Fi… pero &lt;strong&gt;sin Bluetooth&lt;/strong&gt;. Y esa
decisión lo parte en dos: para unos es perfecto, para otros es un pisapapeles.&lt;/p&gt;
&lt;p&gt;Vamos a ver para qué sirve de verdad.&lt;/p&gt;
&lt;h2 id=&quot;que-es-y-en-que-se-diferencia-del-clasico&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#que-es-y-en-que-se-diferencia-del-clasico&quot; aria-label=&quot;Anchor link for: que-es-y-en-que-se-diferencia-del-clasico&quot;&gt;Qué es (y en qué se diferencia del clásico)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El S2 usa &lt;strong&gt;un solo núcleo Xtensa LX7 a 240 MHz&lt;/strong&gt; (el clásico tiene dos). Parece
una desventaja, pero a cambio llega con &lt;strong&gt;USB OTG&lt;/strong&gt; integrado, que es un
periférico bastante más interesante de lo que parece.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cosa&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Núcleo&lt;/td&gt;&lt;td&gt;1 × Xtensa LX7 @ 240 MHz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SRAM&lt;/td&gt;&lt;td&gt;320 KB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi&lt;/td&gt;&lt;td&gt;802.11 b/g/n (2,4 GHz)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ninguno&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIOs&lt;/td&gt;&lt;td&gt;&lt;strong&gt;43&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ADC&lt;/td&gt;&lt;td&gt;20 canales de 12 bits&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DAC&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2 canales de 8 bits&lt;/strong&gt; (GPIO17 y GPIO18)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Touch&lt;/td&gt;&lt;td&gt;14 canales&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;USB&lt;/td&gt;&lt;td&gt;&lt;strong&gt;OTG nativo&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;lo-bueno-usb-otg&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-bueno-usb-otg&quot; aria-label=&quot;Anchor link for: lo-bueno-usb-otg&quot;&gt;Lo bueno: USB OTG&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No es un «USB para el puerto serie». Es un &lt;strong&gt;controlador USB completo&lt;/strong&gt;, y eso
te deja hacer cosas que con el clásico necesitan un chip extra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HID&lt;/strong&gt;: emular teclado, ratón o mando.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDC&lt;/strong&gt;: un puerto serie propio, con tu nombre y tu VID/PID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MSC&lt;/strong&gt;: que el ordenador vea el ESP32 como una memoria USB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Host&lt;/strong&gt;: leer un pendrive, un teclado USB o un lector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y como es USB nativo, olvídate del CH340 y de sus drivers. Un cable y listo.&lt;/p&gt;
&lt;h2 id=&quot;lo-malo-no-tiene-bluetooth&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lo-malo-no-tiene-bluetooth&quot; aria-label=&quot;Anchor link for: lo-malo-no-tiene-bluetooth&quot;&gt;Lo malo: no tiene Bluetooth&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aquí está el peaje. Si tu proyecto necesita enviar datos a un móvil por BLE, o
hablar con un altavoz por Bluetooth clásico, &lt;strong&gt;el S2 no te sirve&lt;/strong&gt;. Punto. No es
cuestión de firmware: la radio no existe.&lt;/p&gt;
&lt;p&gt;Espressif lo dejó fuera para abaratar y simplificar. Tiene sentido en su
momento… pero hoy significa que, si dudas, casi siempre querrás un &lt;strong&gt;C3&lt;/strong&gt; o un
&lt;strong&gt;S3&lt;/strong&gt; en su lugar.&lt;/p&gt;
&lt;h2 id=&quot;pinout-que-pines-importan&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pinout-que-pines-importan&quot; aria-label=&quot;Anchor link for: pinout-que-pines-importan&quot;&gt;Pinout: qué pines importan&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No hay un pinout oficial en Commons para el S2, así que aquí van los datos que
de verdad vas a consultar (y el resto, en el
&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://docs.espressif.com/&quot;&gt;datasheet de Espressif&lt;/a&gt;):&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pin(es)&lt;/th&gt;&lt;th&gt;Para qué&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO19 / GPIO20&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;USB D− / D+&lt;/strong&gt; (no los toques si usas USB)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO1–10&lt;/td&gt;&lt;td&gt;ADC1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO11–20&lt;/td&gt;&lt;td&gt;ADC2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO17 / GPIO18&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;DAC 1 y DAC 2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO1–14&lt;/td&gt;&lt;td&gt;Touch&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO0, 45, 46&lt;/td&gt;&lt;td&gt;&lt;em&gt;Strapping&lt;/em&gt; (arranque)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIO26–32&lt;/td&gt;&lt;td&gt;Flash interna (no usar)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Dos avisos que se repiten del clásico:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ADC2 no funciona mientras el Wi-Fi está encendido.&lt;/strong&gt; Usa &lt;strong&gt;ADC1&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Los pines de &lt;em&gt;strapping&lt;/em&gt; (sobre todo &lt;strong&gt;GPIO45 y GPIO46&lt;/strong&gt;) mejor déjalos en paz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;placas-y-modulos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#placas-y-modulos&quot; aria-label=&quot;Anchor link for: placas-y-modulos&quot;&gt;Placas y módulos&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lo que vas a encontrar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S2-WROOM / WROOM-1&lt;/strong&gt; — el módulo estándar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S2-MINI-1&lt;/strong&gt; — versión pequeña, ideal para PCB propia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S2-Saola-1&lt;/strong&gt; — la placa de desarrollo tipo DevKitC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S2-Kaluga-1&lt;/strong&gt; — kit con pantalla y cámara.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S2-DevKitM-1&lt;/strong&gt; — la versión reducida.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-s2.svg&quot; alt=&quot;Ilustración del ESP32-S2 y sus características&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-S2: USB OTG nativo, Wi-Fi 4 y sin Bluetooth. Ilustración propia.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;cuando-elegirlo-y-cuando-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegirlo-y-cuando-no&quot; aria-label=&quot;Anchor link for: cuando-elegirlo-y-cuando-no&quot;&gt;¿Cuándo elegirlo (y cuándo no)?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí, elige el S2 si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Necesitas &lt;strong&gt;USB de verdad&lt;/strong&gt;: HID, CDC, almacenamiento, host.&lt;/li&gt;
&lt;li&gt;Quieres &lt;strong&gt;muchos GPIOs&lt;/strong&gt; (43) y no te importa el Bluetooth.&lt;/li&gt;
&lt;li&gt;Vas a usar &lt;strong&gt;DAC&lt;/strong&gt; o &lt;strong&gt;touch&lt;/strong&gt; y quieres USB nativo de propina.&lt;/li&gt;
&lt;li&gt;Trabajas con un teclado o un dispositivo USB que quieres emular.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No lo elijas si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Necesitas &lt;strong&gt;BLE&lt;/strong&gt; (muy común): vete a un &lt;strong&gt;C3&lt;/strong&gt; o &lt;strong&gt;S3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Quieres lo más barato posible: el &lt;strong&gt;C3&lt;/strong&gt; es más moderno y suele costar igual o
menos.&lt;/li&gt;
&lt;li&gt;Necesitas dos núcleos: el S2 tiene uno.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;errores-tipicos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos&quot; aria-label=&quot;Anchor link for: errores-tipicos&quot;&gt;Errores típicos&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Comprarlo &lt;strong&gt;asumiendo que tiene BLE&lt;/strong&gt; porque «todos los ESP32 lo tienen».&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;GPIO19/20&lt;/strong&gt; para otra cosa y luego preguntarse por qué no aparece el
USB.&lt;/li&gt;
&lt;li&gt;Intentar leer un sensor por &lt;strong&gt;ADC2 con Wi-Fi encendido&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Olvidar que los &lt;strong&gt;GPIO45/46&lt;/strong&gt; son de arranque y que ponerlos a &lt;code&gt;LOW&lt;/code&gt; puede
impedir que arranque.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1 núcleo LX7&lt;/strong&gt;, 320 KB de SRAM, &lt;strong&gt;USB OTG&lt;/strong&gt; y &lt;strong&gt;43 GPIOs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sin Bluetooth&lt;/strong&gt;: es su limitación más importante.&lt;/li&gt;
&lt;li&gt;Tiene &lt;strong&gt;DAC&lt;/strong&gt; y &lt;strong&gt;touch&lt;/strong&gt;, como el clásico.&lt;/li&gt;
&lt;li&gt;Es la opción clara cuando el &lt;strong&gt;USB&lt;/strong&gt; es el protagonista del proyecto.&lt;/li&gt;
&lt;li&gt;Si dudas entre S2 y C3, &lt;strong&gt;casi siempre gana el C3&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; el &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;ESP32-S3&lt;/a&gt; — mismo USB, pero con
dos núcleos, Bluetooth y aceleración para IA. O vuelve al
&lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;hub de la serie&lt;/a&gt; para ver el índice completo.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>El ESP32 clásico a fondo: pines, ADC, DAC y cuándo merece la pena</title>
        <published>2026-09-18T00:00:00+00:00</published>
        <updated>2026-09-18T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/esp32-clasico-a-fondo/"/>
        <id>https://esp32.tunatek.tech/blog/esp32-clasico-a-fondo/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/esp32-clasico-a-fondo/">&lt;p&gt;Cuando la gente dice «ESP32», casi siempre se refiere a &lt;strong&gt;este&lt;/strong&gt;: el de 2016,
dos núcleos y 38 pines. Sigue siendo el que más tutoriales tiene, el más barato
con Bluetooth clásico y, aunque ya hay opciones más modernas, &lt;strong&gt;sigue teniendo
mucho sentido&lt;/strong&gt; en 2026.&lt;/p&gt;
&lt;p&gt;Pero tiene una serie de rincones —pines que no se pueden usar, un ADC que no es
tan bonito como promete el marketing— que conviene conocer &lt;strong&gt;antes&lt;/strong&gt; de soldar
nada. He perdido más de una tarde por no saberlos, así que vamos a ahorrártelas.&lt;/p&gt;
&lt;h2 id=&quot;el-chip-no-todos-los-esp32-son-el-mismo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#el-chip-no-todos-los-esp32-son-el-mismo&quot; aria-label=&quot;Anchor link for: el-chip-no-todos-los-esp32-son-el-mismo&quot;&gt;El chip: no todos los «ESP32» son el mismo&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dentro del módulo hay un chip concreto, y no todos son iguales:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Chip&lt;/th&gt;&lt;th&gt;Qué tiene de especial&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ESP32-D0WDQ6&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;El original, 2 núcleos, QFN 6×6 mm&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ESP32-D0WD&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Igual pero en encapsulado 5×5 mm&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP32-D0WD-V3&lt;/td&gt;&lt;td&gt;La revisión actual, la que montan los módulos nuevos&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP32-D0WDR2&lt;/td&gt;&lt;td&gt;Con &lt;strong&gt;2 MB de PSRAM dentro&lt;/strong&gt; del propio chip&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP32-S0WD&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Un solo núcleo&lt;/strong&gt; (rara de ver)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Para lo que nos importa aquí: &lt;strong&gt;2 núcleos Xtensa LX6 a 240 MHz, 520 KB de SRAM y
448 KB de ROM&lt;/strong&gt;. Ese es el «ESP32 clásico».&lt;/p&gt;
&lt;h2 id=&quot;los-modulos-wroom-wrover-y-compania&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-modulos-wroom-wrover-y-compania&quot; aria-label=&quot;Anchor link for: los-modulos-wroom-wrover-y-compania&quot;&gt;Los módulos: WROOM, WROVER y compañía&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El chip desnudo no se suelda a mano. Va dentro de un &lt;strong&gt;módulo&lt;/strong&gt; con la flash, el
cristal y la antena. Los que vas a encontrar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP32-WROOM-32E&lt;/strong&gt; — el estándar. 4 MB de flash, antena en la propia PCB.
Deja libres &lt;strong&gt;GPIO16 y GPIO17&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-WROVER-E&lt;/strong&gt; — igual, pero con &lt;strong&gt;8 MB de PSRAM&lt;/strong&gt; extra. Ojo: la PSRAM se
come &lt;strong&gt;GPIO16 y GPIO17&lt;/strong&gt;, así que si usas esos pines, no puedes usar WROVER.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-WROOM-32UE / WROVER-IE&lt;/strong&gt; — sin antena de PCB, con conector &lt;strong&gt;U.FL&lt;/strong&gt;
para poner una antena externa. La solución cuando el ESP32 va dentro de una
caja metálica.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/esp32-clasico/modulo.jpg&quot; alt=&quot;Módulo ESP32-WROOM-32 con su apantallamiento metálico&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;El ESP32-WROOM-32: chip, flash y antena dentro de una sola pieza. Foto: Ubahnverleih (CC0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dato de 2026:&lt;/strong&gt; para diseños nuevos, Espressif recomienda la &lt;strong&gt;serie E&lt;/strong&gt;
(ESP32-WROOM-32E / WROVER-E). Los módulos antiguos sin la «E» están marcados
como &lt;em&gt;not recommended for new designs&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Y en la cara de atrás se ve dónde está cada cosa:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/esp32-clasico/modulo-trasera.jpg&quot; alt=&quot;Cara trasera del módulo ESP32-WROOM-32&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Por detrás: el chip ESP32 a la izquierda y la memoria flash a la derecha. Foto: Ubahnverleih (CC0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;la-placa-que-vas-a-comprar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-placa-que-vas-a-comprar&quot; aria-label=&quot;Anchor link for: la-placa-que-vas-a-comprar&quot;&gt;La placa que vas a comprar&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El módulo se monta en una &lt;strong&gt;placa de desarrollo&lt;/strong&gt; (devkit) que le añade USB,
regulador y dos botones: &lt;code&gt;EN&lt;/code&gt; (reset) y &lt;code&gt;BOOT&lt;/code&gt; (para flashear). La de siempre es
la &lt;strong&gt;ESP32-DevKitC&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/esp32-clasico/devkitc.jpg&quot; alt=&quot;Placa ESP32-DevKitC&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-DevKitC: el módulo, el puerto micro-USB, el regulador y los dos botones. Foto: Ubahnverleih (CC0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Un aviso que vale dinero: estas placas &lt;strong&gt;no llevan USB nativo&lt;/strong&gt;. El puerto es un
chip puente (&lt;strong&gt;CP2102&lt;/strong&gt; o &lt;strong&gt;CH340&lt;/strong&gt;) que habla con el ESP32 por UART. Si tienes
problemas para flashear, casi siempre es el driver de ese chip, no el ESP32.&lt;/p&gt;
&lt;h2 id=&quot;especificaciones-sin-adornos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#especificaciones-sin-adornos&quot; aria-label=&quot;Anchor link for: especificaciones-sin-adornos&quot;&gt;Especificaciones, sin adornos&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cosa&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Núcleos&lt;/td&gt;&lt;td&gt;2 × Xtensa LX6 @ hasta 240 MHz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SRAM&lt;/td&gt;&lt;td&gt;520 KB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi&lt;/td&gt;&lt;td&gt;802.11 b/g/n (2,4 GHz)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4.2 clásico (BR/EDR) + BLE&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPIOs&lt;/td&gt;&lt;td&gt;34 en total, ~25 usables&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ADC&lt;/td&gt;&lt;td&gt;18 canales de 12 bits (ADC1 + ADC2)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DAC&lt;/td&gt;&lt;td&gt;2 canales de 8 bits&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Touch&lt;/td&gt;&lt;td&gt;10 pines capacitivos&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Periféricos&lt;/td&gt;&lt;td&gt;3×UART, 2×I2C, SPI, 2×I2S, CAN (TWAI), SD/MMC, PWM, RMT&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Lo de &lt;strong&gt;Bluetooth clásico&lt;/strong&gt; es exclusivo del clásico: ni el S2, ni el C3, ni el
S3 lo tienen. Si tu proyecto habla con un altavoz o un mando antiguo por
Bluetooth «de toda la vida», este es tu chip.&lt;/p&gt;
&lt;h2 id=&quot;el-pinout-de-38-pines&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#el-pinout-de-38-pines&quot; aria-label=&quot;Anchor link for: el-pinout-de-38-pines&quot;&gt;El pinout de 38 pines&lt;/a&gt;&lt;/h2&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/pinout-esp32-devkitc.png&quot; alt=&quot;Pinout completo del ESP32 DevKitC de 38 pines&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Pinout del ESP32 (DevKitC, 38 pines). Fuente: Wikimedia Commons, CC BY-SA 4.0.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Si vienes de Arduino, aquí hay un cambio de mentalidad: &lt;strong&gt;no todos los pines
sirven para todo&lt;/strong&gt;. Hay pines de solo entrada, pines que definen cómo arranca el
chip y pines que están literalmente ocupados por dentro. Vamos por partes.&lt;/p&gt;
&lt;h2 id=&quot;los-pines-que-si-molan&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-pines-que-si-molan&quot; aria-label=&quot;Anchor link for: los-pines-que-si-molan&quot;&gt;Los pines que sí molan&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;el-dac-gpio25-y-gpio26&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#el-dac-gpio25-y-gpio26&quot; aria-label=&quot;Anchor link for: el-dac-gpio25-y-gpio26&quot;&gt;El DAC (GPIO25 y GPIO26)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;El clásico lleva &lt;strong&gt;dos salidas analógicas de verdad&lt;/strong&gt; (8 bits). El C3, por
ejemplo, no tiene ninguna. Puedes sacar una tensión real, generar una onda o
hacer un sintetizador mediocre pero divertido.&lt;/p&gt;
&lt;h3 id=&quot;touch-10-pines-que-detectan-tu-dedo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#touch-10-pines-que-detectan-tu-dedo&quot; aria-label=&quot;Anchor link for: touch-10-pines-que-detectan-tu-dedo&quot;&gt;Touch: 10 pines que detectan tu dedo&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sin sensor extra, el chip mide la capacidad de &lt;strong&gt;GPIO0, 2, 4, 12, 13, 14, 15,
27, 32 y 33&lt;/strong&gt;. Perfecto para botones sin partes móviles. (Este periférico
desapareció en el S2 y el S3, así que si lo necesitas, tienes que volver al
clásico.)&lt;/p&gt;
&lt;h3 id=&quot;adc1-el-que-funciona-con-wi-fi&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#adc1-el-que-funciona-con-wi-fi&quot; aria-label=&quot;Anchor link for: adc1-el-que-funciona-con-wi-fi&quot;&gt;ADC1: el que funciona con Wi-Fi&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;GPIO32 a GPIO39&lt;/strong&gt; son el ADC1. Son los únicos que puedes usar mientras el
Wi-Fi está encendido. Grábate esto, porque es la causa número uno de «mi sensor
da valores aleatorios».&lt;/p&gt;
&lt;h3 id=&quot;y-algunos-extras-poco-conocidos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#y-algunos-extras-poco-conocidos&quot; aria-label=&quot;Anchor link for: y-algunos-extras-poco-conocidos&quot;&gt;Y algunos extras poco conocidos&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sensor Hall interno&lt;/strong&gt;, sin usar ningún pin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensor de temperatura interno&lt;/strong&gt; (poco preciso, pero existe).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CAN (TWAI)&lt;/strong&gt; por hardware, sin módulo externo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;los-pines-que-te-van-a-arruinar-el-dia&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-pines-que-te-van-a-arruinar-el-dia&quot; aria-label=&quot;Anchor link for: los-pines-que-te-van-a-arruinar-el-dia&quot;&gt;Los pines que te van a arruinar el día&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;gpio6-a-gpio11-la-flash&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#gpio6-a-gpio11-la-flash&quot; aria-label=&quot;Anchor link for: gpio6-a-gpio11-la-flash&quot;&gt;GPIO6 a GPIO11: la flash&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Están conectados a la memoria flash. &lt;strong&gt;No los uses, nunca.&lt;/strong&gt; Si los tocas, el
ESP32 deja de arrancar y parece muerto. No está muerto: vuelve a flashear y
respira.&lt;/p&gt;
&lt;h3 id=&quot;los-pines-de-arranque-strapping&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-pines-de-arranque-strapping&quot; aria-label=&quot;Anchor link for: los-pines-de-arranque-strapping&quot;&gt;Los pines de arranque (strapping)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Al encenderse, el chip mira estos pines para decidir cómo arrancar:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pin&lt;/th&gt;&lt;th&gt;Qué hace si está mal&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO0&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;A &lt;code&gt;LOW&lt;/code&gt; entra en modo flash; como salida puede impedir el arranque&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO2&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Debe estar &lt;code&gt;LOW&lt;/code&gt; o flotante al arrancar&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO12&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Si está &lt;code&gt;HIGH&lt;/code&gt; al arrancar, adiós (tiene que ver con la tensión de flash)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO15&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Debe estar &lt;code&gt;HIGH&lt;/code&gt;; si no, se silencia el log de arranque&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Regla práctica: &lt;strong&gt;no pongas nada crítico en esos pines&lt;/strong&gt; y, si lo haces, revisa
el estado al arrancar.&lt;/p&gt;
&lt;h3 id=&quot;gpio34-a-gpio39-solo-entrada&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#gpio34-a-gpio39-solo-entrada&quot; aria-label=&quot;Anchor link for: gpio34-a-gpio39-solo-entrada&quot;&gt;GPIO34 a GPIO39: solo entrada&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No tienen &lt;em&gt;pull-up&lt;/em&gt; ni &lt;em&gt;pull-down&lt;/em&gt; internos y &lt;strong&gt;no se pueden usar como salida&lt;/strong&gt;.
Son perfectos para un sensor que solo hay que leer, pero si intentas encender un
LED con ellos, no funciona y te pasarás un rato pensando que el LED está roto.&lt;/p&gt;
&lt;h2 id=&quot;el-adc-miente-y-como-domarlo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#el-adc-miente-y-como-domarlo&quot; aria-label=&quot;Anchor link for: el-adc-miente-y-como-domarlo&quot;&gt;El ADC miente (y cómo domarlo)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Este es el detalle que más frustra a la gente. El ADC del ESP32 tiene &lt;strong&gt;12 bits&lt;/strong&gt;,
pero:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No es lineal.&lt;/strong&gt; Cerca de 0 V y cerca de los 3,3 V se desvía bastante.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tiene offset.&lt;/strong&gt; Con la atenuación de 11 dB, arriba del rango se satura antes
de lo que dice el datasheet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Necesita calibración.&lt;/strong&gt; ESP-IDF incluye una API de calibración por
&lt;em&gt;eFuse&lt;/em&gt;. Úsala.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADC2 no funciona con Wi-Fi activo.&lt;/strong&gt; Repetimos: usa &lt;strong&gt;ADC1&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si necesitas medidas decentes y estables, un &lt;strong&gt;ADS1115&lt;/strong&gt; externo por I2C te
ahorrará muchos quebraderos de cabeza.&lt;/p&gt;
&lt;h2 id=&quot;psram-cuando-la-necesitas&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#psram-cuando-la-necesitas&quot; aria-label=&quot;Anchor link for: psram-cuando-la-necesitas&quot;&gt;PSRAM: cuándo la necesitas&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La PSRAM es memoria extra (típicamente 8 MB en el WROVER). La necesitas si vas a
guardar &lt;em&gt;buffers&lt;/em&gt; grandes: imágenes, audio, JSONs enormes o buffers de red.&lt;/p&gt;
&lt;p&gt;Si tu proyecto son sensores y un par de LEDs, &lt;strong&gt;no la necesitas&lt;/strong&gt; y el WROOM es
más barato. Y recuerda el peaje: la PSRAM ocupa &lt;strong&gt;GPIO16 y GPIO17&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;cuando-elegir-el-clasico-y-cuando-no&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cuando-elegir-el-clasico-y-cuando-no&quot; aria-label=&quot;Anchor link for: cuando-elegir-el-clasico-y-cuando-no&quot;&gt;¿Cuándo elegir el clásico (y cuándo no)?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sí, elige el clásico si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Necesitas &lt;strong&gt;Bluetooth clásico&lt;/strong&gt; (no solo BLE).&lt;/li&gt;
&lt;li&gt;Quieres &lt;strong&gt;DAC&lt;/strong&gt;, &lt;strong&gt;touch&lt;/strong&gt; o &lt;strong&gt;CAN&lt;/strong&gt; sin añadir nada.&lt;/li&gt;
&lt;li&gt;Necesitas muchos GPIOs y que GPIO16/17 estén libres.&lt;/li&gt;
&lt;li&gt;Sigues un tutorial que asume el clásico y no quieres pelearte con pines
distintos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mejor otra cosa si…&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quieres lo más barato y moderno: un &lt;strong&gt;C3&lt;/strong&gt; hace casi lo mismo por menos.&lt;/li&gt;
&lt;li&gt;Necesitas &lt;strong&gt;USB nativo&lt;/strong&gt; (HID, JTAG): &lt;strong&gt;S2&lt;/strong&gt;, &lt;strong&gt;S3&lt;/strong&gt;, &lt;strong&gt;C3&lt;/strong&gt; o &lt;strong&gt;C6&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Necesitas cámara, audio o IA: &lt;strong&gt;ESP32-S3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Quieres Matter/Thread/Zigbee: &lt;strong&gt;C6&lt;/strong&gt; o &lt;strong&gt;H2&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;herramientas-actuales-2026&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#herramientas-actuales-2026&quot; aria-label=&quot;Anchor link for: herramientas-actuales-2026&quot;&gt;Herramientas actuales (2026)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si vas a programarlo, estas son las versiones vivas a día de hoy:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Herramienta&lt;/th&gt;&lt;th&gt;Versión actual&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ESP-IDF&lt;/td&gt;&lt;td&gt;&lt;strong&gt;6.1&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Arduino core&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3.3.11&lt;/strong&gt; (sobre ESP-IDF 5.5.5)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PlatformIO (&lt;code&gt;platform-espressif32&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;&lt;strong&gt;7.1.3&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MicroPython&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.29&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;esp-hal&lt;/code&gt; (Rust)&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.2.0&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;errores-tipicos-con-el-clasico&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-tipicos-con-el-clasico&quot; aria-label=&quot;Anchor link for: errores-tipicos-con-el-clasico&quot;&gt;Errores típicos con el clásico&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Intentar usar &lt;strong&gt;GPIO6–11&lt;/strong&gt; «porque están libres en el dibujo».&lt;/li&gt;
&lt;li&gt;Poner un &lt;strong&gt;LED en GPIO34–39&lt;/strong&gt; y no entender por qué no enciende.&lt;/li&gt;
&lt;li&gt;Leer un potenciómetro por &lt;strong&gt;ADC2&lt;/strong&gt; y flipar con los valores al encender el
Wi-Fi.&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;GPIO12&lt;/strong&gt; como salida y que la placa arranque cuando le da la gana.&lt;/li&gt;
&lt;li&gt;Comprar un &lt;strong&gt;WROVER&lt;/strong&gt; para usar GPIO16/17 y descubrir que están ocupados.&lt;/li&gt;
&lt;li&gt;Culpar al código cuando el problema es el &lt;strong&gt;driver CH340&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;El ESP32 clásico son &lt;strong&gt;2 núcleos LX6, 520 KB de SRAM&lt;/strong&gt;, Wi-Fi 4 y &lt;strong&gt;Bluetooth
clásico + BLE&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Los módulos que verás: &lt;strong&gt;WROOM-32E&lt;/strong&gt; (sin PSRAM) y &lt;strong&gt;WROVER-E&lt;/strong&gt; (con PSRAM,
pero se come GPIO16/17).&lt;/li&gt;
&lt;li&gt;Tiene cosas únicas: &lt;strong&gt;DAC&lt;/strong&gt;, &lt;strong&gt;touch&lt;/strong&gt;, &lt;strong&gt;CAN&lt;/strong&gt; y &lt;strong&gt;Bluetooth clásico&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cuidado con &lt;strong&gt;GPIO6–11&lt;/strong&gt;, los pines de &lt;strong&gt;strapping&lt;/strong&gt; (0, 2, 12, 15) y los
&lt;strong&gt;GPIO34–39&lt;/strong&gt; (solo entrada).&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;ADC2 no funciona con Wi-Fi&lt;/strong&gt;; usa &lt;strong&gt;ADC1&lt;/strong&gt; y, si necesitas precisión, un
ADS1115.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; si quieres algo más pequeño, barato y con USB nativo, en la
Parte 3 le toca el turno al &lt;a href=&quot;https://esp32.tunatek.tech/introduccion-esp32/&quot;&gt;ESP32-S2&lt;/a&gt;. Y si todavía no
tienes placa, empieza por la
&lt;a href=&quot;https://esp32.tunatek.tech/blog/que-es-el-esp32-y-su-familia/&quot;&gt;Parte 1: qué es el ESP32 y su familia&lt;/a&gt;.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Créditos de las imágenes&lt;/summary&gt;
&lt;p&gt;Fotografías de &lt;strong&gt;Wikimedia Commons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Módulo ESP32-WROOM-32 (frontal y trasera) y ESP32-DevKitC — Ubahnverleih (CC0)&lt;/li&gt;
&lt;li&gt;Pinout del ESP32 DevKitC — Vishnu Maiea (CC BY-SA 4.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>¿Qué es el ESP32? La familia completa, pinouts y dónde comprarla</title>
        <published>2026-09-17T00:00:00+00:00</published>
        <updated>2026-09-17T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/blog/que-es-el-esp32-y-su-familia/"/>
        <id>https://esp32.tunatek.tech/blog/que-es-el-esp32-y-su-familia/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/blog/que-es-el-esp32-y-su-familia/">&lt;p&gt;El &lt;strong&gt;ESP32&lt;/strong&gt; es, probablemente, el microcontrolador con Wi-Fi y Bluetooth más
popular del mundo del &lt;em&gt;maker&lt;/em&gt;. Cuesta menos que un café, tiene más potencia que
un Arduino UNO por un factor de 20 y existe en una docena de sabores distintos:
ESP32, S2, S3, C3, C6, H2, P4… Elegir mal la variante es el error número uno de
quien empieza.&lt;/p&gt;
&lt;p&gt;Esta guía es &lt;strong&gt;la que me habría gustado leer al principio&lt;/strong&gt;: qué es exactamente,
en qué se diferencia cada miembro de la familia, cómo leer un &lt;em&gt;pinout&lt;/em&gt; sin
equivocarte, cuál comprar según tu proyecto y &lt;strong&gt;dónde conseguirla&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;el-esp32-en-30-segundos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#el-esp32-en-30-segundos&quot; aria-label=&quot;Anchor link for: el-esp32-en-30-segundos&quot;&gt;El ESP32 en 30 segundos&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un ESP32 es un chip (SoC) que incluye:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un procesador de &lt;strong&gt;32 bits&lt;/strong&gt; (1 o 2 núcleos, Xtensa o RISC-V).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wi-Fi&lt;/strong&gt; y, según la variante, &lt;strong&gt;Bluetooth clásico, BLE y/o Zigbee/Thread&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Memoria &lt;strong&gt;SRAM&lt;/strong&gt; y, en algunos modelos, &lt;strong&gt;PSRAM&lt;/strong&gt; externa.&lt;/li&gt;
&lt;li&gt;Un montón de &lt;strong&gt;periféricos&lt;/strong&gt;: GPIO, ADC, DAC, PWM, I2C, SPI, UART, I2S, CAN…&lt;/li&gt;
&lt;li&gt;Todo por &lt;strong&gt;2–5 dólares&lt;/strong&gt; en una placa lista para conectar por USB.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esa combinación —potencia, radio y precio— es lo que lo convirtió en el estándar
de facto del IoT doméstico.&lt;/p&gt;
&lt;h2 id=&quot;soc-modulo-y-placa-no-son-lo-mismo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#soc-modulo-y-placa-no-son-lo-mismo&quot; aria-label=&quot;Anchor link for: soc-modulo-y-placa-no-son-lo-mismo&quot;&gt;SoC, módulo y placa: no son lo mismo&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Antes de seguir, un detalle que confunde a mucha gente:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Término&lt;/th&gt;&lt;th&gt;Qué es&lt;/th&gt;&lt;th&gt;Ejemplo&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SoC&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;El chip desnudo&lt;/td&gt;&lt;td&gt;&lt;code&gt;ESP32-D0WDQ6&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Módulo&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;El SoC + flash + antena + apantallamiento&lt;/td&gt;&lt;td&gt;&lt;code&gt;ESP32-WROOM-32&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Placa / devkit&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;El módulo + USB + regulador + botones&lt;/td&gt;&lt;td&gt;&lt;code&gt;ESP32-DevKitC-32E&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-wroom.jpg&quot; alt=&quot;Módulo ESP32-WROOM-32 visto de cerca, con su apantallamiento metálico&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Un módulo &lt;strong&gt;ESP32-WROOM-32&lt;/strong&gt;: el SoC, la memoria flash y la antena en una pieza. Foto: Ubahnverleih (CC0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Cuando compras en AliExpress o Mercado Libre casi siempre compras un &lt;strong&gt;devkit&lt;/strong&gt;
(la placa completa). Cuando diseñas tu propia PCB, compras el &lt;strong&gt;módulo&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;la-familia-esp32&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-familia-esp32&quot; aria-label=&quot;Anchor link for: la-familia-esp32&quot;&gt;La familia ESP32&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Estos son todos los miembros relevantes, en orden cronológico:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/familia-esp32.svg&quot; alt=&quot;Línea de tiempo de la familia ESP: ESP8266, ESP32, S2, C3, S3, C6, H2 y P4&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;La familia ESP, del ESP8266 (2014) al ESP32-P4 (2024).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Y aquí la tabla que de verdad importa a la hora de comprar:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Variante&lt;/th&gt;&lt;th&gt;Año&lt;/th&gt;&lt;th&gt;Núcleo&lt;/th&gt;&lt;th&gt;Radio&lt;/th&gt;&lt;th&gt;GPIOs&lt;/th&gt;&lt;th&gt;USB nativo&lt;/th&gt;&lt;th&gt;Ideal para&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ESP8266&lt;/td&gt;&lt;td&gt;2014&lt;/td&gt;&lt;td&gt;Xtensa L106 ×1 @ 160 MHz&lt;/td&gt;&lt;td&gt;Wi-Fi 4&lt;/td&gt;&lt;td&gt;~11 usables&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;Proyectos Wi-Fi al mínimo coste&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ESP32&lt;/strong&gt; (clásico)&lt;/td&gt;&lt;td&gt;2016&lt;/td&gt;&lt;td&gt;Xtensa LX6 ×2 @ 240 MHz&lt;/td&gt;&lt;td&gt;Wi-Fi 4 + BT 4.2&lt;/td&gt;&lt;td&gt;~34 (25 usables)&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;Uso general, más barato&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP32-S2&lt;/td&gt;&lt;td&gt;2019&lt;/td&gt;&lt;td&gt;Xtensa LX7 ×1 @ 240 MHz&lt;/td&gt;&lt;td&gt;Wi-Fi 4&lt;/td&gt;&lt;td&gt;~43&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;USB, HID, muchos pines&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP32-C3&lt;/td&gt;&lt;td&gt;2020&lt;/td&gt;&lt;td&gt;RISC-V ×1 @ 160 MHz&lt;/td&gt;&lt;td&gt;Wi-Fi 4 + BLE 5&lt;/td&gt;&lt;td&gt;~22&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;Reemplazo moderno y barato&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ESP32-S3&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2020&lt;/td&gt;&lt;td&gt;Xtensa LX7 ×2 @ 240 MHz&lt;/td&gt;&lt;td&gt;Wi-Fi 4 + BLE 5&lt;/td&gt;&lt;td&gt;~45&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;IA, cámara, audio, USB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP32-C6&lt;/td&gt;&lt;td&gt;2022&lt;/td&gt;&lt;td&gt;RISC-V ×1 @ 160 MHz (+ núcleo LP)&lt;/td&gt;&lt;td&gt;Wi-Fi 6 + BLE 5 + 802.15.4&lt;/td&gt;&lt;td&gt;~30&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;Matter, Thread, Zigbee&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP32-H2&lt;/td&gt;&lt;td&gt;2023&lt;/td&gt;&lt;td&gt;RISC-V ×1 @ 96 MHz&lt;/td&gt;&lt;td&gt;BLE 5 + 802.15.4&lt;/td&gt;&lt;td&gt;~26&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;Matter/Zigbee sin Wi-Fi&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESP32-P4&lt;/td&gt;&lt;td&gt;2024&lt;/td&gt;&lt;td&gt;RISC-V ×2 @ 400 MHz&lt;/td&gt;&lt;td&gt;&lt;em&gt;sin radio&lt;/em&gt;&lt;/td&gt;&lt;td&gt;muchos&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;HMI, pantallas, alto rendimiento&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Regla rápida:&lt;/strong&gt; ¿no sabes cuál? Compra un &lt;strong&gt;ESP32-C3&lt;/strong&gt; si quieres algo barato
y moderno, o un &lt;strong&gt;ESP32-S3&lt;/strong&gt; si necesitas potencia, cámara o USB.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;variante-por-variante&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#variante-por-variante&quot; aria-label=&quot;Anchor link for: variante-por-variante&quot;&gt;Variante por variante&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;esp8266-el-abuelo-que-aun-sirve&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp8266-el-abuelo-que-aun-sirve&quot; aria-label=&quot;Anchor link for: esp8266-el-abuelo-que-aun-sirve&quot;&gt;ESP8266 — el abuelo que aún sirve&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No es un ESP32, pero es su antecesor y sigue vendiéndose por menos de 2 $. Tiene
&lt;strong&gt;un núcleo&lt;/strong&gt;, sin Bluetooth y con pocos GPIO, pero suficiente para un sensor de
temperatura que publica por Wi-Fi.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp8266.jpg&quot; alt=&quot;Módulo ESP8266&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP8266: el chip que puso el Wi-Fi barato en manos de los makers. Foto: Suyash Dwivedi (CC BY-SA 4.0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Míralo solo si&lt;/strong&gt; el precio es lo único que importa. Por un poco más tienes un C3,
que es mejor en todo.&lt;/p&gt;
&lt;h3 id=&quot;esp32-clasico-el-todoterreno&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-clasico-el-todoterreno&quot; aria-label=&quot;Anchor link for: esp32-clasico-el-todoterreno&quot;&gt;ESP32 clásico — el todoterreno&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;El de 2016. &lt;strong&gt;Dos núcleos&lt;/strong&gt; a 240 MHz, más GPIOs que casi cualquiera y la única
variante con &lt;strong&gt;Bluetooth clásico&lt;/strong&gt; (además de BLE). Es el que encontrarás en la
mayoría de tutoriales antiguos y sigue siendo una elección perfecta para empezar.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-devkitc.jpg&quot; alt=&quot;Placa de desarrollo ESP32 DevKitC&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Un ESP32-DevKitC: módulo WROOM, USB, regulador y dos botones. Foto: Edwiyanto (CC BY-SA 4.0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Contras:&lt;/strong&gt; no tiene USB nativo (lleva un chip CH340 o CP2102 para el puerto
serie) y consume más en reposo que las variantes modernas.&lt;/p&gt;
&lt;h3 id=&quot;esp32-s2-el-que-no-tiene-bluetooth&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-s2-el-que-no-tiene-bluetooth&quot; aria-label=&quot;Anchor link for: esp32-s2-el-que-no-tiene-bluetooth&quot;&gt;ESP32-S2 — el que no tiene Bluetooth&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;El S2 fue el primer ESP32 con &lt;strong&gt;USB OTG nativo&lt;/strong&gt; y muchos GPIOs (~43). Su pecado:
&lt;strong&gt;no tiene Bluetooth&lt;/strong&gt;. Si no lo necesitas, es una gran opción para HID (teclados,
ratones) o proyectos con muchísimos pines.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-s2.svg&quot; alt=&quot;Ilustración del ESP32-S2 y sus características&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-S2: USB OTG nativo, Wi-Fi 4 y sin Bluetooth. Ilustración.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;esp32-s3-el-potente&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-s3-el-potente&quot; aria-label=&quot;Anchor link for: esp32-s3-el-potente&quot;&gt;ESP32-S3 — el potente&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;El favorito para proyectos ambiciosos: &lt;strong&gt;dos núcleos LX7&lt;/strong&gt;, BLE 5, USB nativo y,
sobre todo, &lt;strong&gt;instrucciones vectoriales&lt;/strong&gt; que aceleran cargas de IA (detección de
voz, visión). Es el que llevan las placas con cámara y las que mueven pantallas.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-s3.jpg&quot; alt=&quot;Placa ESP32-S3&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-S3: la variante más capaz para IA en el borde y multimedia. Foto: VectorVoyager (CC BY-SA 4.0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Contras:&lt;/strong&gt; más caro que un C3 y, si no vas a usar cámara/IA, es matar moscas a
cañonazos.&lt;/p&gt;
&lt;h3 id=&quot;esp32-c3-el-equilibrado&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-c3-el-equilibrado&quot; aria-label=&quot;Anchor link for: esp32-c3-el-equilibrado&quot;&gt;ESP32-C3 — el equilibrado&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Mi recomendación por defecto en 2026. Es &lt;strong&gt;RISC-V&lt;/strong&gt;, con BLE 5, USB
Serial/JTAG nativo y un precio casi de ESP8266. Para sensores, relés, domótica y
casi cualquier proyecto normal, sobra.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-c3.jpg&quot; alt=&quot;Placa ESP32-C3 estilo NodeMCU&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Un ESP32-C3 tipo NodeMCU: pequeño, barato y con USB-C. Foto: Popolon (CC BY-SA 4.0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Contras:&lt;/strong&gt; menos GPIOs (~22) y sin Bluetooth clásico (solo BLE).&lt;/p&gt;
&lt;h3 id=&quot;esp32-c6-el-de-matter&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-c6-el-de-matter&quot; aria-label=&quot;Anchor link for: esp32-c6-el-de-matter&quot;&gt;ESP32-C6 — el de Matter&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;El primer ESP32 con &lt;strong&gt;Wi-Fi 6&lt;/strong&gt; y, lo importante, con radio &lt;strong&gt;802.15.4&lt;/strong&gt;: eso
significa &lt;strong&gt;Thread, Zigbee y Matter&lt;/strong&gt;. Si quieres montar domótica moderna y
compatible, es el chip.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-c6.jpg&quot; alt=&quot;Placa de desarrollo ESP32-C6&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-C6: Wi-Fi 6 + BLE 5 + 802.15.4 (Thread/Zigbee/Matter). Foto: Popolon (CC BY-SA 4.0).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Contras:&lt;/strong&gt; requiere toolchain reciente (ESP-IDF 5.1+) y algunos módulos aún
tienen poca disponibilidad en tiendas locales.&lt;/p&gt;
&lt;h3 id=&quot;esp32-h2-el-que-no-tiene-wi-fi&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-h2-el-que-no-tiene-wi-fi&quot; aria-label=&quot;Anchor link for: esp32-h2-el-que-no-tiene-wi-fi&quot;&gt;ESP32-H2 — el que no tiene Wi-Fi&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Igual que el C6 pero &lt;strong&gt;sin Wi-Fi&lt;/strong&gt;: solo BLE y 802.15.4. Suena raro, pero para un
nodo Matter alimentado por batería es perfecto (menos radio, menos consumo).&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/esp32-h2.svg&quot; alt=&quot;Ilustración del ESP32-H2 y sus características&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;ESP32-H2: BLE 5 + Zigbee/Thread, sin Wi-Fi. Ilustración.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;esp32-p4-el-nuevo-sin-radio&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-p4-el-nuevo-sin-radio&quot; aria-label=&quot;Anchor link for: esp32-p4-el-nuevo-sin-radio&quot;&gt;ESP32-P4 — el nuevo (sin radio)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;El P4 (2024) es distinto: &lt;strong&gt;sin Wi-Fi ni Bluetooth&lt;/strong&gt;, pero con dos núcleos a
400 MHz y soporte de pantallas/cámaras de gama alta. Se usa como &lt;em&gt;host&lt;/em&gt; de
aplicación, normalmente acompañado de un C6 que le da la conectividad.&lt;/p&gt;
&lt;h2 id=&quot;como-se-que-placa-tengo-en-la-mano&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#como-se-que-placa-tengo-en-la-mano&quot; aria-label=&quot;Anchor link for: como-se-que-placa-tengo-en-la-mano&quot;&gt;¿Cómo sé qué placa tengo en la mano?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Busca el &lt;strong&gt;nombre impreso en el módulo metálico&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ESP-WROOM-32&lt;/code&gt; o &lt;code&gt;ESP32-WROOM-32&lt;/code&gt; → &lt;strong&gt;ESP32 clásico&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESP32-WROVER&lt;/code&gt; → clásico &lt;strong&gt;con PSRAM&lt;/strong&gt; (más memoria, ideal para cámaras).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESP32-S3-WROOM-1&lt;/code&gt; → &lt;strong&gt;S3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESP32-C3-MINI-1&lt;/code&gt; o &lt;code&gt;ESP32-C3-WROOM-02&lt;/code&gt; → &lt;strong&gt;C3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESP32-C6-WROOM-1&lt;/code&gt; → &lt;strong&gt;C6&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESP32-S2-…&lt;/code&gt; → &lt;strong&gt;S2&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESP32-H2-…&lt;/code&gt; → &lt;strong&gt;H2&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si no ves nada, mira el patrón de pines: los &lt;strong&gt;GPIO34–39 del clásico son solo de
entrada&lt;/strong&gt;, y eso es inconfundible cuando probamos un sensor.&lt;/p&gt;
&lt;h2 id=&quot;pinouts-los-mapas-de-pines&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pinouts-los-mapas-de-pines&quot; aria-label=&quot;Anchor link for: pinouts-los-mapas-de-pines&quot;&gt;Pinouts (los mapas de pines)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un &lt;em&gt;pinout&lt;/em&gt; es el mapa que te dice qué función tiene cada pin. &lt;strong&gt;No todos los
pines son iguales&lt;/strong&gt;: algunos solo entran, otros definen el arranque y otros están
prohibidos.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/pinout-esp32-devkitc.png&quot; alt=&quot;Pinout completo del ESP32-DevKitC&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Pinout del ESP32 (DevKitC). Fuente: Wikimedia Commons, CC BY-SA 4.0.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Avisos que valen oro en el ESP32 clásico:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPIO6–11&lt;/strong&gt;: conectados a la flash. &lt;strong&gt;No los uses nunca.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPIO34–39&lt;/strong&gt;: &lt;strong&gt;solo entrada&lt;/strong&gt;, sin &lt;em&gt;pull-up&lt;/em&gt; interno.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPIO0, 2, 12, 15&lt;/strong&gt;: afectan al modo de arranque. Evítalos como salida.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPIO1 (TX0) y GPIO3 (RX0)&lt;/strong&gt;: el puerto serie. Úsalos con cuidado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADC2&lt;/strong&gt; no funciona mientras el Wi-Fi está activo: usa &lt;strong&gt;ADC1&lt;/strong&gt; (GPIO32–39).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y el del C3, cada vez más común:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/images/posts/que-es-esp32/pinout-esp32-c3.png&quot; alt=&quot;Pinout del ESP32-C3&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Pinout del ESP32-C3. Fuente: Wikimedia Commons, CC BY-SA 4.0.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;Los pinouts oficiales y actualizados están siempre en
&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://docs.espressif.com/&quot;&gt;docs.espressif.com&lt;/a&gt;. Ante la duda, esa es la
fuente de verdad.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;cual-me-compro-segun-tu-proyecto&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#cual-me-compro-segun-tu-proyecto&quot; aria-label=&quot;Anchor link for: cual-me-compro-segun-tu-proyecto&quot;&gt;¿Cuál me compro? (según tu proyecto)&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Quiero…&lt;/th&gt;&lt;th&gt;Compra&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Empezar y aprender&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ESP32-C3&lt;/strong&gt; o &lt;strong&gt;ESP32 clásico&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Domótica con Home Assistant&lt;/td&gt;&lt;td&gt;ESP32-C3 o, si quieres Matter, &lt;strong&gt;C6&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cámara, audio o IA&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ESP32-S3&lt;/strong&gt; (+ PSRAM)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Un nodo Matter/Zigbee a batería&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ESP32-C6&lt;/strong&gt; o &lt;strong&gt;H2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Muchísimos pines o USB HID&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ESP32-S2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Lo más barato posible para un sensor&lt;/td&gt;&lt;td&gt;ESP8266 &lt;em&gt;o&lt;/em&gt; ESP32-C3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pantalla grande / HMI&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ESP32-P4&lt;/strong&gt; + C6&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Para tu &lt;strong&gt;primera placa&lt;/strong&gt;, compra &lt;strong&gt;dos&lt;/strong&gt;: una C3 barata para trastear y una S3
con PSRAM si piensas en cámaras o pantallas. Así no te quedas corto.&lt;/p&gt;
&lt;h2 id=&quot;donde-comprar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#donde-comprar&quot; aria-label=&quot;Anchor link for: donde-comprar&quot;&gt;Dónde comprar&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aquí va la parte que casi ningún tutorial en español explica bien. El precio y el
envío cambian mucho según la tienda y el país, así que toma esto como una guía de
&lt;strong&gt;dónde mirar y con qué cuidado&lt;/strong&gt;, no como un ranking fijo.&lt;/p&gt;
&lt;h3 id=&quot;mx-mexico&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#mx-mexico&quot; aria-label=&quot;Anchor link for: mx-mexico&quot;&gt;🇲🇽 México&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mercado Libre&lt;/strong&gt; — lo más práctico: envío nacional, pago local y precios
competitivos. &lt;strong&gt;Ojo con los vendedores&lt;/strong&gt;: revisa reputación y que las fotos
sean del producto real (no un render genérico).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon México&lt;/strong&gt; — envío rápido (Prime) y devoluciones fáciles; el precio
suele ser algo más alto que en Mercado Libre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UNIT Electronics&lt;/strong&gt; — tienda mexicana especializada en electrónica y
desarrollo. Buena para comprar módulos sueltos, sensores y accesorios en el
mismo pedido, aunque el catálogo de placas varía.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tiendas de robótica/maker locales&lt;/strong&gt; — muchas ciudades tienen su tienda
(CDMX, Guadalajara, Monterrey); vale la pena si necesitas el componente &lt;em&gt;hoy&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;earth-americas-internacional&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#earth-americas-internacional&quot; aria-label=&quot;Anchor link for: earth-americas-internacional&quot;&gt;🌎 Internacional&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AliExpress&lt;/strong&gt; — el más barato con diferencia. Contra: envío lento (2–6
semanas) y calidad irregular. Ideal para pedir &lt;strong&gt;varias placas y sensores&lt;/strong&gt; de
golpe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LCSC&lt;/strong&gt; — componentes y módulos originales a buen precio; útil si haces varias
unidades o diseñas PCB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adafruit / SparkFun&lt;/strong&gt; — placas propias de gran calidad y documentación
excelente. Caro con envío a Latinoamérica, pero es el estándar para
prototipos serios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mouser / Digi-Key / Farnell&lt;/strong&gt; — distribuidores &lt;strong&gt;oficiales&lt;/strong&gt;: te aseguras el
chip original y tienes datasheet garantizado. Envío a México posible, pero con
coste y trámites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Espressif (tienda oficial)&lt;/strong&gt; — módulos originales; útil si fabricas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;como-evitar-clones-malos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#como-evitar-clones-malos&quot; aria-label=&quot;Anchor link for: como-evitar-clones-malos&quot;&gt;Cómo evitar clones malos&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pregunta por el chip USB-serie.&lt;/strong&gt; CH340 funciona, pero algunos drivers son
problemáticos en macOS. CP2102 suele dar menos guerra.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;30 vs 38 pines.&lt;/strong&gt; Muchas placas clásicas baratas traen solo 30 pines: pierdes
GPIOs. Si puedes, elige la de 38.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB-C vs micro-USB.&lt;/strong&gt; Micro-USB en 2026 es un dolor; paga un poco más por C.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PSRAM real.&lt;/strong&gt; Si compras un S3 para cámara, verifica que &lt;strong&gt;anuncia PSRAM&lt;/strong&gt;
(8 MB en las buenas).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Antena.&lt;/strong&gt; Las placas con conector U.FL/IPEX permiten antena externa si vas a
usar el ESP32 dentro de un gabinete metálico.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Botones BOOT y EN.&lt;/strong&gt; Que existan: sin &lt;code&gt;BOOT&lt;/code&gt; a veces no puedes flashear.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;errores-comunes-al-empezar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#errores-comunes-al-empezar&quot; aria-label=&quot;Anchor link for: errores-comunes-al-empezar&quot;&gt;Errores comunes al empezar&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Comprar una placa &lt;strong&gt;sin USB nativo&lt;/strong&gt; pensando que el puerto serie es nativo.&lt;/li&gt;
&lt;li&gt;Elegir el &lt;strong&gt;ESP8266&lt;/strong&gt; “porque es más barato” cuando el C3 cuesta casi lo mismo
y es mejor.&lt;/li&gt;
&lt;li&gt;Comprar una &lt;strong&gt;S3 sin PSRAM&lt;/strong&gt; para un proyecto de cámara.&lt;/li&gt;
&lt;li&gt;Olvidar que en el clásico los &lt;strong&gt;GPIO34–39 son solo entrada&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Intentar usar &lt;strong&gt;ADC2 con Wi-Fi encendido&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;resumen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resumen&quot; aria-label=&quot;Anchor link for: resumen&quot;&gt;Resumen&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;El ESP32 es un SoC con radio, mucha potencia y precio ridículo.&lt;/li&gt;
&lt;li&gt;La familia es amplia: &lt;strong&gt;ESP8266 → ESP32 → S2 → C3 → S3 → C6 → H2 → P4&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Para empezar: &lt;strong&gt;C3&lt;/strong&gt; (barato) o &lt;strong&gt;S3&lt;/strong&gt; (potente). Para domótica moderna: &lt;strong&gt;C6&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;pinout&lt;/strong&gt; no es opcional: hay pines prohibidos y pines de solo entrada.&lt;/li&gt;
&lt;li&gt;Compra donde puedas devolver, y desconfía de las placas “demasiado baratas”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siguiente paso:&lt;/strong&gt; elige tu placa y monta el entorno. Los siguientes capítulos
de la serie &lt;em&gt;Primeros pasos con ESP32&lt;/em&gt; irán apareciendo en el
&lt;a href=&quot;https://esp32.tunatek.tech/blog/&quot;&gt;blog&lt;/a&gt;; mientras, puedes explorar por
&lt;a href=&quot;https://esp32.tunatek.tech/blog/&quot;&gt;categorías&lt;/a&gt; o buscar cualquier tema con &lt;code&gt;Ctrl + K&lt;/code&gt;.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Créditos de las imágenes&lt;/summary&gt;
&lt;p&gt;Todas las fotografías provienen de &lt;strong&gt;Wikimedia Commons&lt;/strong&gt; y se usan bajo su
licencia (CC0 o CC BY-SA 4.0), con atribución al autor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Módulo ESP32-WROOM-32 — Ubahnverleih (CC0)&lt;/li&gt;
&lt;li&gt;ESP32-DevKitC — Edwiyanto (CC BY-SA 4.0)&lt;/li&gt;
&lt;li&gt;ESP32-S3 — VectorVoyager (CC BY-SA 4.0)&lt;/li&gt;
&lt;li&gt;ESP32-C3 — Popolon (CC BY-SA 4.0)&lt;/li&gt;
&lt;li&gt;ESP32-C6 — Popolon (CC BY-SA 4.0)&lt;/li&gt;
&lt;li&gt;ESP32-CAM — Nowforever (CC BY-SA 4.0)&lt;/li&gt;
&lt;li&gt;ESP8266 — Suyash Dwivedi (CC BY-SA 4.0)&lt;/li&gt;
&lt;li&gt;Pinout ESP32 DevKitC — Vishnu Maiea (CC BY-SA 4.0)&lt;/li&gt;
&lt;li&gt;Pinout ESP32-C3 — Srdocdoc (CC BY-SA 4.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ilustraciones de ESP32-S2, ESP32-H2 y de la familia: propias.&lt;/p&gt;
&lt;/details&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Introducción al ESP32</title>
        <published>2026-09-16T00:00:00+00:00</published>
        <updated>2026-09-16T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/introduccion-esp32/"/>
        <id>https://esp32.tunatek.tech/introduccion-esp32/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/introduccion-esp32/">&lt;p&gt;Esta serie es &lt;strong&gt;la puerta de entrada al ESP32&lt;/strong&gt;. Está pensada para que la sigas
en orden, pero cada artículo funciona también por sí solo.&lt;/p&gt;
&lt;p&gt;Empezamos por entender &lt;strong&gt;qué es y qué variante te conviene&lt;/strong&gt;, seguimos con los
&lt;strong&gt;frameworks&lt;/strong&gt; (Arduino, ESP-IDF, MicroPython, Rust) y los &lt;strong&gt;editores&lt;/strong&gt;, y
terminamos escribiendo el &lt;strong&gt;primer programa&lt;/strong&gt; sobre hardware real.&lt;/p&gt;
&lt;p&gt;Todo el código está probado en placas reales, con mediciones y pinouts, y sin
copiar y pegar de otros tutoriales.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Explorar</title>
        <published>2026-01-16T00:00:00+00:00</published>
        <updated>2026-01-16T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/explorar/"/>
        <id>https://esp32.tunatek.tech/explorar/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/explorar/"></content>
        
    </entry>
    <entry xml:lang="es">
        <title>Acerca de</title>
        <published>2026-01-15T00:00:00+00:00</published>
        <updated>2026-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>Alejandro Lara</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://esp32.tunatek.tech/about/"/>
        <id>https://esp32.tunatek.tech/about/</id>
        
        <content type="html" xml:base="https://esp32.tunatek.tech/about/">&lt;h2 id=&quot;hola-wave&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hola-wave&quot; aria-label=&quot;Anchor link for: hola-wave&quot;&gt;Hola 👋&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Este es un blog dedicado al &lt;strong&gt;ESP32&lt;/strong&gt;: el microcontrolador con Wi-Fi y Bluetooth
que se ha convertido en el corazón de incontables proyectos de IoT.&lt;/p&gt;
&lt;p&gt;Aquí encontrarás:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tutoriales paso a paso&lt;/strong&gt; desde el primer &lt;em&gt;blink&lt;/em&gt; hasta IoT en producción.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proyectos&lt;/strong&gt; completos con esquemas, código y decisiones de diseño.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notas de ingeniería&lt;/strong&gt;: energía, antenas, RTOS, seguridad y depuración.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todo el contenido se escribe en Markdown dentro de este mismo repositorio y se
compila con &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.getzola.org/&quot;&gt;Zola&lt;/a&gt;, un generador de sitios estáticos
escrito en Rust. Sin base de datos, sin CMS: solo texto y Git.&lt;/p&gt;
&lt;h2 id=&quot;stack-de-este-sitio&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#stack-de-este-sitio&quot; aria-label=&quot;Anchor link for: stack-de-este-sitio&quot;&gt;Stack de este sitio&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Capa&lt;/th&gt;&lt;th&gt;Tecnología&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Generador&lt;/td&gt;&lt;td&gt;Zola (Rust)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Plantillas&lt;/td&gt;&lt;td&gt;Tera&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Resaltado de código&lt;/td&gt;&lt;td&gt;Giallo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Fórmulas&lt;/td&gt;&lt;td&gt;KaTeX&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Búsqueda&lt;/td&gt;&lt;td&gt;elasticlunr (índice generado por Zola)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Si quieres proponer un tema o corregir algo, abre un &lt;em&gt;issue&lt;/em&gt; o un &lt;em&gt;pull request&lt;/em&gt;.&lt;/p&gt;
</content>
        
    </entry>
</feed>
