<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Steven Carvajal</title>
    <description>The latest articles on DEV Community by Steven Carvajal (@stevencarvajal).</description>
    <link>https://dev.to/stevencarvajal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4153165%2F62c33057-c8e5-430e-b204-4bb36f25a8ed.png</url>
      <title>DEV Community: Steven Carvajal</title>
      <link>https://dev.to/stevencarvajal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stevencarvajal"/>
    <language>en</language>
    <item>
      <title>ESP32-C6 vs ESP32-C3: Wi-Fi 6 y Thread, ¿vale la pena el cambio?</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Sun, 25 Oct 2026 09:36:15 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/esp32-c6-vs-esp32-c3-wi-fi-6-y-thread-vale-la-pena-el-cambio-40gc</link>
      <guid>https://dev.to/stevencarvajal/esp32-c6-vs-esp32-c3-wi-fi-6-y-thread-vale-la-pena-el-cambio-40gc</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/esp32-c6-vs-esp32-c3" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;El &lt;strong&gt;ESP32-C3&lt;/strong&gt; es el chip barato de Espressif para nodos sencillos. El &lt;strong&gt;ESP32-C6&lt;/strong&gt; es su sucesor directo: mismo tipo de CPU (RISC-V), pero con &lt;strong&gt;Wi-Fi 6&lt;/strong&gt; y una segunda radio para &lt;strong&gt;Thread y Zigbee&lt;/strong&gt;. ¿Compensa pagar más por él?&lt;/p&gt;

&lt;p&gt;La respuesta corta: &lt;strong&gt;solo si necesitas Thread, Zigbee o Matter sobre Thread&lt;/strong&gt;. Si tu proyecto es un nodo Wi-Fi o ESP-NOW, el C3 sigue siendo la mejor compra.&lt;/p&gt;

&lt;p&gt;Fichas completas: &lt;a href="https://iot.gripe/microcontroladores/esp32-c6" rel="noopener noreferrer"&gt;ESP32-C6&lt;/a&gt; y &lt;a href="https://iot.gripe/microcontroladores/esp32-c3" rel="noopener noreferrer"&gt;ESP32-C3&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferencias que importan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ESP32-C3&lt;/th&gt;
&lt;th&gt;ESP32-C6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;1 núcleo RISC-V, 160 MHz&lt;/td&gt;
&lt;td&gt;1 núcleo RISC-V, 160 MHz, + 1 de bajo consumo (20 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;td&gt;512 KB (+ 16 KB de bajo consumo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi&lt;/td&gt;
&lt;td&gt;Wi-Fi 4 (802.11 b/g/n)&lt;/td&gt;
&lt;td&gt;Wi-Fi 6 (802.11ax) y Wi-Fi 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bluetooth&lt;/td&gt;
&lt;td&gt;LE 5&lt;/td&gt;
&lt;td&gt;LE 5.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thread y Zigbee&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Sí (radio 802.15.4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Matter&lt;/td&gt;
&lt;td&gt;Sobre Wi-Fi&lt;/td&gt;
&lt;td&gt;Sobre Wi-Fi y sobre Thread&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPIO del chip&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;30 (QFN40)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canales ADC&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UART / I2C&lt;/td&gt;
&lt;td&gt;2 / 1&lt;/td&gt;
&lt;td&gt;2 + 1 de bajo consumo / 1 + 1 de bajo consumo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consumo en sueño profundo&lt;/td&gt;
&lt;td&gt;unos 5 µA&lt;/td&gt;
&lt;td&gt;unos 7 µA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precio de la placa&lt;/td&gt;
&lt;td&gt;3–8 €&lt;/td&gt;
&lt;td&gt;8–14 €&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Valores de las hojas de datos de Espressif; el consumo real depende de la placa (reguladores, LED).&lt;/p&gt;

&lt;h2&gt;
  
  
  Wi-Fi 6: ¿qué cambia en un microcontrolador?
&lt;/h2&gt;

&lt;p&gt;El C6 es Wi-Fi 6 solo como &lt;strong&gt;cliente&lt;/strong&gt;, en banda de 2,4 GHz y con canales de 20 MHz. No obtiene mayor velocidad que el C3 en la práctica. La ventaja útil es &lt;strong&gt;Target Wake Time (TWT)&lt;/strong&gt;: el chip y el router acuerdan cuándo se despierta el dispositivo, lo que reduce el consumo en nodos a batería.&lt;/p&gt;

&lt;p&gt;Para aprovecharlo necesitas un &lt;strong&gt;router Wi-Fi 6&lt;/strong&gt; que soporte TWT. Con un router antiguo, el C6 se comporta como un C3 más caro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thread, Zigbee y Matter: la razón de existir del C6
&lt;/h2&gt;

&lt;p&gt;La segunda radio del C6 (802.15.4) permite tres cosas que el C3 no hace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thread&lt;/strong&gt;: una red en malla de bajo consumo y sin &lt;em&gt;hub&lt;/em&gt; Wi-Fi, la base de los dispositivos Matter a batería.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zigbee&lt;/strong&gt;: sensores, bombillos e interruptores compatibles con las redes Zigbee ya existentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matter sobre Thread&lt;/strong&gt;, además de Matter sobre Wi-Fi (que el C3 también soporta).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si quieres que tu dispositivo aparezca en Apple Home o Google Home como un producto Matter, o unirte a una red Zigbee, el C6 es la opción barata y simple. Para entender cuándo conviene cada protocolo, mira la comparativa de Zigbee, Thread, Matter, Wi-Fi y ESP-NOW.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pines y periféricos
&lt;/h2&gt;

&lt;p&gt;El C6 expone más GPIO (30 en el chip contra 22) y un canal de ADC más (7 contra 6). Las placas pequeñas reducen esa diferencia: una ESP32-C3 Super Mini saca 13 pines; una ESP32-C6 DevKitC-1 saca bastantes más.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbkkgkurw8bh6d99eta5y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbkkgkurw8bh6d99eta5y.png" alt="Diagrama de pines de la placa ESP32-C3 Super Mini" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frrn7agxgm5dq2wuffyig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frrn7agxgm5dq2wuffyig.png" alt="Diagrama de pines de la placa ESP32-C6-DevKitC-1" width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ambos tienen USB Serial/JTAG integrado (no es USB OTG): sirve para cargar programas y para el puerto serie, pero no para actuar como teclado o memoria.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consumo en batería
&lt;/h2&gt;

&lt;p&gt;Los dos están diseñados para bajo consumo. El C6 añade un &lt;strong&gt;núcleo de bajo consumo&lt;/strong&gt; de 20 MHz que puede vigilar sensores mientras el principal duerme, útil para despertar solo cuando algo cambia. En sueño profundo puro, el C3 gasta un poco menos. Si usas deep sleep con batería, la diferencia real la marca el resto de la placa (regulador, LED) más que el chip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Soporte en Arduino
&lt;/h2&gt;

&lt;p&gt;El C3 lleva más tiempo en el mercado y funciona con prácticamente todas las librerías. El C6 tiene soporte desde el núcleo &lt;strong&gt;Arduino-ESP32 3.x&lt;/strong&gt;, pero hay librerías que aún no lo reconocen, y las funciones de Thread y Zigbee se programan con &lt;strong&gt;ESP-IDF&lt;/strong&gt; o con los ejemplos de Zigbee del núcleo, no con la API sencilla de Wi-Fi.&lt;/p&gt;

&lt;p&gt;Antes de comprarlo, comprueba que las librerías de tu proyecto (pantallas, sensores) lo soporten.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuál elegir?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Si tu proyecto es…&lt;/th&gt;
&lt;th&gt;Elige&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nodo Wi-Fi o ESP-NOW sencillo (relé, sensor)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;C3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Muchas unidades donde el precio cuenta&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;C3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dispositivo Matter sobre Thread&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;C6&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sensor Zigbee o pasarela Zigbee/Thread&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;C6&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nodo a batería con router Wi-Fi 6&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;C6&lt;/strong&gt; (por TWT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Necesitas más de 13 pines o más memoria&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;C6&lt;/strong&gt; o un ESP32-S3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Si necesitas doble núcleo, USB OTG o IA en el borde, ninguno de los dos: mira ESP32-S3 vs ESP32-C3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿El ESP32-C6 es más rápido que el C3?
&lt;/h3&gt;

&lt;p&gt;No. Los dos funcionan a 160 MHz con un núcleo RISC-V. El C6 tiene un poco más de memoria y un segundo núcleo, pero de bajo consumo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar Thread con el ESP32-C3?
&lt;/h3&gt;

&lt;p&gt;No. El C3 no tiene la radio 802.15.4. Necesitarías un C6 o un H2.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Y el ESP32-H2?
&lt;/h3&gt;

&lt;p&gt;El H2 también tiene Thread y Zigbee, pero &lt;strong&gt;no tiene Wi-Fi&lt;/strong&gt;. Sirve para dispositivos que hablan solo con una pasarela Thread.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El C6 funciona con ESP-NOW?
&lt;/h3&gt;

&lt;p&gt;Sí, igual que el C3, por Wi-Fi en 2,4 GHz.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ESP32-C6 DevKitC-1&lt;/li&gt;
&lt;li&gt;ESP32-C3 Super Mini&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spanish</category>
      <category>esp32c6</category>
      <category>esp32c3</category>
      <category>wifi6</category>
    </item>
    <item>
      <title>Pinout del ESP32 DevKit explicado: qué pin usar para cada cosa</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Sat, 24 Oct 2026 09:19:45 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/pinout-del-esp32-devkit-explicado-que-pin-usar-para-cada-cosa-51fm</link>
      <guid>https://dev.to/stevencarvajal/pinout-del-esp32-devkit-explicado-que-pin-usar-para-cada-cosa-51fm</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/pinout-esp32-devkit-explicado" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;El primer problema al usar un ESP32 es que sus pines &lt;strong&gt;no son todos iguales&lt;/strong&gt;. Una placa Arduino UNO te deja usar casi cualquier pin; en el ESP32 algunos solo sirven de entrada, otros están conectados a la memoria flash y otros deciden cómo arranca la placa.&lt;/p&gt;

&lt;p&gt;Esta guía explica el pinout de la &lt;strong&gt;ESP32-DevKitC V4&lt;/strong&gt; (la placa de 38 pines con módulo WROOM-32). Muchas placas genéricas de 30 pines usan el mismo chip y casi la misma distribución; comprueba los rótulos de la tuya antes de conectar nada. Para ver las especificaciones del chip, está la &lt;a href="https://iot.gripe/microcontroladores/esp32" rel="noopener noreferrer"&gt;ficha del ESP32&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpwfj5bk0ggaurp07qcb3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpwfj5bk0ggaurp07qcb3.png" alt="Diagrama de pines de la placa ESP32 DevKitC con las funciones de cada GPIO" width="800" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo leer el diagrama
&lt;/h2&gt;

&lt;p&gt;Cada pin tiene un &lt;strong&gt;nombre de la placa&lt;/strong&gt; (&lt;code&gt;IO23&lt;/code&gt;, &lt;code&gt;VP&lt;/code&gt;, &lt;code&gt;D2&lt;/code&gt;…) y un &lt;strong&gt;número de GPIO&lt;/strong&gt;. En el código se usa siempre el número de GPIO: &lt;code&gt;IO23&lt;/code&gt; es &lt;code&gt;23&lt;/code&gt;; &lt;code&gt;VP&lt;/code&gt; es GPIO36 y &lt;code&gt;VN&lt;/code&gt; es GPIO39.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumen por tipo de pin
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grupo&lt;/th&gt;
&lt;th&gt;GPIO&lt;/th&gt;
&lt;th&gt;Qué hacer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Uso general, seguros&lt;/td&gt;
&lt;td&gt;4, 13, 14, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33&lt;/td&gt;
&lt;td&gt;Úsalos como entrada o salida&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solo entrada&lt;/td&gt;
&lt;td&gt;34, 35, 36 (VP), 39 (VN)&lt;/td&gt;
&lt;td&gt;Sensores y botones; nunca salidas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memoria flash&lt;/td&gt;
&lt;td&gt;6, 7, 8, 9, 10, 11&lt;/td&gt;
&lt;td&gt;No los uses jamás&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arranque (&lt;em&gt;strapping&lt;/em&gt;)&lt;/td&gt;
&lt;td&gt;0, 2, 5, 12, 15&lt;/td&gt;
&lt;td&gt;Cuidado con lo que les conectas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consola serie (UART0)&lt;/td&gt;
&lt;td&gt;1 (TX), 3 (RX)&lt;/td&gt;
&lt;td&gt;Déjalos libres para cargar y depurar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pines solo de entrada: 34, 35, 36 y 39
&lt;/h2&gt;

&lt;p&gt;Estos cuatro pines &lt;strong&gt;no pueden ser salidas&lt;/strong&gt; y tampoco tienen resistencias internas de &lt;em&gt;pull-up&lt;/em&gt; o &lt;em&gt;pull-down&lt;/em&gt;. Sirven para leer sensores analógicos o pulsadores, pero con un botón necesitas una resistencia externa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;BOTON&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// solo entrada: necesita resistencia externa&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOTON&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;INPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// INPUT_PULLUP no funciona en este pin&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;digitalRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOTON&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conecta el botón entre el pin y 3,3 V, con una resistencia de unos 10 kΩ del pin a GND.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pines de la memoria flash: 6 a 11
&lt;/h2&gt;

&lt;p&gt;Los pines marcados &lt;code&gt;CLK&lt;/code&gt;, &lt;code&gt;D0&lt;/code&gt;, &lt;code&gt;D1&lt;/code&gt;, &lt;code&gt;D2&lt;/code&gt;, &lt;code&gt;D3&lt;/code&gt; y &lt;code&gt;CMD&lt;/code&gt; (GPIO6 a GPIO11) son los que usa el ESP32 para leer su propio programa de la flash. Si los usas, el chip se reinicia o se cuelga. Las placas de 30 pines a veces los exponen: &lt;strong&gt;ignóralos&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pines de arranque: 0, 2, 5, 12 y 15
&lt;/h2&gt;

&lt;p&gt;Al encender, el chip lee el nivel de estos pines para decidir cómo iniciar:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GPIO&lt;/th&gt;
&lt;th&gt;Qué decide&lt;/th&gt;
&lt;th&gt;Problema típico&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Modo de descarga si está a nivel bajo (botón BOOT)&lt;/td&gt;
&lt;td&gt;Un sensor lo mantiene a nivel bajo y la placa no arranca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Debe estar bajo o al aire para cargar un programa&lt;/td&gt;
&lt;td&gt;El LED integrado suele estar aquí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Temporización de SDIO&lt;/td&gt;
&lt;td&gt;Poco problemático, pero evítalo si puedes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Voltaje de la flash&lt;/td&gt;
&lt;td&gt;Con nivel alto al arrancar, falla el inicio en módulos de 3,3 V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Muestra u oculta el registro de arranque&lt;/td&gt;
&lt;td&gt;Un relé aquí puede cambiar el comportamiento&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pueden usarse como GPIO normales una vez arrancado, pero &lt;strong&gt;no&lt;/strong&gt; conectes cargas, módulos o resistencias fuertes que fuercen un nivel. Si el ESP32 no se deja programar, comprueba primero estos pines.&lt;/p&gt;

&lt;h2&gt;
  
  
  ADC1 frente a ADC2
&lt;/h2&gt;

&lt;p&gt;El ESP32 tiene dos convertidores analógicos (ADC):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ADC1&lt;/strong&gt;: GPIO32, 33, 34, 35, 36 y 39.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ADC2&lt;/strong&gt;: GPIO0, 2, 4, 12, 13, 14, 15, 25, 26 y 27.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;El ADC2 no funciona mientras el Wi-Fi está activo.&lt;/strong&gt; Con Wi-Fi, lee sensores analógicos solo en los pines de ADC1. Es la causa de "mi sensor funcionaba y dejó de funcionar al agregar el Wi-Fi".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;SENSOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// ADC1_6: válido con Wi-Fi&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;lectura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analogRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SENSOR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// 0 a 4095&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lectura&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  DAC y táctiles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DAC&lt;/strong&gt; (salida analógica real de 8 bits): GPIO25 y GPIO26.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensores táctiles&lt;/strong&gt;: GPIO4, 0, 2, 15, 13, 12, 14, 27, 33 y 32 (TOUCH0 a TOUCH9). Detectan un dedo sin pulsador.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pines por defecto de I2C, SPI y UART
&lt;/h2&gt;

&lt;p&gt;El ESP32 puede asignar casi cualquier periférico a cualquier pin libre, así que estos son solo los valores por defecto del núcleo de Arduino:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bus&lt;/th&gt;
&lt;th&gt;Señal&lt;/th&gt;
&lt;th&gt;GPIO&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;I2C&lt;/td&gt;
&lt;td&gt;SDA / SCL&lt;/td&gt;
&lt;td&gt;21 / 22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPI (VSPI)&lt;/td&gt;
&lt;td&gt;SS / MOSI / MISO / SCK&lt;/td&gt;
&lt;td&gt;5 / 23 / 19 / 18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UART0&lt;/td&gt;
&lt;td&gt;TX / RX&lt;/td&gt;
&lt;td&gt;1 / 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UART2&lt;/td&gt;
&lt;td&gt;TX / RX&lt;/td&gt;
&lt;td&gt;17 / 16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Si cambias de placa o de versión del núcleo, escribe los pines en el código: &lt;code&gt;Wire.begin(21, 22);&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Límites eléctricos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Los GPIO son de &lt;strong&gt;3,3 V&lt;/strong&gt;; con 5 V puedes dañarlos. Usa un divisor de tensión o un conversor de nivel.&lt;/li&gt;
&lt;li&gt;No pidas más de unos &lt;strong&gt;20 mA&lt;/strong&gt; por pin. Para relés y motores usa un transistor o un módulo con optoacoplador. Más en cómo alimentar un ESP32.&lt;/li&gt;
&lt;li&gt;El pin &lt;code&gt;5V&lt;/code&gt; (VIN) sale del USB; no es una entrada de señal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lista de pines seguros
&lt;/h2&gt;

&lt;p&gt;Para un proyecto con Wi-Fi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Salidas digitales y relés:&lt;/strong&gt; 13, 14, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entradas digitales con pull-up:&lt;/strong&gt; los mismos pines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entradas analógicas:&lt;/strong&gt; 32, 33, 34, 35, 36 y 39.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pulsadores y sensores:&lt;/strong&gt; 4, 13, 14, 27, 32 y 33.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cuántos pines puedo usar realmente?
&lt;/h3&gt;

&lt;p&gt;Una DevKitC de 38 pines expone unos 25 GPIO útiles. Descontando los de flash y los solo entrada, quedan unos 20 para salidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué mi placa no arranca con algo conectado?
&lt;/h3&gt;

&lt;p&gt;Casi siempre es un pin de arranque (0, 2, 5, 12 o 15) forzado por un módulo. Desconecta el módulo y reinicia.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué diferencia hay con el pinout del ESP32-S3?
&lt;/h3&gt;

&lt;p&gt;El S3 tiene más GPIO, USB nativo y otros pines de arranque. Está explicado en pines del ESP32-S3.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ESP32 DevKitC WROOM-32&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spanish</category>
      <category>esp32</category>
      <category>arduino</category>
      <category>pinout</category>
    </item>
    <item>
      <title>Pines del ESP32-S3: cuáles usar, cuáles evitar y por qué</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:46:57 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/pines-del-esp32-s3-cuales-usar-cuales-evitar-y-por-que-36a2</link>
      <guid>https://dev.to/stevencarvajal/pines-del-esp32-s3-cuales-usar-cuales-evitar-y-por-que-36a2</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/pines-esp32-s3-cuales-usar" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;El ESP32-S3 tiene &lt;strong&gt;45 GPIO&lt;/strong&gt;, pero no todos se pueden usar igual. Algunos deciden cómo arranca la placa, otros son el USB, y los de la memoria PSRAM quedan ocupados según la variante. Elegir mal un pin da síntomas confusos: la placa no arranca, el USB deja de responder o una lectura analógica falla solo cuando enciendes el Wi-Fi.&lt;/p&gt;

&lt;p&gt;Esta guía usa la placa &lt;strong&gt;ESP32-S3-DevKitC-1 v1.1&lt;/strong&gt; como referencia. Si tu placa es de otro fabricante, el chip es el mismo, pero el orden y los rótulos pueden cambiar: compáralo con su esquema. Para ver todas las especificaciones del chip, está la &lt;a href="https://iot.gripe/microcontroladores/esp32-s3" rel="noopener noreferrer"&gt;ficha del ESP32-S3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkan3if0et9l16peikil.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkan3if0et9l16peikil.png" alt="Diagrama de pines de la placa ESP32-S3-DevKitC-1 con las funciones de cada GPIO" width="800" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumen rápido
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grupo&lt;/th&gt;
&lt;th&gt;GPIO&lt;/th&gt;
&lt;th&gt;Qué hacer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Seguros para uso general&lt;/td&gt;
&lt;td&gt;1, 2, 4–18, 21, 38–42, 47, 48&lt;/td&gt;
&lt;td&gt;Úsalos con calma; revisa los matices de abajo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arranque (&lt;em&gt;strapping&lt;/em&gt;)&lt;/td&gt;
&lt;td&gt;0, 3, 45, 46&lt;/td&gt;
&lt;td&gt;Evítalos o cuida su nivel al encender&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB nativo&lt;/td&gt;
&lt;td&gt;19 (D−), 20 (D+)&lt;/td&gt;
&lt;td&gt;No los uses si necesitas el conector USB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consola serie (UART0)&lt;/td&gt;
&lt;td&gt;43 (TX), 44 (RX)&lt;/td&gt;
&lt;td&gt;Déjalos libres para depurar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSRAM octal&lt;/td&gt;
&lt;td&gt;35, 36, 37&lt;/td&gt;
&lt;td&gt;Ocupados en módulos N8R8 y N16R8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memoria flash interna&lt;/td&gt;
&lt;td&gt;26–32&lt;/td&gt;
&lt;td&gt;No existen en la placa: son de la flash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Los pines de arranque: 0, 3, 45 y 46
&lt;/h2&gt;

&lt;p&gt;Al encender, el chip lee el nivel de estos pines y decide cómo iniciar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPIO0&lt;/strong&gt;: a nivel bajo entra en modo de descarga. Es el botón &lt;strong&gt;BOOT&lt;/strong&gt; de la placa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPIO45&lt;/strong&gt;: fija el voltaje de la memoria flash interna.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPIO46&lt;/strong&gt;: controla si se muestra el registro de arranque por el puerto serie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPIO3&lt;/strong&gt;: elige la fuente de JTAG.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes usarlos como GPIO normales &lt;strong&gt;después&lt;/strong&gt; del arranque, pero si algo externo los fuerza a un nivel equivocado en el momento del encendido, la placa no inicia o arranca en un modo raro. Un sensor o un relé con resistencia de &lt;em&gt;pull-up&lt;/em&gt; o &lt;em&gt;pull-down&lt;/em&gt; en estos pines es la causa típica de "funciona al conectar el USB pero no al encenderlo solo".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regla práctica:&lt;/strong&gt; si tienes pines libres de sobra, no uses estos cuatro.&lt;/p&gt;

&lt;h2&gt;
  
  
  USB nativo: GPIO19 y GPIO20
&lt;/h2&gt;

&lt;p&gt;El ESP32-S3 tiene USB integrado en el chip. Los pines &lt;strong&gt;GPIO19 (D−)&lt;/strong&gt; y &lt;strong&gt;GPIO20 (D+)&lt;/strong&gt; van al conector marcado &lt;strong&gt;USB&lt;/strong&gt; de la placa. Si los configuras como entrada o salida, pierdes el USB nativo: no podrás cargar programas por ese conector ni usar el puerto serie USB (CDC) hasta reiniciar con otro código.&lt;/p&gt;

&lt;p&gt;Si ves que el ESP32 no aparece en el puerto USB justo después de usar GPIO19 o GPIO20, esa es la causa más probable.&lt;/p&gt;

&lt;p&gt;La placa tiene dos conectores: el de &lt;strong&gt;UART&lt;/strong&gt; (convertidor USB-serie, pasa por GPIO43 y GPIO44) y el de &lt;strong&gt;USB&lt;/strong&gt; (nativo). Para cargar programas basta cualquiera de los dos.&lt;/p&gt;

&lt;h2&gt;
  
  
  PSRAM octal: GPIO35, 36 y 37
&lt;/h2&gt;

&lt;p&gt;Las variantes con PSRAM octal (&lt;strong&gt;N8R8&lt;/strong&gt;, &lt;strong&gt;N16R8&lt;/strong&gt;: "R8" indica 8 MB de PSRAM) usan GPIO35, GPIO36 y GPIO37 para hablar con la memoria. En esos módulos no están disponibles. En una variante sin PSRAM octal (por ejemplo, N8 o N16 a secas) quedan libres, pero si quieres que tu código funcione en cualquier variante, no los uses.&lt;/p&gt;

&lt;p&gt;Los GPIO26 a GPIO32 conectan la flash interna y no salen a la placa. Los GPIO33 y GPIO34 tampoco salen en la DevKitC-1.&lt;/p&gt;

&lt;h2&gt;
  
  
  ADC1 frente a ADC2
&lt;/h2&gt;

&lt;p&gt;El ESP32-S3 tiene dos convertidores analógicos con 20 canales en total:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ADC1&lt;/strong&gt;: GPIO1 a GPIO10.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ADC2&lt;/strong&gt;: GPIO11 a GPIO20.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El Wi-Fi comparte hardware con &lt;strong&gt;ADC2&lt;/strong&gt;. Con el Wi-Fi activo, una lectura en ADC2 puede fallar o devolver un error por &lt;em&gt;timeout&lt;/em&gt;. Si tu proyecto usa Wi-Fi y lee un sensor analógico, conéctalo a un pin de &lt;strong&gt;ADC1&lt;/strong&gt; (GPIO1 a GPIO10).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;PIN_SENSOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// ADC1_3: seguro con Wi-Fi activo&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;analogReadResolution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// 0 a 4095&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;lectura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analogRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PIN_SENSOR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lectura&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las lecturas del ADC del ESP32 no son perfectamente lineales. Si necesitas precisión, usa &lt;code&gt;analogReadMilliVolts()&lt;/code&gt;, que aplica la calibración de fábrica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entradas táctiles
&lt;/h2&gt;

&lt;p&gt;Los GPIO1 a GPIO14 pueden funcionar como &lt;strong&gt;sensores táctiles capacitivos&lt;/strong&gt; (TOUCH1 a TOUCH14). Sirven para botones sin pulsador: basta un cable o una lámina de metal conectada al pin.&lt;/p&gt;

&lt;h2&gt;
  
  
  JTAG: GPIO39 a GPIO42
&lt;/h2&gt;

&lt;p&gt;Los pines 39 a 42 (MTCK, MTDO, MTDI, MTMS) son la interfaz JTAG para depurar con hardware externo. Si no usas JTAG externo, son GPIO normales. El ESP32-S3 también trae depuración JTAG por el USB integrado, así que rara vez necesitas ocuparlos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pines por defecto de I2C, SPI y UART
&lt;/h2&gt;

&lt;p&gt;Casi cualquier periférico puede asignarse a &lt;strong&gt;cualquier GPIO libre&lt;/strong&gt; gracias a la matriz de pines del chip, así que los "pines por defecto" son solo una convención del núcleo de Arduino. En la DevKitC-1 son:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bus&lt;/th&gt;
&lt;th&gt;Señal&lt;/th&gt;
&lt;th&gt;GPIO&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;I2C&lt;/td&gt;
&lt;td&gt;SDA / SCL&lt;/td&gt;
&lt;td&gt;8 / 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPI&lt;/td&gt;
&lt;td&gt;SS / MOSI / SCK / MISO&lt;/td&gt;
&lt;td&gt;10 / 11 / 12 / 13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UART0&lt;/td&gt;
&lt;td&gt;TX / RX&lt;/td&gt;
&lt;td&gt;43 / 44&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Estos valores vienen del archivo &lt;code&gt;pins_arduino.h&lt;/code&gt; de la variante y pueden cambiar entre versiones del núcleo o entre placas. Si algo no responde, imprime &lt;code&gt;SDA&lt;/code&gt;, &lt;code&gt;SCL&lt;/code&gt;, &lt;code&gt;MOSI&lt;/code&gt; y &lt;code&gt;SCK&lt;/code&gt; en el Monitor Serie o fíjalos tú:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Wire.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Wire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// SDA, SCL explícitos&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fijar los pines en el código evita sorpresas al cambiar de placa.&lt;/p&gt;

&lt;h2&gt;
  
  
  El LED integrado
&lt;/h2&gt;

&lt;p&gt;La DevKitC-1 trae un &lt;strong&gt;LED RGB direccionable&lt;/strong&gt; (tipo WS2812), no un LED simple. Está en &lt;strong&gt;GPIO38&lt;/strong&gt; en la versión 1.1 y en &lt;strong&gt;GPIO48&lt;/strong&gt; en la 1.0. Se maneja con &lt;code&gt;neopixelWrite&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;neopixelWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RGB_BUILTIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// verde tenue&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;neopixelWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RGB_BUILTIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// apagado&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;RGB_BUILTIN&lt;/code&gt; apunta al pin correcto en tu versión de la placa. Si prefieres no depender de él, ese pin cuenta como ocupado en tu lista.&lt;/p&gt;

&lt;h2&gt;
  
  
  Límites eléctricos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Los GPIO trabajan a &lt;strong&gt;3,3 V&lt;/strong&gt;. No conectes señales de 5 V directamente: usa un divisor de tensión o un conversor de nivel.&lt;/li&gt;
&lt;li&gt;Por cada pin no pidas más de unos &lt;strong&gt;20 mA&lt;/strong&gt;. Para relés, motores o tiras LED, usa un transistor, un MOSFET o un módulo con optoacoplador, y alimenta la carga aparte. Más detalle en cómo alimentar un ESP32.&lt;/li&gt;
&lt;li&gt;Une siempre las tierras (GND) de todos los dispositivos que se comunican.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lista de pines seguros
&lt;/h2&gt;

&lt;p&gt;Para un proyecto con Wi-Fi, sin PSRAM octal y sin USB nativo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entradas analógicas:&lt;/strong&gt; GPIO1 a GPIO10 (ADC1).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Salidas digitales y relés:&lt;/strong&gt; GPIO4 a GPIO7, GPIO15 a GPIO18, GPIO21, GPIO47.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I2C:&lt;/strong&gt; GPIO8 y GPIO9.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SPI:&lt;/strong&gt; GPIO10 a GPIO13.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y cuando algo falle sin razón aparente, revisa en este orden: pines de arranque, USB, PSRAM, ADC2 con Wi-Fi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cuántos pines puedo usar realmente en una DevKitC-1?
&lt;/h3&gt;

&lt;p&gt;Unos &lt;strong&gt;36 GPIO&lt;/strong&gt; llegan a los conectores. Con PSRAM octal bajan a 33, y si reservas los de arranque y la consola serie, quedan en torno a 25 para uso cómodo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar GPIO19 y GPIO20 como pines normales?
&lt;/h3&gt;

&lt;p&gt;Sí, pero pierdes el USB nativo. Mantén a mano el conector UART para volver a cargar un programa si algo sale mal.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué mi sensor analógico deja de funcionar al conectarme al Wi-Fi?
&lt;/h3&gt;

&lt;p&gt;Probablemente está en un pin de ADC2 (GPIO11 a GPIO20). Muévelo a un pin de ADC1 (GPIO1 a GPIO10).&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿En qué se diferencian los pines del ESP32-S3 y del ESP32-C3?
&lt;/h3&gt;

&lt;p&gt;El C3 tiene solo 22 GPIO, un único ADC útil con Wi-Fi y sin USB en la mayoría de placas pequeñas. Para elegir entre ambos, lee ESP32-S3 vs ESP32-C3.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ESP32-S3 DevKitC-1 N16R8&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spanish</category>
      <category>esp32</category>
      <category>arduino</category>
      <category>esp32s3</category>
    </item>
    <item>
      <title>De proyecto casero a producto IoT: qué cambia cuando tus dispositivos salen de tu casa</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Thu, 22 Oct 2026 09:52:33 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/de-proyecto-casero-a-producto-iot-que-cambia-cuando-tus-dispositivos-salen-de-tu-casa-29m6</link>
      <guid>https://dev.to/stevencarvajal/de-proyecto-casero-a-producto-iot-que-cambia-cuando-tus-dispositivos-salen-de-tu-casa-29m6</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/de-proyecto-casero-a-producto-iot" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hacer que un ESP32 encienda una luz desde el celular lleva un fin de semana. Hacer que &lt;strong&gt;cien&lt;/strong&gt; ESP32 funcionen en cien casas distintas, configurados por otras personas, con usuarios que no conoces y sin que tengas que visitar a nadie, es otro proyecto.&lt;/p&gt;

&lt;p&gt;Esta guía reúne lo que cambia en ese camino: los problemas que no existen en un prototipo y que aparecen en cuanto los dispositivos salen de tu escritorio.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Un solo firmware para todos
&lt;/h2&gt;

&lt;p&gt;En un prototipo, el Wi-Fi, el certificado y la configuración suelen estar escritos en el código. Con clientes, eso significa compilar un firmware distinto por dispositivo, a mano, con una llave privada copiada entre ventanas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lo que cambia:&lt;/strong&gt; un firmware genérico, igual para todos, y la configuración propia de cada dispositivo se entrega después de instalarlo y se guarda en su memoria (parte 6).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Aprovisionamiento sin visita técnica
&lt;/h2&gt;

&lt;p&gt;Alguien que no eres tú tiene que poder poner en marcha el dispositivo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lo que cambia:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;portal de configuración&lt;/strong&gt;: el dispositivo nuevo levanta su propia red Wi-Fi con un formulario (parte 16);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aprovisionamiento en la nube&lt;/strong&gt;, para que cada dispositivo obtenga su propio certificado sin quemarlo en el firmware (parte 17);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;confirmación humana&lt;/strong&gt; para emparejar dispositivos nuevos, para que nadie pueda colarse en un sistema ajeno;&lt;/li&gt;
&lt;li&gt;una forma de &lt;strong&gt;instalar el firmware sin herramientas&lt;/strong&gt;, como un botón en el navegador (parte 20).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Aislamiento entre clientes
&lt;/h2&gt;

&lt;p&gt;Con un solo usuario, los permisos pueden decir el nombre de tu dispositivo. Con varios clientes, la pregunta es: ¿qué impide que uno controle la casa de otro?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lo que cambia:&lt;/strong&gt; el aislamiento tiene que estar en los permisos de la nube, no solo en el código de la app. Cada dispositivo limitado a sus tópicos con políticas de IoT con variables (parte 13), y cada usuario limitado a sus datos por la API o por IAM, a partir de un token verificado.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Usuarios, roles y permisos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lo que cambia:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;registro por invitación y contraseña propia desde el primer login (parte 11);&lt;/li&gt;
&lt;li&gt;separar los &lt;strong&gt;roles de la plataforma&lt;/strong&gt; (quien la opera) de los &lt;strong&gt;roles dentro de cada casa&lt;/strong&gt; (quien usa los dispositivos);&lt;/li&gt;
&lt;li&gt;permisos aplicados en el servidor y una forma rápida de revocarlos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Actualizaciones a distancia
&lt;/h2&gt;

&lt;p&gt;Un error en el firmware de un prototipo se corrige con el cable. En casa de un cliente, no.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lo que cambia:&lt;/strong&gt; actualizaciones OTA con despliegue gradual (primero tus dispositivos, después unos pocos clientes, luego el resto), retraso aleatorio para no saturar el servidor y vuelta automática a la versión anterior si la nueva falla. Lo explico en la guía de instalación de firmware de este blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. La infraestructura, en código
&lt;/h2&gt;

&lt;p&gt;En un prototipo, crear un rol o una función en la consola "solo para probar" es normal. Con clientes, cada cambio manual es algo que nadie podrá reconstruir si se borra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lo que cambia:&lt;/strong&gt; la infraestructura definida en código (AWS CDK, Terraform), revisable y reproducible. Pasar a código lo que se creó a mano suele destapar permisos desactualizados y otros que sobran (parte 12).&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Seguridad revisada, no supuesta
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lo que cambia:&lt;/strong&gt; auditorías periódicas de lo que existe de verdad en la cuenta, no de lo documentado. Es habitual encontrar funciones públicas olvidadas y roles con comodines heredados de prototipos (parte 21).&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Saber cuánto cuesta cada cliente
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lo que cambia:&lt;/strong&gt; el costo por cliente es lo que decide el precio. Con una arquitectura serverless, el costo de la nube por casa puede quedar en centavos; lo que más lo mueve es la frecuencia de la telemetría (parte 22).&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Lo que no es código
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Certificaciones de radio.&lt;/strong&gt; Un dispositivo con Wi-Fi o Bluetooth que se vende necesita cumplir la normativa de radio y seguridad eléctrica de cada país (por ejemplo, el marcado CE en la Unión Europea). Usar módulos ya certificados ayuda, pero el producto final suele requerir sus propias pruebas. Consulta con un laboratorio antes de vender.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacidad.&lt;/strong&gt; Si guardas datos de personas, la normativa de protección de datos aplica (en Europa, el RGPD): qué guardas, para qué y por cuánto tiempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soporte.&lt;/strong&gt; ¿Qué pasa cuando alguien pierde el acceso a su cuenta o un dispositivo deja de responder? Decide el proceso antes de tener el primer caso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correo.&lt;/strong&gt; Enviar contraseñas o avisos por correo requiere un servicio configurado para enviar a cualquier dirección; en AWS, SES empieza en un modo de pruebas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lista de comprobación
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Área&lt;/th&gt;
&lt;th&gt;¿Lo tienes?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Firmware&lt;/td&gt;
&lt;td&gt;Un solo binario; configuración después de instalar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aprovisionamiento&lt;/td&gt;
&lt;td&gt;El cliente pone en marcha el dispositivo sin ti&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identidad&lt;/td&gt;
&lt;td&gt;Certificado propio por dispositivo, entregado de forma segura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aislamiento&lt;/td&gt;
&lt;td&gt;Permisos de la nube que separan a cada cliente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuarios&lt;/td&gt;
&lt;td&gt;Roles, permisos en el servidor y revocación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actualizaciones&lt;/td&gt;
&lt;td&gt;OTA gradual con vuelta atrás&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infraestructura&lt;/td&gt;
&lt;td&gt;Definida en código&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seguridad&lt;/td&gt;
&lt;td&gt;Auditoría periódica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Costos&lt;/td&gt;
&lt;td&gt;Costo por cliente conocido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Normativa&lt;/td&gt;
&lt;td&gt;Radio, seguridad eléctrica y privacidad revisadas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cuándo debería empezar a pensar en esto?
&lt;/h3&gt;

&lt;p&gt;Cuando el segundo dispositivo va a una casa que no es la tuya. Antes, optimiza para aprender rápido; después, cada atajo se paga con interés.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito una plataforma como AWS para vender dispositivos?
&lt;/h3&gt;

&lt;p&gt;No necesariamente, pero alguien tiene que resolver identidad, permisos, disponibilidad y actualizaciones. Una plataforma administrada te ahorra mantener servidores.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué suele ser lo más difícil?
&lt;/h3&gt;

&lt;p&gt;Los permisos. Que cada cliente solo vea lo suyo y que eso lo garantice la nube, no la interfaz. Conviene diseñarlo desde el primer cliente, no después.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todos los artículos sobre web app, infraestructura y producto
&lt;/h2&gt;



</description>
      <category>spanish</category>
      <category>iot</category>
      <category>aws</category>
      <category>productoiot</category>
    </item>
    <item>
      <title>Casa inteligente DIY desde cero con ESP32 y AWS: guía para planificarla</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Wed, 21 Oct 2026 09:51:40 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/casa-inteligente-diy-desde-cero-con-esp32-y-aws-guia-para-planificarla-2p3j</link>
      <guid>https://dev.to/stevencarvajal/casa-inteligente-diy-desde-cero-con-esp32-y-aws-guia-para-planificarla-2p3j</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/casa-inteligente-diy-esp32-aws" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hacer tu propia casa inteligente es uno de los proyectos más satisfactorios con ESP32: lo usas todos los días y aprendes de electrónica, redes, nube y aplicaciones a la vez. También es fácil empezar mal y terminar con un montón de dispositivos sueltos, cada uno con su app.&lt;/p&gt;

&lt;p&gt;Esta guía te ayuda a planificarla antes de soldar nada. Reúne las decisiones que conviene tomar desde el principio, con enlaces a la serie de domótica de este blog para cada pieza.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: decide qué quieres resolver
&lt;/h2&gt;

&lt;p&gt;Antes del hardware, escribe qué quieres hacer. Algunos ejemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encender y apagar luces desde el celular y por voz.&lt;/li&gt;
&lt;li&gt;Que las luces sigan funcionando con el interruptor de siempre si se cae internet.&lt;/li&gt;
&lt;li&gt;Que varias personas de la casa tengan acceso.&lt;/li&gt;
&lt;li&gt;Automatizaciones por horario o por presencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta lista decide todo lo demás. Por ejemplo, exigir que el interruptor funcione sin internet cambia el diseño del firmware (parte 18).&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: local, en la nube o híbrida
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Local (Home Assistant, ESPHome)&lt;/th&gt;
&lt;th&gt;En la nube (propia, con AWS)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Funciona sin internet&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;El control remoto no; los interruptores físicos sí, si los diseñas así&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control fuera de casa&lt;/td&gt;
&lt;td&gt;Requiere VPN o un servicio de acceso remoto&lt;/td&gt;
&lt;td&gt;Directo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mantenimiento&lt;/td&gt;
&lt;td&gt;Un servidor en tu casa&lt;/td&gt;
&lt;td&gt;Servicios administrados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Varias casas&lt;/td&gt;
&lt;td&gt;Una instalación por casa&lt;/td&gt;
&lt;td&gt;Una sola plataforma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Curva de aprendizaje&lt;/td&gt;
&lt;td&gt;Baja con ESPHome&lt;/td&gt;
&lt;td&gt;Alta: nube, permisos, app&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Si solo quieres domotizar tu casa, &lt;strong&gt;Home Assistant con ESPHome&lt;/strong&gt; es probablemente el camino más corto. La nube tiene sentido si quieres control remoto sin abrir puertos ni mantener un servidor, o aprender a construir cada pieza. La arquitectura está en la parte 1 de la serie de domótica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 3: el hardware
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Controladores:&lt;/strong&gt; placas ESP32. Un ESP32-S3 para el que habla con la nube y ESP32-C3 para cada luz es una combinación equilibrada (parte 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actuadores:&lt;/strong&gt; módulos de relé para encender cargas. Revisa la tensión y la corriente que admiten, y si se activan en alto o en bajo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entradas:&lt;/strong&gt; los interruptores de pared que ya tienes, conectados a un pin del ESP32; sensores de movimiento, temperatura o puertas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alimentación:&lt;/strong&gt; una fuente adecuada y aislada para cada dispositivo que vaya en la pared.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cajas:&lt;/strong&gt; aptas para instalaciones eléctricas, con separación entre la parte de red eléctrica y la de baja tensión.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 4: cómo se comunican
&lt;/h2&gt;

&lt;p&gt;Hay dos opciones principales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cada dispositivo al Wi-Fi&lt;/strong&gt;: simple al principio, pero con muchos dispositivos se vuelve frágil: cada uno ocupa el router y, si va a la nube, necesita su propia conexión segura.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Una pasarela&lt;/strong&gt;: un solo dispositivo conectado a internet y el resto hablando con él por ESP-NOW, Zigbee o Thread.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con una pasarela y ESP-NOW, los nodos no necesitan la contraseña del Wi-Fi y la nube solo ve un dispositivo por casa (parte 4). La comparación de opciones está en la guía de comunicación de este blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 5: seguridad eléctrica (no te la saltes)
&lt;/h2&gt;

&lt;p&gt;Una casa inteligente toca la red eléctrica: &lt;strong&gt;230 V a 50 Hz&lt;/strong&gt; en España y buena parte de Europa, &lt;strong&gt;entre 110 y 127 V a 60 Hz&lt;/strong&gt; en México y gran parte de América. Un error puede causar una descarga o un incendio.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Si no tienes experiencia con instalaciones eléctricas, pide ayuda a un electricista.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Corta el circuito en el tablero antes de tocar cualquier cable y comprueba que no hay tensión.&lt;/li&gt;
&lt;li&gt;Usa componentes dimensionados para la carga y certificados para tu país.&lt;/li&gt;
&lt;li&gt;Respeta la normativa local: en muchos lugares, las instalaciones fijas deben hacerlas profesionales habilitados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes desarrollar todo el sistema con LEDs en la mesa y dejar la conexión a la red para el final.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 6: la app, la voz y los usuarios
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Una web app instalable (PWA)&lt;/strong&gt; te da un ícono en el celular sin pasar por las tiendas de apps (parte 15).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voz:&lt;/strong&gt; un Atajo de Siri que llama a una API es la forma más simple de controlar por voz un sistema propio (parte 9). En Android, apps como HTTP Shortcuts hacen lo mismo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usuarios:&lt;/strong&gt; si vive más gente en casa, piensa desde el principio quién puede controlar qué (parte 11).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 7: el costo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware:&lt;/strong&gt; una placa por dispositivo, más relés, fuentes y cajas. Es el mayor gasto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nube:&lt;/strong&gt; con una pasarela por casa, centavos al mes en AWS (parte 22).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local:&lt;/strong&gt; el consumo eléctrico y el costo del servidor (por ejemplo, un Raspberry Pi o un mini PC).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Una hoja de ruta realista
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Un ESP32 que enciende un LED desde el celular (por Wi-Fi o con la nube).&lt;/li&gt;
&lt;li&gt;Un segundo dispositivo y la comunicación entre ellos.&lt;/li&gt;
&lt;li&gt;El interruptor físico y el comportamiento sin internet.&lt;/li&gt;
&lt;li&gt;La app, los usuarios y la voz.&lt;/li&gt;
&lt;li&gt;La seguridad: identidad por dispositivo, permisos y revisión.&lt;/li&gt;
&lt;li&gt;Por último, la instalación eléctrica real, con ayuda profesional.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Necesito saber programar?
&lt;/h3&gt;

&lt;p&gt;Para ESPHome y Home Assistant, muy poco. Para un sistema propio, sí: firmware en C++, una app web y algo de nube.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué hago si se cae internet?
&lt;/h3&gt;

&lt;p&gt;Diseña para que lo esencial funcione igual: interruptores físicos que actúan directamente sobre la luz y dispositivos que se ponen al día cuando vuelve la conexión.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es caro?
&lt;/h3&gt;

&lt;p&gt;El hardware de una luz inteligente hecha con un ESP32-C3 y un relé suele costar menos que un interruptor inteligente comercial. Lo que más inviertes es tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todos los artículos sobre casa inteligente DIY y voz
&lt;/h2&gt;



</description>
      <category>spanish</category>
      <category>esp32</category>
      <category>aws</category>
      <category>domotica</category>
    </item>
    <item>
      <title>Cómo instalar firmware en un ESP32: USB, navegador u OTA, y cuándo usar cada uno</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Tue, 20 Oct 2026 09:50:20 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/como-instalar-firmware-en-un-esp32-usb-navegador-u-ota-y-cuando-usar-cada-uno-1i74</link>
      <guid>https://dev.to/stevencarvajal/como-instalar-firmware-en-un-esp32-usb-navegador-u-ota-y-cuando-usar-cada-uno-1i74</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/flashear-esp32-usb-navegador-ota" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Escribir el firmware es la mitad del trabajo. La otra mitad es &lt;strong&gt;llevarlo al dispositivo&lt;/strong&gt;: la primera vez, cuando hay que corregir un error y cuando el dispositivo ya está en casa de un cliente. Para eso hay tres caminos, cada uno con su momento.&lt;/p&gt;

&lt;p&gt;En esta guía comparo las tres formas de instalar firmware en un ESP32, cómo se configura un dispositivo recién instalado y qué hay que prever para actualizar una flota sin dejar dispositivos inservibles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las tres formas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;USB (Arduino IDE, esptool)&lt;/th&gt;
&lt;th&gt;Navegador (ESP Web Tools)&lt;/th&gt;
&lt;th&gt;OTA (por red)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Necesita&lt;/td&gt;
&lt;td&gt;Computador con herramientas instaladas y cable&lt;/td&gt;
&lt;td&gt;Chrome o Edge de escritorio y cable&lt;/td&gt;
&lt;td&gt;Que el dispositivo ya tenga un firmware con OTA y acceso a la red&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ideal para&lt;/td&gt;
&lt;td&gt;Desarrollo&lt;/td&gt;
&lt;td&gt;Instalar o reinstalar sin herramientas&lt;/td&gt;
&lt;td&gt;Actualizar dispositivos ya instalados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;¿Borra la configuración?&lt;/td&gt;
&lt;td&gt;No, salvo que borres la flash&lt;/td&gt;
&lt;td&gt;Sí, en una instalación nueva&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Riesgo&lt;/td&gt;
&lt;td&gt;Bajo&lt;/td&gt;
&lt;td&gt;Bajo&lt;/td&gt;
&lt;td&gt;Si falla a mitad, el dispositivo puede quedar inservible si no hay plan B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1. Por USB: para desarrollar
&lt;/h2&gt;

&lt;p&gt;Es la forma de siempre: compilas y cargas desde Arduino IDE, PlatformIO o la línea de comandos con &lt;code&gt;esptool&lt;/code&gt;. Durante el desarrollo es la más rápida.&lt;/p&gt;

&lt;p&gt;Dos detalles que conviene saber:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cargar un sketch no borra la partición NVS.&lt;/strong&gt; Si tu firmware guarda configuración, sobrevive a una carga nueva. Para empezar de cero, borra la flash completa (&lt;code&gt;esptool.py erase_flash&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El cable importa.&lt;/strong&gt; Muchos cables USB solo cargan. Si el computador no ve la placa, prueba otro cable antes que otros &lt;em&gt;drivers&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Desde el navegador: para instalar sin herramientas
&lt;/h2&gt;

&lt;p&gt;Chrome y Edge de escritorio implementan &lt;strong&gt;Web Serial&lt;/strong&gt;, que permite a una página web hablar con un dispositivo USB. &lt;strong&gt;ESP Web Tools&lt;/strong&gt;, el componente que usa Home Assistant, aprovecha eso para instalar firmware con un botón: detecta el chip, borra la memoria y escribe el binario correcto.&lt;/p&gt;

&lt;p&gt;Un ejemplo: un botón en un panel web que detecta si conectaste un ESP32-S3 o un ESP32-C3 e instala el firmware que corresponde a cada uno. El paso a paso está en la parte 20 de la serie.&lt;/p&gt;

&lt;p&gt;No funciona en Safari, Firefox ni en iPhone. Para una herramienta de instalación desde un computador, no es un problema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Después de instalar: la configuración
&lt;/h2&gt;

&lt;p&gt;Un firmware genérico, igual para todos los dispositivos, necesita recibir después lo que es propio de cada uno: el Wi-Fi, su identidad en la nube, su papel en el sistema. Las formas habituales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Un punto de acceso con un formulario web&lt;/strong&gt;: el dispositivo sin configurar levanta su propia red Wi-Fi; te conectas con el celular y llenas los datos (parte 16).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprovisionamiento en la nube&lt;/strong&gt;: el dispositivo pide su propio certificado la primera vez que se conecta, por ejemplo con Fleet Provisioning de AWS (parte 17).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bluetooth LE&lt;/strong&gt;, con una app propia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Por puerto serie&lt;/strong&gt;, para técnicos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La configuración se guarda en la memoria NVS y sobrevive a los reinicios (parte 6).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Por OTA: para dispositivos ya instalados
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OTA&lt;/strong&gt; (&lt;em&gt;over the air&lt;/em&gt;) es actualizar el firmware por la red, sin tocar el dispositivo. Es imprescindible en cuanto tienes dispositivos fuera de tu escritorio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cómo funciona por dentro
&lt;/h3&gt;

&lt;p&gt;El esquema de particiones habitual del ESP32 tiene &lt;strong&gt;dos espacios para la aplicación&lt;/strong&gt; (&lt;code&gt;ota_0&lt;/code&gt; y &lt;code&gt;ota_1&lt;/code&gt;). El dispositivo ejecuta desde uno y escribe la versión nueva en el otro. Solo cuando la descarga termina y se verifica, marca la nueva como la que debe arrancar.&lt;/p&gt;

&lt;p&gt;Si algo falla durante la descarga, el dispositivo sigue arrancando la versión anterior. Y con el &lt;strong&gt;rollback&lt;/strong&gt; activo, si la versión nueva arranca pero no se marca como válida, el cargador vuelve a la anterior en el siguiente reinicio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Con Arduino
&lt;/h3&gt;

&lt;p&gt;El núcleo de Arduino para ESP32 incluye lo necesario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ArduinoOTA&lt;/code&gt;&lt;/strong&gt;: para cargar desde el IDE por la red local, durante el desarrollo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;HTTPUpdate&lt;/code&gt;&lt;/strong&gt;: el dispositivo descarga un binario de una URL HTTPS y se actualiza.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFiClientSecure.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;HTTPUpdate.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;actualizar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;WiFiClientSecure&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setCACert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CA_DEL_SERVIDOR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// verifica el servidor de descarga&lt;/span&gt;
  &lt;span class="n"&gt;t_httpUpdate_return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httpUpdate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;HTTP_UPDATE_FAILED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Falló la actualización: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpUpdate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLastErrorString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// Si sale bien, el ESP32 se reinicia solo con la versión nueva&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lo que hay que prever en una flota
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No actualices todo de golpe.&lt;/strong&gt; Prueba primero en tus propios dispositivos, después en unos pocos (&lt;em&gt;canary&lt;/em&gt;) y luego en el resto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reparte las descargas en el tiempo&lt;/strong&gt;, con un retraso aleatorio por dispositivo, para no saturar el servidor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirma que la versión nueva funciona&lt;/strong&gt; (por ejemplo, que vuelve a conectarse a la nube) antes de marcarla como válida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifica el origen&lt;/strong&gt;: HTTPS con un certificado de confianza y, mejor aún, firmware firmado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con AWS IoT, una forma de coordinarlo es publicar la versión deseada en el &lt;em&gt;Device Shadow&lt;/em&gt; de cada dispositivo, o usar &lt;strong&gt;AWS IoT Jobs&lt;/strong&gt;, que gestiona despliegues por grupos con límites de velocidad y criterios de cancelación. Los nodos que no tienen Wi-Fi (por ejemplo, los que solo usan ESP-NOW) necesitan otra vía: que la pasarela les reenvíe el firmware, o actualizarlos por USB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuál usar en cada momento
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Momento&lt;/th&gt;
&lt;th&gt;Forma&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Desarrollando&lt;/td&gt;
&lt;td&gt;USB desde el IDE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instalando un dispositivo nuevo o reinstalando uno&lt;/td&gt;
&lt;td&gt;Navegador, con borrado completo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dispositivo ya instalado en casa de alguien&lt;/td&gt;
&lt;td&gt;OTA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un dispositivo que no arranca&lt;/td&gt;
&lt;td&gt;USB o navegador, borrando la flash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Puedo romper un ESP32 con una actualización fallida?
&lt;/h3&gt;

&lt;p&gt;Con OTA bien hecha, no: la versión anterior sigue en su partición. Lo que sí puede pasar es que la versión nueva arranque pero no funcione (por ejemplo, que no se conecte); para eso está el rollback. Por USB siempre puedes reinstalar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo reseteo un ESP32 a fábrica?
&lt;/h3&gt;

&lt;p&gt;Borrando la flash completa: con &lt;code&gt;esptool.py erase_flash&lt;/code&gt; o con una instalación nueva desde ESP Web Tools. Así desaparece también la configuración guardada en NVS.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿La OTA funciona con ESP-NOW?
&lt;/h3&gt;

&lt;p&gt;No de forma estándar: la OTA descarga por TCP/IP. Para actualizar dispositivos que solo hablan ESP-NOW, la pasarela tendría que retransmitir el binario en trozos, algo posible pero bastante más complejo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todos los artículos sobre aprovisionamiento, flasheo y OTA
&lt;/h2&gt;



</description>
      <category>spanish</category>
      <category>esp32</category>
      <category>firmware</category>
      <category>ota</category>
    </item>
    <item>
      <title>Seguridad IoT de extremo a extremo: del ESP32 a la nube, capa por capa</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Mon, 19 Oct 2026 10:31:59 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/seguridad-iot-de-extremo-a-extremo-del-esp32-a-la-nube-capa-por-capa-5am7</link>
      <guid>https://dev.to/stevencarvajal/seguridad-iot-de-extremo-a-extremo-del-esp32-a-la-nube-capa-por-capa-5am7</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/seguridad-iot-extremo-a-extremo" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;La seguridad de un sistema IoT es tan fuerte como su capa más débil. Puedes tener la nube perfectamente configurada y que un certificado copiado en un repositorio público lo eche todo abajo; o un firmware impecable y un rol con &lt;code&gt;"Resource": "*"&lt;/code&gt; que deja la puerta abierta a cualquiera.&lt;/p&gt;

&lt;p&gt;Esta guía recorre las cinco capas de un sistema IoT, del chip a las personas que lo usan, con lo mínimo que conviene hacer en cada una. Los ejemplos usan las piezas de la serie de domótica de este blog: ESP32, ESP-NOW y AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las cinco capas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;El dispositivo&lt;/strong&gt;: el ESP32, su firmware y lo que guarda en memoria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La red local&lt;/strong&gt;: cómo se comunican los dispositivos entre sí y con el router.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La conexión con la nube&lt;/strong&gt;: cómo se autentica cada dispositivo y qué puede hacer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La nube y las APIs&lt;/strong&gt;: los permisos de cada servicio y el aislamiento entre usuarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Los usuarios y la operación&lt;/strong&gt;: el login, los permisos de cada persona y el día a día.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Capa 1: el dispositivo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Una identidad por dispositivo.&lt;/strong&gt; Cada ESP32 con su propio certificado X.509. Si uno se compromete, lo revocas sin afectar a los demás.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nada de credenciales en el código.&lt;/strong&gt; Ni la contraseña del Wi-Fi ni la llave privada deben estar en el firmware ni en el repositorio. Con &lt;strong&gt;Fleet Provisioning&lt;/strong&gt;, cada dispositivo obtiene su certificado después de instalar el firmware (parte 17).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protege lo que guardas.&lt;/strong&gt; Por defecto, la memoria NVS del ESP32 no está cifrada: con acceso físico se puede leer. Para un producto, activa el &lt;strong&gt;cifrado de la flash&lt;/strong&gt; y el &lt;strong&gt;arranque seguro&lt;/strong&gt; (&lt;em&gt;secure boot&lt;/em&gt;), que solo permite ejecutar firmware firmado por ti.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actualizaciones firmadas.&lt;/strong&gt; Si actualizas el firmware a distancia, verifica la firma o al menos usa HTTPS con un certificado de confianza, y conserva la posibilidad de volver a la versión anterior si la nueva falla.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La mejor opción para la llave:&lt;/strong&gt; que el dispositivo genere su propio par de llaves y solo envíe una solicitud de firma (CSR). Así la llave privada nunca sale del chip.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Capa 2: la red local
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Separa los dispositivos IoT&lt;/strong&gt; en su propia red o VLAN si tu router lo permite. Si uno se compromete, no ve tus computadores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valida el origen de cada mensaje local.&lt;/strong&gt; Una pasarela solo debería aceptar mensajes ESP-NOW de nodos conocidos, comprobando su MAC (parte 4). Y un dispositivo nuevo no debería aceptarse solo: que una persona lo confirme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cifra si lo que viaja es sensible.&lt;/strong&gt; ESP-NOW admite cifrado con clave compartida. Para órdenes simples el riesgo es bajo; con datos personales, cifra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Los portales de configuración, solo mientras hacen falta.&lt;/strong&gt; La red Wi-Fi abierta que levanta un dispositivo para configurarse debe desaparecer en cuanto se configura.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Capa 3: la conexión con la nube
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TLS siempre&lt;/strong&gt;, verificando el certificado del servidor (en un ESP32, con la CA raíz cargada; nunca desactives la verificación "para que funcione").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Políticas de mínimo privilegio por dispositivo.&lt;/strong&gt; Que solo pueda conectarse con su propio nombre y usar los tópicos de su propio Shadow. Un comodín convierte un certificado robado en acceso a toda la cuenta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Una política para toda la flota, con variables.&lt;/strong&gt; &lt;code&gt;${iot:Connection.Thing.ThingName}&lt;/code&gt; limita cada dispositivo a lo suyo sin escribir una política por dispositivo (parte 13).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define las políticas como código&lt;/strong&gt;, no a mano en la consola. Un permiso agregado a mano para probar no existe para el siguiente dispositivo, y nadie recuerda que está ahí (parte 12).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Capa 4: la nube y las APIs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nunca confíes en lo que envía el cliente&lt;/strong&gt; para decidir sobre qué dispositivo o datos actúa. Sácalo de un token verificado o de un registro en tu base de datos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aislamiento entre usuarios en IAM, no solo en el código.&lt;/strong&gt; Si los usuarios acceden directamente a servicios de AWS, condiciones como &lt;code&gt;dynamodb:LeadingKeys&lt;/code&gt; limitan a cada uno a sus propios datos. Si pasan por una API, la API decide con el token verificado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un rol por función, con lo justo.&lt;/strong&gt; Si una Lambda solo lee un índice y actualiza un Shadow, su rol no debe poder hacer nada más.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APIs públicas que validan por dentro.&lt;/strong&gt; Una Lambda Function URL sin autenticación de IAM es pública: toda la validación (token, firma) ocurre en el código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guarda hashes, no secretos.&lt;/strong&gt; Tokens propios y códigos de un solo uso se guardan como hash y se muestran una sola vez (parte 8).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Capa 5: los usuarios y la operación
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Registro solo por invitación&lt;/strong&gt; si es un sistema privado: en Cognito, &lt;code&gt;AllowAdminCreateUserOnly&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contraseña propia desde el primer login&lt;/strong&gt;: la temporal solo sirve para entrar la primera vez (parte 11).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permisos aplicados en el servidor.&lt;/strong&gt; Ocultar un botón en la app no es control de acceso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revocación rápida&lt;/strong&gt;: al quitar a alguien, cerrar sus sesiones, borrar sus credenciales (como sus tokens) y quitarle los permisos. Un JWT ya emitido no se puede revocar, así que acórtale la vida útil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audita lo que existe&lt;/strong&gt;, no lo que documentaste. En proyectos que nacieron como prototipo es común encontrar funciones públicas olvidadas y roles con comodines (parte 21).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lista de comprobación
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capa&lt;/th&gt;
&lt;th&gt;Comprobación&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dispositivo&lt;/td&gt;
&lt;td&gt;Certificado propio por dispositivo, sin credenciales en el código ni en el repositorio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dispositivo&lt;/td&gt;
&lt;td&gt;Cifrado de flash y arranque seguro en producción&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red local&lt;/td&gt;
&lt;td&gt;Mensajes validados por origen; dispositivos nuevos confirmados por una persona&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conexión&lt;/td&gt;
&lt;td&gt;TLS con verificación; políticas sin comodines, generadas por código&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nube&lt;/td&gt;
&lt;td&gt;Aislamiento por usuario aplicado por IAM o por la API; un rol mínimo por función&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APIs&lt;/td&gt;
&lt;td&gt;Validación dentro de cada endpoint público; secretos guardados como hash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuarios&lt;/td&gt;
&lt;td&gt;Registro por invitación, permisos en el servidor, revocación inmediata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operación&lt;/td&gt;
&lt;td&gt;Auditoría periódica de roles, políticas y endpoints públicos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Por dónde empiezo si mi proyecto ya existe?
&lt;/h3&gt;

&lt;p&gt;Por buscar comodines: &lt;code&gt;"Resource": "*"&lt;/code&gt;, &lt;code&gt;thing/*&lt;/code&gt;, identidades no autenticadas con permisos. Después, por cada endpoint público, comprueba qué valida. Son los dos agujeros más comunes en proyectos que nacieron como prototipo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cifrar ESP-NOW es obligatorio?
&lt;/h3&gt;

&lt;p&gt;Depende de lo que envíes. Para órdenes simples entre dispositivos que se validan por MAC, el riesgo es bajo. Para cualquier dato personal o de seguridad, cifra.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué herramientas de AWS ayudan?
&lt;/h3&gt;

&lt;p&gt;IAM Access Analyzer detecta recursos accesibles desde fuera de la cuenta; AWS IoT Device Defender audita la configuración de IoT Core; &lt;code&gt;aws iam simulate-principal-policy&lt;/code&gt; prueba permisos concretos antes de desplegarlos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todos los artículos sobre seguridad, identidad y usuarios
&lt;/h2&gt;



</description>
      <category>seguridad</category>
      <category>iot</category>
      <category>esp32</category>
      <category>awsiam</category>
    </item>
    <item>
      <title>Cuánto cuesta desplegar una API Spring Boot en AWS: 4 opciones comparadas</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Mon, 19 Oct 2026 10:31:54 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/cuanto-cuesta-desplegar-una-api-spring-boot-en-aws-4-opciones-comparadas-3h35</link>
      <guid>https://dev.to/stevencarvajal/cuanto-cuesta-desplegar-una-api-spring-boot-en-aws-4-opciones-comparadas-3h35</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/cuanto-cuesta-spring-boot-aws" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tienes una API REST con Spring Boot que funciona en tu máquina y quieres subirla a AWS. Hay muchas formas de hacerlo, y la factura cambia bastante según cuál elijas: desde &lt;strong&gt;un par de dólares al mes&lt;/strong&gt; hasta &lt;strong&gt;más de 60 USD&lt;/strong&gt; para la misma API.&lt;/p&gt;

&lt;p&gt;En esta guía comparo las cuatro opciones más comunes para una API Java (&lt;strong&gt;EC2&lt;/strong&gt;, &lt;strong&gt;Elastic Beanstalk&lt;/strong&gt;, &lt;strong&gt;ECS con Fargate&lt;/strong&gt; y &lt;strong&gt;Lambda&lt;/strong&gt;). Para cada una verás qué cobra AWS, un cálculo de ejemplo y cuándo conviene.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antes de empezar:&lt;/strong&gt; los precios de AWS cambian y dependen de la región. Las cifras son aproximadas para &lt;code&gt;us-east-1&lt;/code&gt; (Norte de Virginia) al momento de escribir, con 730 horas por mes. Antes de decidir, comprueba tu caso en la &lt;strong&gt;AWS Pricing Calculator&lt;/strong&gt;. Si preparas el AWS Cloud Practitioner, este cálculo es buen ejercicio para la parte de facturación: lo explico en la guía para aprobarlo.&lt;/p&gt;

&lt;h2&gt;
  
  
  El escenario de ejemplo
&lt;/h2&gt;

&lt;p&gt;Para que la comparación sea justa, todas las opciones despliegan la misma API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot 3 con Java 21, empaquetada como un &lt;code&gt;.jar&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tráfico bajo o moderado: hasta &lt;strong&gt;1 millón de peticiones al mes&lt;/strong&gt;, con una respuesta media de 200 ms.&lt;/li&gt;
&lt;li&gt;Un solo entorno (producción), sin contar la base de datos. La base de datos va aparte, más abajo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spring Boot necesita memoria: una API típica usa entre &lt;strong&gt;300 y 600 MB&lt;/strong&gt; de RAM. Por eso no conviene una instancia con 512 MB: con 1 GB funciona justa, y lo cómodo es 2 GB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opción 1: EC2
&lt;/h2&gt;

&lt;p&gt;Una máquina virtual donde instalas Java y ejecutas el &lt;code&gt;.jar&lt;/code&gt; (con &lt;code&gt;systemd&lt;/code&gt; o en un contenedor Docker).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Precio&lt;/th&gt;
&lt;th&gt;Al mes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instancia &lt;code&gt;t4g.small&lt;/code&gt; (2 vCPU ARM, 2 GB)&lt;/td&gt;
&lt;td&gt;~0,0168 USD/hora&lt;/td&gt;
&lt;td&gt;~12,30 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disco EBS gp3 de 20 GB&lt;/td&gt;
&lt;td&gt;~0,08 USD por GB&lt;/td&gt;
&lt;td&gt;~1,60 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPv4 pública&lt;/td&gt;
&lt;td&gt;~0,005 USD/hora&lt;/td&gt;
&lt;td&gt;~3,65 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~17,50 USD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Las instancias &lt;code&gt;t4g&lt;/code&gt; usan procesadores &lt;strong&gt;Graviton (ARM)&lt;/strong&gt; y cuestan alrededor de un 20 % menos que sus equivalentes x86 (&lt;code&gt;t3&lt;/code&gt;). Java corre igual en ARM: solo necesitas un JDK para ARM, como las imágenes de Eclipse Temurin, que son multiarquitectura.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A favor:&lt;/strong&gt; es lo más barato con una máquina siempre encendida, y tienes control total.&lt;br&gt;
&lt;strong&gt;En contra:&lt;/strong&gt; tú actualizas el sistema operativo, configuras HTTPS, reinicias si se cae y escalas a mano.&lt;/p&gt;
&lt;h2&gt;
  
  
  Opción 2: Elastic Beanstalk
&lt;/h2&gt;

&lt;p&gt;Subes el &lt;code&gt;.jar&lt;/code&gt; y Beanstalk crea la infraestructura: instancias EC2, el entorno de Java, los logs y, si lo pides, el balanceador y el escalado automático. &lt;strong&gt;Beanstalk no cobra nada por sí mismo&lt;/strong&gt;: pagas los recursos que crea.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de entorno&lt;/th&gt;
&lt;th&gt;Qué crea&lt;/th&gt;
&lt;th&gt;Al mes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instancia única&lt;/td&gt;
&lt;td&gt;1 EC2 &lt;code&gt;t4g.small&lt;/code&gt; + disco + IP pública&lt;/td&gt;
&lt;td&gt;~17,50 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Con balanceador&lt;/td&gt;
&lt;td&gt;2 EC2 + Application Load Balancer + IPs públicas&lt;/td&gt;
&lt;td&gt;~55–60 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;El balanceador de aplicaciones (ALB) cuesta unos &lt;strong&gt;16,50 USD al mes&lt;/strong&gt; solo por existir, más su uso (LCU) y sus IPs públicas. Es el salto de precio más grande de esta comparación.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A favor:&lt;/strong&gt; despliegas con &lt;code&gt;eb deploy&lt;/code&gt; o desde el pipeline, sin pensar en la infraestructura. Las actualizaciones de la plataforma son administradas.&lt;br&gt;
&lt;strong&gt;En contra:&lt;/strong&gt; personalizar fuera de lo previsto (redes, proxies, agentes) se vuelve incómodo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Opción 3: ECS con Fargate
&lt;/h2&gt;

&lt;p&gt;Empaquetas la API en una imagen de Docker y ECS la ejecuta en Fargate, sin servidores que administrar. Pagas por la CPU y la memoria que reservas mientras el contenedor está encendido.&lt;/p&gt;

&lt;p&gt;Una imagen mínima para Spring Boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; eclipse-temurin:21-jre&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; target/api.jar api.jar&lt;/span&gt;
&lt;span class="c"&gt;# La JVM usa como máximo el 75 % de la memoria del contenedor&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; JAVA_TOOL_OPTIONS="-XX:MaxRAMPercentage=75"&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "api.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Precio (ARM)&lt;/th&gt;
&lt;th&gt;Al mes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tarea con 0,5 vCPU y 1 GB&lt;/td&gt;
&lt;td&gt;~0,0198 USD/hora&lt;/td&gt;
&lt;td&gt;~14,40 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application Load Balancer (más uso y sus IPs)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;~25 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPv4 pública de la tarea&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;~3,65 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total con 1 tarea&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~40–45 USD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total con 2 tareas (alta disponibilidad)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~55–65 USD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;En x86 la tarea cuesta unos 18 USD al mes, un 20 % más. Sin balanceador, con una IP pública en la tarea, el total baja a unos 18 USD. Esa variante sirve para pruebas, pero la IP cambia en cada despliegue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A favor:&lt;/strong&gt; despliegues reproducibles con imágenes, escalado automático y nada de sistemas operativos que parchear. Es el estándar para microservicios.&lt;br&gt;
&lt;strong&gt;En contra:&lt;/strong&gt; hay más piezas que entender (clúster, servicio, tarea, ECR) y el balanceador encarece los proyectos pequeños.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opción 4: Lambda con API Gateway
&lt;/h2&gt;

&lt;p&gt;La API se ejecuta solo cuando llega una petición. Con Spring Boot se usa la librería &lt;strong&gt;aws-serverless-java-container&lt;/strong&gt;, que adapta las peticiones de API Gateway a tus controladores sin reescribirlos.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Precio&lt;/th&gt;
&lt;th&gt;Al mes (1 millón de peticiones)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Peticiones de Lambda&lt;/td&gt;
&lt;td&gt;0,20 USD por millón&lt;/td&gt;
&lt;td&gt;0,20 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cómputo (1 GB × 200 ms)&lt;/td&gt;
&lt;td&gt;~0,0000167 USD por GB-segundo&lt;/td&gt;
&lt;td&gt;~3,33 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway (HTTP API)&lt;/td&gt;
&lt;td&gt;~1 USD por millón&lt;/td&gt;
&lt;td&gt;~1 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~4,50 USD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La capa gratuita permanente de Lambda incluye &lt;strong&gt;1 millón de peticiones y 400 000 GB-segundos al mes&lt;/strong&gt;. En este escenario, eso deja el total en &lt;strong&gt;alrededor de 1 USD&lt;/strong&gt;, lo que cobra API Gateway.&lt;/p&gt;

&lt;p&gt;El problema clásico de Java en Lambda es el &lt;strong&gt;arranque en frío&lt;/strong&gt;: levantar Spring tarda varios segundos. Hay dos formas de mitigarlo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lambda SnapStart&lt;/strong&gt;: guarda una instantánea de la función ya inicializada y la restaura en milisegundos. Para Java no tiene costo adicional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compilar a imagen nativa con GraalVM&lt;/strong&gt; (Spring Boot 3 lo soporta): arranca mucho más rápido y usa menos memoria, a cambio de una compilación más lenta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A favor:&lt;/strong&gt; costo casi cero con poco tráfico y escala sola.&lt;br&gt;
&lt;strong&gt;En contra:&lt;/strong&gt; el arranque en frío, el límite de 15 minutos por ejecución y que no encaja con conexiones largas (WebSockets) ni con pools de conexiones grandes a la base de datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  La comparación
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opción&lt;/th&gt;
&lt;th&gt;Al mes (aprox.)&lt;/th&gt;
&lt;th&gt;Administración&lt;/th&gt;
&lt;th&gt;Escala sola&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;EC2 &lt;code&gt;t4g.small&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;~17,50 USD&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Aprender, proyectos personales, control total&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beanstalk, instancia única&lt;/td&gt;
&lt;td&gt;~17,50 USD&lt;/td&gt;
&lt;td&gt;Baja&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;MVP sin tiempo para infraestructura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beanstalk con balanceador&lt;/td&gt;
&lt;td&gt;~55–60 USD&lt;/td&gt;
&lt;td&gt;Baja&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Apps tradicionales en producción&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fargate + balanceador&lt;/td&gt;
&lt;td&gt;~40–65 USD&lt;/td&gt;
&lt;td&gt;Media&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Microservicios y equipos que ya usan Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda + API Gateway&lt;/td&gt;
&lt;td&gt;~1–5 USD&lt;/td&gt;
&lt;td&gt;Muy baja&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Tráfico bajo o con picos, APIs pequeñas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Calcula tu caso
&lt;/h2&gt;

&lt;p&gt;Pon tu tráfico, el tamaño de la instancia o de la tarea y si usas balanceador o NAT Gateway: la calculadora compara las cuatro opciones con tus números. También está como página aparte en la &lt;a href="https://iot.gripe/herramientas/calculadora-costos-aws" rel="noopener noreferrer"&gt;calculadora de costos de AWS&lt;/a&gt;.&lt;/p&gt;



&lt;h2&gt;
  
  
  Los costos que nadie mira hasta que llega la factura
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IPs públicas IPv4.&lt;/strong&gt; Desde 2024 AWS cobra cada IPv4 pública, unos &lt;strong&gt;3,65 USD al mes por IP&lt;/strong&gt;. Se cobran también las del balanceador y las de las tareas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAT Gateway.&lt;/strong&gt; Si pones las instancias o tareas en subredes privadas, necesitan un NAT Gateway para salir a internet. Cuesta unos &lt;strong&gt;33 USD al mes más el tráfico&lt;/strong&gt;. Es la sorpresa más común en proyectos pequeños. Alternativas: subredes públicas con grupos de seguridad estrictos o &lt;em&gt;VPC endpoints&lt;/em&gt; para los servicios de AWS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CloudWatch Logs.&lt;/strong&gt; Unos 0,50 USD por GB ingerido. Un log en nivel &lt;code&gt;DEBUG&lt;/code&gt; en producción lo multiplica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transferencia de datos.&lt;/strong&gt; Los primeros 100 GB de salida a internet al mes son gratis; después, unos 0,09 USD por GB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La base de datos.&lt;/strong&gt; Suele costar más que la propia API (ver la siguiente sección).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Y la base de datos
&lt;/h2&gt;

&lt;p&gt;Casi toda API Spring Boot necesita una. Las opciones más comunes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opción&lt;/th&gt;
&lt;th&gt;Al mes (aprox.)&lt;/th&gt;
&lt;th&gt;Notas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RDS PostgreSQL &lt;code&gt;db.t4g.micro&lt;/code&gt; + 20 GB&lt;/td&gt;
&lt;td&gt;~14 USD&lt;/td&gt;
&lt;td&gt;Copias de seguridad y parches administrados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL en la misma EC2&lt;/td&gt;
&lt;td&gt;0 USD extra&lt;/td&gt;
&lt;td&gt;Barato, pero tú haces las copias de seguridad y lo mantienes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB bajo demanda&lt;/td&gt;
&lt;td&gt;Céntimos con poco tráfico&lt;/td&gt;
&lt;td&gt;Exige modelar los datos de otra forma (NoSQL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MongoDB Atlas (nivel gratuito)&lt;/td&gt;
&lt;td&gt;0 USD&lt;/td&gt;
&lt;td&gt;Útil para probar; el nivel de producción se paga aparte&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para producción, una base de datos administrada (RDS) vale lo que cuesta: las copias de seguridad automáticas y la restauración a un punto en el tiempo te salvan el día que algo sale mal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuál elegir
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Estás aprendiendo o es un proyecto personal&lt;/strong&gt;: EC2 &lt;code&gt;t4g.small&lt;/code&gt;, o Lambda si el tráfico es esporádico. Aprenderás más con EC2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Es un MVP y quieres desplegar ya&lt;/strong&gt;: Elastic Beanstalk con instancia única. Cuando crezca, cambias a un entorno con balanceador sin tocar el código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Son varios microservicios o tu equipo ya usa Docker&lt;/strong&gt;: ECS con Fargate. Un solo balanceador puede repartir el tráfico entre varios servicios por ruta, así que su costo se reparte.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tráfico bajo, irregular o con picos&lt;/strong&gt;: Lambda con SnapStart.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo no llevarte sorpresas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crea una alerta en AWS Budgets el primer día&lt;/strong&gt;, por ejemplo a los 10 USD. Es gratis y te avisa por correo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estima antes de desplegar&lt;/strong&gt; con la AWS Pricing Calculator, con tus números de tráfico.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Etiqueta los recursos&lt;/strong&gt; (&lt;code&gt;proyecto=mi-api&lt;/code&gt;) para ver en Cost Explorer cuánto cuesta cada proyecto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apaga lo que no uses&lt;/strong&gt;: un entorno de pruebas encendido todo el mes cuesta lo mismo que el de producción.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Puedo tener todo esto gratis con la capa gratuita?
&lt;/h3&gt;

&lt;p&gt;En parte. La capa gratuita permanente cubre Lambda en el escenario de ejemplo. Para EC2, RDS y otros servicios, las condiciones dependen de cuándo creaste la cuenta: las cuentas nuevas reciben créditos durante los primeros meses en lugar de horas gratuitas. Revisa las condiciones vigentes en la página de la capa gratuita de AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Me sale más barato un VPS fuera de AWS?
&lt;/h3&gt;

&lt;p&gt;Para una sola API pequeña, muchas veces sí: un VPS de otro proveedor puede costar menos que una EC2 con su IP. AWS compensa cuando necesitas sus servicios administrados (bases de datos, colas, autenticación), escalado automático o cumplir requisitos de tu empresa.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Y App Runner o EKS?
&lt;/h3&gt;

&lt;p&gt;EKS (Kubernetes) cobra unos 73 USD al mes solo por el plano de control, antes de cualquier nodo. No tiene sentido para una API sola. App Runner simplifica el despliegue de contenedores, pero revisa su disponibilidad y precio actuales antes de elegirlo para un proyecto nuevo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Graviton es compatible con mi API?
&lt;/h3&gt;

&lt;p&gt;Casi siempre. Java es multiplataforma: el mismo &lt;code&gt;.jar&lt;/code&gt; corre en ARM. Solo revisa las dependencias con código nativo (algunos drivers o librerías de compresión) y usa una imagen base de Docker que tenga versión para ARM.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>springboot</category>
      <category>java</category>
      <category>costos</category>
    </item>
    <item>
      <title>AWS IoT Core: qué es, cómo funciona y cuándo usarlo en tu proyecto</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Sun, 18 Oct 2026 09:22:26 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/aws-iot-core-que-es-como-funciona-y-cuando-usarlo-en-tu-proyecto-6b</link>
      <guid>https://dev.to/stevencarvajal/aws-iot-core-que-es-como-funciona-y-cuando-usarlo-en-tu-proyecto-6b</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/aws-iot-core-que-es" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;AWS IoT Core es el servicio de Amazon Web Services para conectar dispositivos a la nube. En la práctica es un &lt;strong&gt;broker MQTT administrado&lt;/strong&gt; con todo lo que un proyecto serio necesita alrededor: identidad por dispositivo, permisos finos, estado guardado aunque el dispositivo esté apagado y reglas para enviar los datos a otros servicios.&lt;/p&gt;

&lt;p&gt;En esta guía te explico sus piezas, cómo encajan y qué cuesta, con ejemplos prácticos con ESP32.&lt;/p&gt;

&lt;h2&gt;
  
  
  Para qué sirve
&lt;/h2&gt;

&lt;p&gt;Imagina que tienes un ESP32 en casa y quieres controlarlo desde el celular, estés donde estés. Necesitas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;un punto en internet al que el ESP32 se conecte y se mantenga conectado;&lt;/li&gt;
&lt;li&gt;una forma de que solo &lt;strong&gt;tu&lt;/strong&gt; ESP32 pueda conectarse como tal;&lt;/li&gt;
&lt;li&gt;una forma de enviarle órdenes y saber si las cumplió;&lt;/li&gt;
&lt;li&gt;que, si estaba apagado, al volver sepa qué se le pidió.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AWS IoT Core resuelve las cuatro sin que mantengas ningún servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las piezas principales
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pieza&lt;/th&gt;
&lt;th&gt;Qué hace&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Device gateway y broker de mensajes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recibe las conexiones de los dispositivos (MQTT, MQTT sobre WebSocket o HTTPS) y reparte los mensajes por tópicos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Things (registro)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;La representación de cada dispositivo en la nube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Certificados X.509&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;La identidad de cada dispositivo: así se autentica, sin usuario ni contraseña&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Políticas de IoT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Qué puede hacer cada certificado: conectarse con qué nombre, publicar y suscribirse a qué tópicos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Device Shadow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Un documento JSON por dispositivo con el estado deseado y el estado reportado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reglas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Consultas tipo SQL sobre los mensajes para enviarlos a Lambda, DynamoDB, S3 y otros servicios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jobs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tareas para flotas de dispositivos, como actualizaciones de firmware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Device Defender&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auditoría de configuración y detección de comportamientos anómalos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cómo se conecta un dispositivo
&lt;/h2&gt;

&lt;p&gt;Un ESP32 se conecta por &lt;strong&gt;MQTT sobre TLS&lt;/strong&gt; (puerto 8883) al &lt;em&gt;endpoint&lt;/em&gt; de tu cuenta. En lugar de usuario y contraseña, presenta su &lt;strong&gt;certificado X.509&lt;/strong&gt; y su llave privada. AWS comprueba el certificado y aplica la &lt;strong&gt;política&lt;/strong&gt; adjunta.&lt;/p&gt;

&lt;p&gt;Una buena política solo permite lo mínimo: conectarse con su propio nombre y usar los tópicos de su propio Shadow. Nada de &lt;code&gt;"Resource": "*"&lt;/code&gt;, que permitiría a quien robe el certificado publicar en cualquier tópico de tu cuenta.&lt;/p&gt;

&lt;p&gt;El paso a paso completo, con la política mínima y el código para Arduino, está en la parte 3 de la serie de domótica.&lt;/p&gt;

&lt;p&gt;Los navegadores y las apps se conectan de otra forma: por &lt;strong&gt;MQTT sobre WebSocket&lt;/strong&gt; con una URL firmada con &lt;strong&gt;SigV4&lt;/strong&gt;, el esquema de firma de AWS. Las credenciales suelen venir de Cognito, o de una Lambda que firma la URL; lo explico en la parte 10.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Device Shadow: el estado que sobrevive
&lt;/h2&gt;

&lt;p&gt;El &lt;em&gt;Device Shadow&lt;/em&gt; es la pieza que más trabajo ahorra. Es un documento JSON que AWS guarda por cada dispositivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"desired"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"led"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"led"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;desired&lt;/code&gt;&lt;/strong&gt;: lo que la app, un script o un asistente de voz quieren que pase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;reported&lt;/code&gt;&lt;/strong&gt;: lo que el dispositivo confirma que pasó.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuando no coinciden, AWS publica un &lt;strong&gt;&lt;code&gt;delta&lt;/code&gt;&lt;/strong&gt; en un tópico reservado; el dispositivo lo recibe, actúa y reporta. Si estaba desconectado, al volver pide el documento completo y se pone al día. Con tópicos propios, un mensaje enviado mientras el dispositivo estaba apagado simplemente se perdería.&lt;/p&gt;

&lt;p&gt;Los Shadows con nombre permiten separar documentos, por ejemplo el estado de las luces y la configuración (parte 5).&lt;/p&gt;

&lt;h2&gt;
  
  
  Reglas: llevar los datos a otros servicios
&lt;/h2&gt;

&lt;p&gt;Una regla es una consulta tipo SQL sobre los mensajes que llegan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;temperatura&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;humedad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="s1"&gt;'casa/+/sensores'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;temperatura&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y una acción que se ejecuta con cada resultado: invocar una Lambda, guardar en DynamoDB, escribir en S3, enviar a una cola, etc. Sirve para guardar históricos, generar alertas o integrar con otros sistemas sin código en el dispositivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Con qué se combina en un proyecto real
&lt;/h2&gt;

&lt;p&gt;AWS IoT Core rara vez va solo. Lo habitual es combinarlo con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon Cognito&lt;/strong&gt; para el login de los usuarios (parte 11);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DynamoDB&lt;/strong&gt; para dispositivos, configuración y lecturas (parte 7);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda&lt;/strong&gt; para APIs, por ejemplo una de control por voz (parte 8);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Políticas de IoT&lt;/strong&gt; con variables para que cada dispositivo solo acceda a lo suyo (parte 13).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cuánto cuesta
&lt;/h2&gt;

&lt;p&gt;AWS IoT Core cobra por uso, en varias dimensiones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Referencia (us-east-1)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Conexión&lt;/td&gt;
&lt;td&gt;~0,08 USD por millón de minutos conectados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mensajes&lt;/td&gt;
&lt;td&gt;~1 USD por millón de mensajes, medidos en bloques de 5 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device Shadow y registro&lt;/td&gt;
&lt;td&gt;~1,25 USD por millón de operaciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reglas&lt;/td&gt;
&lt;td&gt;Por regla ejecutada y por acción&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Un dispositivo conectado todo el mes son unos 43.200 minutos: menos de medio centavo de dólar. Para un proyecto doméstico el costo es casi nulo; cómo estimarlo para tu proyecto, también para miles de casas, está en la parte 22. Los precios cambian: revisa la página oficial antes de decidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Límites que conviene conocer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Device Shadow:&lt;/strong&gt; 8 KB por documento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mensajes MQTT:&lt;/strong&gt; hasta 128 KB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solicitudes al Shadow:&lt;/strong&gt; existe un límite de solicitudes por segundo por &lt;em&gt;Thing&lt;/em&gt; y otro por cuenta, ampliable a petición. Un hogar normal no se acerca.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conexión por &lt;em&gt;client ID&lt;/em&gt;:&lt;/strong&gt; si dos conexiones usan el mismo &lt;em&gt;client ID&lt;/em&gt;, AWS desconecta la anterior.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Alternativas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Un broker propio&lt;/strong&gt; (Mosquitto, EMQX) en un servidor o un Raspberry Pi: más control y sin costo por mensaje, pero tú gestionas el servidor, la seguridad y la disponibilidad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure IoT Hub&lt;/strong&gt;: el equivalente de Microsoft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home Assistant&lt;/strong&gt; con MQTT local: ideal si solo quieres domótica en tu casa, sin depender de la nube.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google retiró su servicio equivalente, Cloud IoT Core, en 2023.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Necesito AWS IoT Core para controlar un ESP32 por internet?
&lt;/h3&gt;

&lt;p&gt;No es la única forma, pero sí una de las más seguras y sin mantenimiento: identidad por dispositivo, permisos finos y estado guardado sin servidores propios.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa si el dispositivo pierde la conexión?
&lt;/h3&gt;

&lt;p&gt;El Shadow conserva el estado deseado. Al reconectarse, el dispositivo pide el documento y se pone al día. Conviene que lo pida siempre al conectar, en lugar de depender de recibir un &lt;code&gt;delta&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar PubSubClient con AWS IoT Core?
&lt;/h3&gt;

&lt;p&gt;Mucha gente lo hace. En mi caso, con un ESP32-S3, las publicaciones se perdían aunque la librería reportara éxito, y la librería MQTT de 256dpi lo resolvió.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué AWS cierra la conexión de mi dispositivo?
&lt;/h3&gt;

&lt;p&gt;Casi siempre es la política: el dispositivo se conecta con un &lt;em&gt;client ID&lt;/em&gt; no permitido, o publica o se suscribe a un tópico que no tiene autorizado. Suscríbete a &lt;code&gt;$aws/events/presence/#&lt;/code&gt; en el cliente de prueba de la consola para ver cuándo y por qué se desconecta (parte 5).&lt;/p&gt;

&lt;h2&gt;
  
  
  Todos los artículos sobre AWS IoT y serverless
&lt;/h2&gt;



</description>
      <category>awsiotcore</category>
      <category>aws</category>
      <category>mqtt</category>
      <category>deviceshadow</category>
    </item>
    <item>
      <title>Error "was not declared in this scope" con un struct en Arduino: la causa y 4 soluciones</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Sun, 18 Oct 2026 09:21:51 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/error-was-not-declared-in-this-scope-con-un-struct-en-arduino-la-causa-y-4-soluciones-3j2m</link>
      <guid>https://dev.to/stevencarvajal/error-was-not-declared-in-this-scope-con-un-struct-en-arduino-la-causa-y-4-soluciones-3j2m</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/arduino-was-not-declared-in-this-scope-struct" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tienes un &lt;code&gt;struct&lt;/code&gt; definido arriba del sketch, una función que lo recibe como parámetro, y el compilador responde con alguno de estos errores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: 'Sensor' was not declared in this scope
error: variable or field 'leerSensor' declared void
error: 'Sensor' does not name a type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El tipo &lt;strong&gt;está&lt;/strong&gt; declarado. El problema no es tu código, sino algo que el IDE de Arduino hace con los archivos &lt;code&gt;.ino&lt;/code&gt; antes de compilar.&lt;/p&gt;

&lt;h2&gt;
  
  
  La causa: los prototipos automáticos
&lt;/h2&gt;

&lt;p&gt;En C++, una función tiene que estar declarada antes de usarse. Para que no tengas que escribir esas declaraciones (los prototipos), el IDE de Arduino las genera solo: lee el &lt;code&gt;.ino&lt;/code&gt;, encuentra todas tus funciones y escribe sus prototipos en un punto del archivo, &lt;strong&gt;justo antes de la primera definición de función&lt;/strong&gt; que encuentra.&lt;/p&gt;

&lt;p&gt;Si una función usa un tipo tuyo y ese tipo se define &lt;strong&gt;después&lt;/strong&gt; de ese punto, el prototipo generado lo usa antes de que exista. De ahí el error.&lt;/p&gt;

&lt;p&gt;Este sketch falla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Arduino.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;        &lt;span class="c1"&gt;// primera función: aquí se insertan los prototipos&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Sensor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;       &lt;span class="c1"&gt;// el tipo aparece después&lt;/span&gt;
  &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;leerSensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Sensor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;   &lt;span class="c1"&gt;// su prototipo quedó arriba, antes de Sensor&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analogRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  El caso difícil: una macro que es una función
&lt;/h2&gt;

&lt;p&gt;Este me costó más encontrarlo. En el núcleo de Arduino para ESP32, &lt;code&gt;SET_LOOP_TASK_STACK_SIZE()&lt;/code&gt; (la macro para dar más pila a &lt;code&gt;loop()&lt;/code&gt;) &lt;strong&gt;se expande a una definición de función&lt;/strong&gt;. Si la pones antes de un &lt;code&gt;#include&lt;/code&gt; que define tus tipos, el IDE la toma como la primera función e inserta ahí todos los prototipos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="n"&gt;SET_LOOP_TASK_STACK_SIZE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// MAL: se expande a una función&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"tipos.h"&lt;/span&gt;&lt;span class="c1"&gt;                      // define struct Nodo&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;procesar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Nodo&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// error: 'Nodo' was not declared&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visualmente no hay ninguna función antes del &lt;code&gt;#include&lt;/code&gt;, por eso es tan confuso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solución 1: los tipos en un archivo &lt;code&gt;.h&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;La más limpia. Crea una pestaña nueva en el IDE llamada &lt;code&gt;tipos.h&lt;/code&gt;, mueve ahí tus &lt;code&gt;struct&lt;/code&gt; y &lt;code&gt;enum&lt;/code&gt;, e inclúyela &lt;strong&gt;al principio&lt;/strong&gt; del sketch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tipos.h&lt;/span&gt;
&lt;span class="cp"&gt;#pragma once
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Arduino.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Sensor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// sketch.ino&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"tipos.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;leerSensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Sensor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analogRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solución 2: todos los tipos antes de la primera función
&lt;/h2&gt;

&lt;p&gt;Si prefieres un solo archivo, define los tipos arriba del todo, antes de &lt;code&gt;setup()&lt;/code&gt; y de cualquier otra función.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solución 3: las macros que son funciones, después de los &lt;code&gt;#include&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tipos.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="n"&gt;SET_LOOP_TASK_STACK_SIZE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// BIEN: después de todos los #include&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solución 4: escribe tú el prototipo
&lt;/h2&gt;

&lt;p&gt;Si declaras el prototipo a mano después del tipo, el IDE no genera el suyo para esa función:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Sensor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;leerSensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Sensor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// prototipo propio&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo confirmar que es esto
&lt;/h2&gt;

&lt;p&gt;Activa la salida detallada al compilar (&lt;em&gt;Archivo → Preferencias → Mostrar salida detallada durante: compilación&lt;/em&gt;). El IDE muestra la ruta del &lt;code&gt;.cpp&lt;/code&gt; que genera a partir de tu sketch; ábrelo y verás dónde quedaron los prototipos.&lt;/p&gt;

&lt;p&gt;Si el proyecto crece, deja de pelear con esto: pasa la lógica a archivos &lt;code&gt;.cpp&lt;/code&gt; y &lt;code&gt;.h&lt;/code&gt; normales, donde el IDE no genera nada y C++ funciona como siempre. Es lo que hago en el firmware del ESP32 de la guía del ESP32.&lt;/p&gt;

&lt;p&gt;Este error es uno de los 13 errores reales al construir domótica con ESP32 y AWS IoT.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Pasa también con PlatformIO?
&lt;/h3&gt;

&lt;p&gt;No con archivos &lt;code&gt;.cpp&lt;/code&gt;: PlatformIO no genera prototipos y tienes que declararlos tú. Si usas un &lt;code&gt;.ino&lt;/code&gt; en PlatformIO, aplica la misma conversión que el IDE de Arduino.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Y con &lt;code&gt;enum&lt;/code&gt; o &lt;code&gt;typedef&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Igual. Cualquier tipo propio usado en la firma de una función (parámetros o tipo de retorno) puede provocar el error.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué a veces funciona y a veces no?
&lt;/h3&gt;

&lt;p&gt;Depende de dónde quede la primera función. Mover una función de sitio, añadir una macro o reordenar los &lt;code&gt;#include&lt;/code&gt; cambia el punto de inserción, y el mismo código pasa de compilar a fallar.&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>esp32</category>
      <category>problemas</category>
      <category>c</category>
    </item>
    <item>
      <title>ESP-NOW, Wi-Fi, Bluetooth o MQTT: cómo comunicar tus dispositivos ESP32</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Sat, 17 Oct 2026 09:03:12 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/esp-now-wi-fi-bluetooth-o-mqtt-como-comunicar-tus-dispositivos-esp32-nf6</link>
      <guid>https://dev.to/stevencarvajal/esp-now-wi-fi-bluetooth-o-mqtt-como-comunicar-tus-dispositivos-esp32-nf6</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/esp-now-wifi-ble-mqtt-comparativa" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una de las primeras decisiones de un proyecto con varios ESP32 es &lt;strong&gt;cómo van a hablar entre ellos y con el mundo&lt;/strong&gt;. Cada uno a internet por Wi-Fi, todos a un servidor por MQTT, entre ellos por ESP-NOW o por Bluetooth con el celular. La elección cambia el costo, el consumo, la fiabilidad y la complejidad de todo lo demás.&lt;/p&gt;

&lt;p&gt;En esta guía te explico las opciones, qué es cada una y cuándo conviene, con ejemplos de cómo se combinan en un proyecto de domótica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dos preguntas distintas
&lt;/h2&gt;

&lt;p&gt;Antes de comparar, separa dos cosas que suelen mezclarse:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;El medio&lt;/strong&gt;: cómo viajan los bits por el aire. Wi-Fi, ESP-NOW, Bluetooth LE, Thread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El protocolo de mensajes&lt;/strong&gt;: cómo se organizan los mensajes encima de ese medio. MQTT, HTTP, WebSocket o un formato propio.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MQTT no compite con ESP-NOW: MQTT funciona &lt;strong&gt;encima&lt;/strong&gt; de una conexión de red (TCP/IP), normalmente por Wi-Fi. ESP-NOW es un medio con su propio formato de paquetes, sin TCP/IP. Por eso se pueden combinar, como verás más abajo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wi-Fi: para llegar a internet
&lt;/h2&gt;

&lt;p&gt;El ESP32 se conecta a tu router como cualquier dispositivo. A partir de ahí puede hacer peticiones HTTP, abrir conexiones MQTT o WebSocket y hablar con cualquier servicio en la nube.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A favor:&lt;/strong&gt; llega a internet; usa protocolos estándar; el alcance es el de tu red.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;En contra:&lt;/strong&gt; cada dispositivo necesita la contraseña de la red y ocupa un lugar en el router; conectar y mantener la conexión consume bastante energía; si usas TLS, cada conexión consume memoria.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ESP-NOW: de ESP32 a ESP32, sin router
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ESP-NOW&lt;/strong&gt; es un protocolo de Espressif para enviar mensajes cortos directamente entre ESP32, usando la radio Wi-Fi pero &lt;strong&gt;sin conectarse a ninguna red&lt;/strong&gt;. Cada dispositivo se identifica por su dirección MAC.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A favor:&lt;/strong&gt; no necesita router ni contraseña; latencia de milisegundos; consumo bajo porque no hay conexión que mantener; funciona aunque se caiga el Wi-Fi de la casa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;En contra:&lt;/strong&gt; mensajes pequeños (250 bytes en la versión clásica); no garantiza la entrega, así que tienes que construir la confirmación; solo entre chips de Espressif; todos tienen que estar en el &lt;strong&gt;mismo canal de radio&lt;/strong&gt;; máximo &lt;strong&gt;20 dispositivos emparejados&lt;/strong&gt; por cada ESP32 (menos si usas cifrado).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El detalle del canal es el que más problemas da: si un ESP32 está conectado al router, su canal es el del router, y los demás tienen que usar el mismo. Lo más simple es fijar el canal del router y usarlo en todos los nodos. Las opciones y el código completo, con confirmaciones, están en la parte 4 de la serie de domótica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bluetooth LE: para el celular y los sensores cercanos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bluetooth Low Energy&lt;/strong&gt; está pensado para intercambiar datos pequeños con muy bajo consumo a corta distancia.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A favor:&lt;/strong&gt; habla directamente con el celular, sin apps de red ni router; ideal para configurar un dispositivo o leer sensores con batería.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;En contra:&lt;/strong&gt; alcance corto; para llegar a internet necesitas un intermediario (el celular o una pasarela); programar servicios y características BLE lleva su trabajo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MQTT: mensajes por tópicos a través de un broker
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MQTT&lt;/strong&gt; es un protocolo de mensajería ligero que funciona sobre TCP/IP. En lugar de hablarse directamente, los dispositivos se conectan a un &lt;strong&gt;broker&lt;/strong&gt; (un servidor intermediario) y:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;publican&lt;/strong&gt; mensajes en un &lt;strong&gt;tópico&lt;/strong&gt;, por ejemplo &lt;code&gt;casa/sala/luz&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;se &lt;strong&gt;suscriben&lt;/strong&gt; a los tópicos que les interesan y reciben lo que otros publican.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tres conceptos que conviene conocer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QoS&lt;/strong&gt; (calidad de servicio): &lt;code&gt;0&lt;/code&gt; envía una vez sin confirmar; &lt;code&gt;1&lt;/code&gt; garantiza que llega al menos una vez; &lt;code&gt;2&lt;/code&gt;, exactamente una vez.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mensaje retenido&lt;/strong&gt;: el broker guarda el último mensaje de un tópico y se lo entrega a quien se suscriba después.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Última voluntad (LWT)&lt;/strong&gt;: un mensaje que el broker publica si el dispositivo se desconecta sin avisar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como broker puedes usar uno propio (por ejemplo, Mosquitto en un Raspberry Pi) o uno administrado en la nube. Un ejemplo administrado es &lt;strong&gt;AWS IoT Core&lt;/strong&gt;, que además guarda el estado de cada dispositivo en un documento llamado &lt;em&gt;Device Shadow&lt;/em&gt;. Lo explico en la parte 3 y en la guía de AWS IoT Core de este blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparación rápida
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Wi-Fi + HTTP/MQTT&lt;/th&gt;
&lt;th&gt;ESP-NOW&lt;/th&gt;
&lt;th&gt;Bluetooth LE&lt;/th&gt;
&lt;th&gt;MQTT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qué es&lt;/td&gt;
&lt;td&gt;Medio + protocolos de internet&lt;/td&gt;
&lt;td&gt;Medio con protocolo propio&lt;/td&gt;
&lt;td&gt;Medio + protocolo&lt;/td&gt;
&lt;td&gt;Protocolo de mensajes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;¿Necesita router?&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Necesita red y un broker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;¿Llega a internet?&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Solo con intermediario&lt;/td&gt;
&lt;td&gt;Si el broker está en internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latencia&lt;/td&gt;
&lt;td&gt;Decenas de ms&lt;/td&gt;
&lt;td&gt;Pocos ms&lt;/td&gt;
&lt;td&gt;Decenas de ms&lt;/td&gt;
&lt;td&gt;Depende de la red y del broker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tamaño de mensaje&lt;/td&gt;
&lt;td&gt;Grande&lt;/td&gt;
&lt;td&gt;Pequeño&lt;/td&gt;
&lt;td&gt;Pequeño&lt;/td&gt;
&lt;td&gt;Grande&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consumo&lt;/td&gt;
&lt;td&gt;Alto&lt;/td&gt;
&lt;td&gt;Bajo&lt;/td&gt;
&lt;td&gt;Muy bajo&lt;/td&gt;
&lt;td&gt;El de la red debajo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entrega garantizada&lt;/td&gt;
&lt;td&gt;Con TCP&lt;/td&gt;
&lt;td&gt;No: hay que construirla&lt;/td&gt;
&lt;td&gt;Según el modo&lt;/td&gt;
&lt;td&gt;Con QoS 1 o 2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Un patrón muy usado: la pasarela
&lt;/h2&gt;

&lt;p&gt;En una casa con muchas luces, conectar cada ESP32 al Wi-Fi y a la nube es caro y frágil: cada uno necesita su certificado, su conexión TLS permanente y su lugar en el router. La alternativa es una &lt;strong&gt;pasarela&lt;/strong&gt; (&lt;em&gt;gateway&lt;/em&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Un solo ESP32&lt;/strong&gt; (por ejemplo, un ESP32-S3) se conecta al Wi-Fi y a la nube por &lt;strong&gt;MQTT sobre TLS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El resto&lt;/strong&gt; (ESP32-C3) hablan con él por &lt;strong&gt;ESP-NOW&lt;/strong&gt;, sin Wi-Fi ni certificados.&lt;/li&gt;
&lt;li&gt;La pasarela traduce: recibe el estado deseado por MQTT y reparte órdenes cortas por ESP-NOW; recoge las confirmaciones y las publica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Las ventajas son grandes: una sola conexión con la nube por casa, un solo certificado, costo en la nube que no crece con cada luz y nodos que siguen funcionando entre ellos si se cae internet. Las dos arquitecturas están comparadas en la parte 1 de la serie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo elegir
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Un solo dispositivo que habla con la nube:&lt;/strong&gt; Wi-Fi + MQTT (o HTTP si solo envía datos de vez en cuando).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Muchos dispositivos en un mismo lugar:&lt;/strong&gt; pasarela con Wi-Fi + MQTT, y ESP-NOW para el resto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dispositivos con batería que envían poco:&lt;/strong&gt; ESP-NOW o BLE hacia una pasarela; evita mantener Wi-Fi activo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuración desde el celular:&lt;/strong&gt; BLE, o un punto de acceso Wi-Fi temporal con un formulario web (lo explico en la parte 16).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compatibilidad con ecosistemas de domótica:&lt;/strong&gt; Thread y Matter, con un ESP32-C6 o H2.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar ESP-NOW y Wi-Fi al mismo tiempo?
&lt;/h3&gt;

&lt;p&gt;Sí, en el mismo ESP32, siempre que los demás dispositivos de ESP-NOW estén en el canal del router. Es lo que hace una pasarela típica.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿MQTT o HTTP?
&lt;/h3&gt;

&lt;p&gt;MQTT si el dispositivo tiene que &lt;strong&gt;recibir&lt;/strong&gt; órdenes en tiempo real o envía datos con frecuencia: la conexión queda abierta y los mensajes son ligeros. HTTP si solo envía algo de vez en cuando y no necesita escuchar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿ESP-NOW es seguro?
&lt;/h3&gt;

&lt;p&gt;Admite cifrado con una clave compartida entre los dispositivos emparejados. Sin cifrado, cualquiera cerca podría escuchar los mensajes, así que valida siempre de quién viene cada mensaje (por su MAC) y no envíes datos sensibles sin cifrar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué alcance tiene ESP-NOW?
&lt;/h3&gt;

&lt;p&gt;El mismo orden que el Wi-Fi de las placas, porque usa la misma radio: varias habitaciones en una casa normal. Las paredes gruesas, la antena de cada placa y las interferencias lo reducen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todos los artículos sobre ESP-NOW y MQTT
&lt;/h2&gt;



</description>
      <category>espnow</category>
      <category>mqtt</category>
      <category>esp32</category>
      <category>wifi</category>
    </item>
    <item>
      <title>Cómo aprobar el AWS Cloud Practitioner (CLF-C02): plan de estudio y recursos</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Sat, 17 Oct 2026 09:02:36 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/como-aprobar-el-aws-cloud-practitioner-clf-c02-plan-de-estudio-y-recursos-4hf9</link>
      <guid>https://dev.to/stevencarvajal/como-aprobar-el-aws-cloud-practitioner-clf-c02-plan-de-estudio-y-recursos-4hf9</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/aws-cloud-practitioner-como-aprobar" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;La &lt;strong&gt;AWS Certified Cloud Practitioner&lt;/strong&gt; es la puerta de entrada a las certificaciones de AWS. No exige experiencia previa en la nube y es la que más se recomienda para empezar, tanto si eres desarrollador como si trabajas en ventas, gestión o soporte.&lt;/p&gt;

&lt;p&gt;Yo la aprobé en 2025, trabajando como desarrollador backend con Java y Spring Boot. Esta guía resume cómo es el examen, qué estudiar, un plan de cuatro semanas y los errores que más cuestan puntos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antes de empezar:&lt;/strong&gt; AWS actualiza sus exámenes y sus precios. Los datos de esta guía corresponden a la versión &lt;strong&gt;CLF-C02&lt;/strong&gt;. Antes de reservar, revisa la guía oficial del examen en la página de la certificación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo es el examen
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;CLF-C02&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Preguntas&lt;/td&gt;
&lt;td&gt;65: 50 puntúan y 15 son de prueba (no sabes cuáles)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tipo&lt;/td&gt;
&lt;td&gt;Opción múltiple (una correcta) y respuesta múltiple (dos o más correctas)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duración&lt;/td&gt;
&lt;td&gt;90 minutos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puntaje para aprobar&lt;/td&gt;
&lt;td&gt;700 sobre 1000 (escala)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Costo&lt;/td&gt;
&lt;td&gt;100 USD más impuestos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dónde&lt;/td&gt;
&lt;td&gt;Centro de examen de Pearson VUE o en línea desde casa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idiomas&lt;/td&gt;
&lt;td&gt;Inglés, español y otros&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vigencia&lt;/td&gt;
&lt;td&gt;3 años&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dos detalles que cambian la estrategia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Las respuestas incorrectas no restan.&lt;/strong&gt; Nunca dejes una pregunta en blanco.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El puntaje es compensatorio.&lt;/strong&gt; No necesitas aprobar cada dominio por separado: cuenta el total.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Los cuatro dominios y su peso
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dominio&lt;/th&gt;
&lt;th&gt;Peso&lt;/th&gt;
&lt;th&gt;Qué preguntan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Conceptos de la nube&lt;/td&gt;
&lt;td&gt;24 %&lt;/td&gt;
&lt;td&gt;Beneficios de la nube, Well-Architected Framework, estrategias de migración, economía de la nube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Seguridad y cumplimiento&lt;/td&gt;
&lt;td&gt;30 %&lt;/td&gt;
&lt;td&gt;Modelo de responsabilidad compartida, IAM, servicios de seguridad, cumplimiento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Tecnología y servicios&lt;/td&gt;
&lt;td&gt;34 %&lt;/td&gt;
&lt;td&gt;Formas de desplegar, infraestructura global, cómputo, bases de datos, redes, almacenamiento, IA y análisis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Facturación, precios y soporte&lt;/td&gt;
&lt;td&gt;12 %&lt;/td&gt;
&lt;td&gt;Modelos de precio, herramientas de costos, planes de soporte&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seguridad y servicios suman casi dos tercios del examen. Si tienes poco tiempo, empieza por ahí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué estudiar en cada dominio
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Conceptos de la nube
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ventajas de la nube&lt;/strong&gt;: cambiar gasto de capital por gasto variable, economías de escala, dejar de adivinar la capacidad, velocidad y alcance global.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Well-Architected Framework&lt;/strong&gt;: sus seis pilares. Son excelencia operativa, seguridad, fiabilidad, eficiencia del rendimiento, optimización de costos y sostenibilidad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Cloud Adoption Framework (CAF)&lt;/strong&gt;: sus seis perspectivas. Son negocio, personas, gobernanza, plataforma, seguridad y operaciones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estrategias de migración (las 7 R)&lt;/strong&gt;: rehost, replatform, refactor, repurchase, retire, retain y relocate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Seguridad y cumplimiento
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modelo de responsabilidad compartida.&lt;/strong&gt; Es la pregunta más segura del examen. AWS es responsable de la seguridad &lt;em&gt;de&lt;/em&gt; la nube: hardware, centros de datos y la red global. Tú eres responsable de la seguridad &lt;em&gt;en&lt;/em&gt; la nube: tus datos, IAM, el sistema operativo de tus EC2 y la configuración de red. En los servicios administrados (RDS, Lambda) AWS asume más partes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM&lt;/strong&gt;: usuarios, grupos, roles y políticas; el principio de mínimo privilegio; MFA; no usar la cuenta raíz para el día a día.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Servicios de seguridad&lt;/strong&gt;: qué hace cada uno (ver la tabla de confusiones más abajo).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Artifact&lt;/strong&gt;: dónde se descargan los informes de cumplimiento de AWS (ISO, SOC, PCI).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Tecnología y servicios
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Infraestructura global&lt;/strong&gt;: Regiones, Zonas de Disponibilidad y ubicaciones de borde (CloudFront).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cómputo&lt;/strong&gt;: EC2 y sus familias, Auto Scaling, Elastic Load Balancing, Lambda, ECS/EKS, Fargate, Elastic Beanstalk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Almacenamiento&lt;/strong&gt;: S3 y sus clases (Standard, Intelligent-Tiering, Standard-IA, Glacier), EBS, EFS, la familia Snow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bases de datos&lt;/strong&gt;: RDS, Aurora, DynamoDB, ElastiCache, Redshift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redes&lt;/strong&gt;: VPC, subredes, grupos de seguridad, Route 53, CloudFront, Direct Connect, VPN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formas de desplegar&lt;/strong&gt;: consola, CLI, SDK, CloudFormation (infraestructura como código).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No hace falta saber configurar cada servicio. Basta con saber &lt;strong&gt;para qué sirve&lt;/strong&gt; y &lt;strong&gt;cuándo elegirlo&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Facturación, precios y soporte
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modelos de compra de EC2&lt;/strong&gt;: On-Demand, Savings Plans, instancias reservadas, instancias de spot y hosts dedicados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Herramientas&lt;/strong&gt;: AWS Pricing Calculator, Cost Explorer, Budgets, Cost and Usage Report y la facturación consolidada de AWS Organizations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planes de soporte&lt;/strong&gt;: Basic, Developer, Business, Enterprise On-Ramp y Enterprise. Aprende qué incluye cada uno: tiempos de respuesta, acceso completo a Trusted Advisor y el gestor técnico de cuenta (TAM).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Plan de estudio de 4 semanas
&lt;/h2&gt;

&lt;p&gt;Con &lt;strong&gt;una hora al día&lt;/strong&gt;, cuatro semanas son suficientes para alguien sin experiencia en AWS. Si ya trabajas con AWS, dos semanas bastan: salta directo a los exámenes de práctica.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Semana&lt;/th&gt;
&lt;th&gt;Qué hacer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Curso gratuito &lt;strong&gt;AWS Cloud Practitioner Essentials&lt;/strong&gt; (AWS Skill Builder). Leer la guía oficial del examen completa.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Seguridad y servicios: responsabilidad compartida, IAM y los servicios de cómputo, almacenamiento, bases de datos y redes. Crear una cuenta y probar la consola: un bucket de S3, un usuario de IAM con MFA y una alerta de presupuesto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Facturación y soporte. Primer examen de práctica completo, cronometrado. Repasar &lt;strong&gt;cada&lt;/strong&gt; pregunta fallada y también las acertadas por intuición.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Dos o tres exámenes de práctica más. Repasar las confusiones típicas. Reservar el examen cuando aciertes de forma estable por encima del 80 %.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;La clave es el repaso, no el número de exámenes.&lt;/strong&gt; De cada pregunta fallada anota por qué la respuesta correcta es correcta y por qué cada distractor no lo es. Esa lista es tu material de la última semana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gratuitos y oficiales:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Guía del examen&lt;/strong&gt; (página de la certificación): la lista exacta de temas y servicios que entran.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Cloud Practitioner Essentials&lt;/strong&gt; en AWS Skill Builder: el curso base, con español disponible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Official Practice Question Set&lt;/strong&gt; en Skill Builder: 20 preguntas con el estilo real del examen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whitepapers&lt;/strong&gt;: &lt;em&gt;Overview of Amazon Web Services&lt;/em&gt; y el resumen del &lt;em&gt;Well-Architected Framework&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Una cuenta de AWS para practicar.&lt;/strong&gt; Configura una alerta en AWS Budgets el primer día; lo explico en cuánto cuesta desplegar una API en AWS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;De pago:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exámenes de práctica completos&lt;/strong&gt; (Udemy, Tutorials Dojo y otros). Son lo que más ayuda en la recta final, porque los gratuitos se acaban rápido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursos en video&lt;/strong&gt; en Udemy o Platzi, si prefieres una explicación guiada a leer documentación.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Los servicios que más se confunden
&lt;/h2&gt;

&lt;p&gt;Muchas preguntas ponen dos servicios parecidos como opciones. Estos son los pares que más puntos cuestan:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Si la pregunta habla de...&lt;/th&gt;
&lt;th&gt;Es...&lt;/th&gt;
&lt;th&gt;No confundir con...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Quién hizo qué llamada a la API&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudWatch (métricas, logs y alarmas)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historial de configuración de recursos y reglas de cumplimiento&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudTrail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recomendaciones de costos, seguridad y límites de tu cuenta&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Trusted Advisor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inspector (vulnerabilidades en EC2, contenedores y Lambda)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detección de amenazas analizando logs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GuardDuty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inspector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protección contra DDoS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Shield&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WAF (filtra peticiones HTTP: inyección SQL, XSS, IPs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datos sensibles (PII) en S3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Macie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GuardDuty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall a nivel de instancia, con estado&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Grupo de seguridad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network ACL (a nivel de subred, sin estado)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estimar el costo de algo que aún no existe&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pricing Calculator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cost Explorer (analiza lo que ya gastaste)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avisar cuando el gasto pase un umbral&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Budgets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cost Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ahorro en EC2 con cargas que pueden interrumpirse&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Spot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Savings Plans (compromiso de 1 o 3 años)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una factura para varias cuentas&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Organizations&lt;/strong&gt; (facturación consolidada)&lt;/td&gt;
&lt;td&gt;Control Tower (configura un entorno multicuenta gobernado)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Informes de cumplimiento de AWS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Artifact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Config&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  El día del examen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;En línea desde casa&lt;/strong&gt;: necesitas una habitación cerrada, el escritorio despejado, cámara y un documento de identidad vigente. Haz el &lt;em&gt;system test&lt;/em&gt; de Pearson VUE días antes y conéctate 30 minutos antes de la hora.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Si lo presentas en inglés y no es tu idioma nativo&lt;/strong&gt;, puedes pedir la adaptación &lt;strong&gt;ESL +30&lt;/strong&gt;: 30 minutos extra. Se solicita en tu cuenta de certificación &lt;strong&gt;antes&lt;/strong&gt; de reservar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marca para revisar&lt;/strong&gt; las preguntas dudosas y sigue adelante: con 90 minutos para 65 preguntas sobra tiempo para volver.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Descarta primero.&lt;/strong&gt; En casi todas las preguntas hay dos opciones claramente incorrectas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fíjate en las palabras clave&lt;/strong&gt;: "más rentable", "menos esfuerzo operativo", "administrado", "alta disponibilidad". Suelen decidir entre las dos opciones que quedan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Después de aprobar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Recibes una &lt;strong&gt;insignia digital&lt;/strong&gt; que puedes poner en LinkedIn y en tu CV.&lt;/li&gt;
&lt;li&gt;AWS te da un &lt;strong&gt;cupón del 50 %&lt;/strong&gt; para tu siguiente examen.&lt;/li&gt;
&lt;li&gt;El siguiente paso habitual es &lt;strong&gt;Solutions Architect Associate&lt;/strong&gt; (arquitectura) o &lt;strong&gt;Developer Associate&lt;/strong&gt; (si programas aplicaciones). Para un desarrollador backend que despliega APIs, cualquiera de las dos es una buena continuación.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Vale la pena si ya soy desarrollador?
&lt;/h3&gt;

&lt;p&gt;Sí, aunque sea fácil para ti. Te da el vocabulario común de AWS, te obliga a entender la facturación (lo que más sorprende al pasar a la nube) y es una señal clara en un CV. Además, el cupón del 50 % abarata la Associate.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito saber programar?
&lt;/h3&gt;

&lt;p&gt;No. El examen no tiene código. Pregunta para qué sirve cada servicio, cómo se cobra y quién es responsable de qué.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Lo presento en español o en inglés?
&lt;/h3&gt;

&lt;p&gt;En el idioma en que estudiaste. Si estudiaste con material en inglés, preséntalo en inglés y pide la adaptación ESL +30: los nombres de los servicios no cambian, y te ahorras traducir mentalmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto tiempo dura la certificación?
&lt;/h3&gt;

&lt;p&gt;Tres años. Para renovarla puedes volver a presentarla o aprobar una certificación de nivel superior: según la política actual de AWS, una Associate renueva automáticamente la Cloud Practitioner.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa si no apruebo?
&lt;/h3&gt;

&lt;p&gt;Puedes volver a presentarla pasados 14 días, pagando de nuevo. El informe de resultados muestra tu desempeño por dominio: úsalo para saber qué repasar.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>certificacionaws</category>
      <category>cloudpractitioner</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
