<?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-S3 vs ESP32-C3: cuál elegir según el papel del dispositivo</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Sun, 04 Oct 2026 10:55:16 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/esp32-s3-vs-esp32-c3-cual-elegir-segun-el-papel-del-dispositivo-5f1p</link>
      <guid>https://dev.to/stevencarvajal/esp32-s3-vs-esp32-c3-cual-elegir-segun-el-papel-del-dispositivo-5f1p</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/esp32-s3-vs-esp32-c3" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;, como parte 2 de la serie "Domótica con ESP32 y AWS desde cero".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"¿ESP32-S3 o ESP32-C3?" es de las primeras preguntas de cualquier proyecto con ESP32. La respuesta de las fichas técnicas (el S3 es más potente, el C3 más barato) no ayuda a decidir. Lo que ayuda es saber &lt;strong&gt;qué va a hacer cada placa.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En el proyecto de ejemplo de esta serie hay dos papeles: un &lt;strong&gt;hub&lt;/strong&gt; que habla con la nube y varios &lt;strong&gt;nodos&lt;/strong&gt; que mueven relés o leen sensores (parte 1). En esta parte vemos qué chip encaja en cada uno y qué detalles de estas placas hacen perder tiempo.&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%2Fx67dz5c9sfnkqjnrmiki.jpg" 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%2Fx67dz5c9sfnkqjnrmiki.jpg" alt="Un ESP32-S3 Super Mini arriba y dos ESP32-C3 Super Mini abajo" width="760" height="995"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Arriba, un ESP32-S3; abajo, dos ESP32-C3. Por fuera casi no se distinguen: la diferencia está en el chip.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Las 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-S3&lt;/th&gt;
&lt;th&gt;ESP32-C3&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;2 núcleos Xtensa LX7, hasta 240 MHz&lt;/td&gt;
&lt;td&gt;1 núcleo RISC-V, hasta 160 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRAM interna&lt;/td&gt;
&lt;td&gt;512 KB&lt;/td&gt;
&lt;td&gt;400 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSRAM&lt;/td&gt;
&lt;td&gt;Opcional, según el módulo&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Radio&lt;/td&gt;
&lt;td&gt;Wi-Fi 4 (2,4 GHz) + Bluetooth LE 5&lt;/td&gt;
&lt;td&gt;Wi-Fi 4 (2,4 GHz) + Bluetooth LE 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ESP-NOW&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB&lt;/td&gt;
&lt;td&gt;USB OTG + USB-Serial/JTAG&lt;/td&gt;
&lt;td&gt;USB-Serial/JTAG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precio&lt;/td&gt;
&lt;td&gt;Más caro&lt;/td&gt;
&lt;td&gt;Más barato&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Los dos hablan Wi-Fi y ESP-NOW, y el mismo código de Arduino compila para ambos casi sin cambios. La diferencia real está en &lt;strong&gt;cuánto trabajo aguantan a la vez.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Un hub hace muchas cosas a la vez
&lt;/h2&gt;

&lt;p&gt;Un dispositivo que hace de puente con la nube suele, al mismo tiempo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mantener una conexión &lt;strong&gt;TLS&lt;/strong&gt; con el &lt;em&gt;broker&lt;/em&gt;, con su certificado X.509;&lt;/li&gt;
&lt;li&gt;hablar &lt;strong&gt;MQTT&lt;/strong&gt; y procesar documentos &lt;strong&gt;JSON&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;enviar órdenes por &lt;strong&gt;ESP-NOW&lt;/strong&gt; y esperar confirmaciones;&lt;/li&gt;
&lt;li&gt;levantar un &lt;strong&gt;portal web&lt;/strong&gt; para configurarlo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TLS es lo que más memoria consume: cada conexión segura reserva varias decenas de KB para sus &lt;em&gt;buffers&lt;/em&gt;. Sumado al resto, un chip con más RAM y dos núcleos da margen para crecer sin pelear con la memoria.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un nodo hace una sola cosa
&lt;/h2&gt;

&lt;p&gt;Un nodo que recibe una orden corta por ESP-NOW, mueve un relé y vigila un interruptor apenas usa recursos. Ahí el C3 sobra, y como el nodo se repite en cada habitación, el precio por unidad importa.&lt;/p&gt;

&lt;p&gt;Con esa división, la decisión es casi obvia: &lt;strong&gt;el trabajo pesado en el chip con más margen, el trabajo simple en el más barato.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Y un C3 como hub?
&lt;/h2&gt;

&lt;p&gt;Funciona. Un ESP32-C3 puede conectarse a AWS IoT Core con TLS y MQTT sin problema. Lo que pasa es que queda con menos margen cuando le sumas más tareas. Dos ajustes habituales si lo intentas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ampliar el &lt;em&gt;stack&lt;/em&gt; de la tarea &lt;code&gt;loop&lt;/code&gt;&lt;/strong&gt; de Arduino si ves reinicios con &lt;code&gt;Stack canary watchpoint triggered&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&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;// fuera de cualquier función&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vigilar la RAM libre&lt;/strong&gt; después de conectar TLS y MQTT, con el sketch de la sección siguiente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si un error de conexión aparece solo en el C3, revisa primero los permisos y la configuración: es fácil culpar a la memoria cuando el problema está en otro lado. Los errores típicos de conexión con AWS están en la parte 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mide tu placa antes de decidir
&lt;/h2&gt;

&lt;p&gt;Este sketch te dice qué chip tienes, cuánta RAM libre le queda y su MAC, que es la que necesitarás para ESP-NOW. Compila igual para S3 y C3:&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;// Muestra qué chip tienes y cuánta memoria le queda libre.&lt;/span&gt;
&lt;span class="c1"&gt;// Compila igual para ESP32-S3 y ESP32-C3.&lt;/span&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="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;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// da tiempo a abrir el Monitor Serie (USB nativo)&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;"Chip: %s (revisión %d)&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;ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getChipModel&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getChipRevision&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;"Núcleos: %d a %lu MHz&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;ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getChipCores&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getCpuFreqMHz&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;"Flash: %lu KB&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;ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFlashChipSize&lt;/span&gt;&lt;span class="p"&gt;()&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="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;"RAM libre: %lu KB (bloque más grande: %lu KB)&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;ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFreeHeap&lt;/span&gt;&lt;span class="p"&gt;()&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="n"&gt;ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getMaxAllocHeap&lt;/span&gt;&lt;span class="p"&gt;()&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="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;"PSRAM: %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;psramFound&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"sí"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WIFI_STA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// la MAC de modo estación es la que usa ESP-NOW&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;"MAC: %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;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;macAddress&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="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="c1"&gt;// Útil después de conectar Wi-Fi, TLS y MQTT: si este número baja&lt;/span&gt;
  &lt;span class="c1"&gt;// sin parar, tienes una fuga de memoria.&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;"RAM libre: %lu KB&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;ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFreeHeap&lt;/span&gt;&lt;span class="p"&gt;()&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="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&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;El truco es copiar el &lt;code&gt;printf&lt;/code&gt; del &lt;code&gt;loop&lt;/code&gt; en tu firmware. Si después de conectar TLS y MQTT la RAM libre queda muy baja, o baja sin parar, esa placa se va a quedar corta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detalles de las placas Super Mini que hacen perder tiempo
&lt;/h2&gt;

&lt;p&gt;Las versiones "Super Mini" de ambos chips son pequeñas, con USB-C y baratas. Estos detalles no vienen en ninguna ficha técnica:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El LED del ESP32-C3 Super Mini está en el GPIO 8 y funciona al revés.&lt;/strong&gt; Se enciende con &lt;code&gt;LOW&lt;/code&gt; y se apaga con &lt;code&gt;HIGH&lt;/code&gt;. No es un LED RGB: la librería NeoPixel no hace nada con él.&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;#define STATUS_LED_PIN 8
&lt;/span&gt;
&lt;span class="c1"&gt;// Activo en bajo: LOW enciende, HIGH apaga&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setStatusLed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;STATUS_LED_PIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;HIGH&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;strong&gt;El ESP32-S3 Super Mini trae un LED RGB direccionable en el GPIO 48.&lt;/strong&gt; No se controla con &lt;code&gt;digitalWrite&lt;/code&gt;: necesitas una librería como Adafruit NeoPixel. Es útil como indicador de estado, por ejemplo verde cuando está conectado a la nube.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cuidado con los pines de arranque del C3.&lt;/strong&gt; Los GPIO 2, 8 y 9 influyen en cómo arranca el chip. Para un botón o un interruptor, un pin libre como el &lt;strong&gt;GPIO 10&lt;/strong&gt; con &lt;code&gt;INPUT_PULLUP&lt;/code&gt; y el otro cable a tierra funciona sin resistencia externa.&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%2Fjuxs42496r48h8m20j9t.jpg" 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%2Fjuxs42496r48h8m20j9t.jpg" alt="Cara trasera del ESP32-C3 Super Mini con la serigrafía de los pines: 5V, G, 3.3 y GPIO 0 a 10, 20 y 21" width="800" height="972"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;El ESP32-C3 Super Mini por detrás. El GPIO 10 está a la derecha; el 8 y el 9, justo encima, son pines de arranque.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El Monitor Serie puede quedarse en blanco.&lt;/strong&gt; Estas placas usan el USB nativo del chip (USB-Serial/JTAG), no un conversor USB-serie aparte. En Arduino IDE activa &lt;strong&gt;Tools → USB CDC On Boot → Enabled&lt;/strong&gt;, o no verás nada. Y al reiniciar el chip se reinicia también el USB, así que los primeros mensajes se pueden perder: por eso el &lt;code&gt;delay(2000)&lt;/code&gt; del sketch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La MAC la puedes leer al flashear.&lt;/strong&gt; &lt;code&gt;esptool&lt;/code&gt; la imprime al conectarse durante la carga. Viene grabada de fábrica y es la misma que usa ESP-NOW.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo elegir cada uno
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Elige un ESP32-S3 si el dispositivo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mantiene una conexión TLS permanente (AWS IoT, HTTPS, MQTT seguro);&lt;/li&gt;
&lt;li&gt;hace varias cosas a la vez (red, servidor web, procesamiento de JSON);&lt;/li&gt;
&lt;li&gt;puede crecer: voz local, cámara, pantalla o aprendizaje automático.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Elige un ESP32-C3 si el dispositivo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hace una sola tarea simple (un relé, un sensor);&lt;/li&gt;
&lt;li&gt;se comunica por ESP-NOW o Bluetooth, sin TLS;&lt;/li&gt;
&lt;li&gt;se repite muchas veces en el proyecto y el precio por unidad importa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dónde comprarlas
&lt;/h2&gt;

&lt;p&gt;Revisa en la ficha que diga &lt;strong&gt;Super Mini&lt;/strong&gt; y el chip correcto, porque hay versiones muy parecidas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ESP32-S3 Super Mini&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ESP32-C3 Super Mini&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  ¿El mismo código funciona en los dos?
&lt;/h3&gt;

&lt;p&gt;Casi siempre. Lo que cambia son los pines (LED, botones) y el margen de memoria.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El ESP32-C3 puede conectarse a AWS IoT Core?
&lt;/h3&gt;

&lt;p&gt;Sí, con TLS y MQTT. Lo que no conviene es cargarlo con muchas tareas más si quieres margen para crecer.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Y el ESP32 clásico?
&lt;/h3&gt;

&lt;p&gt;También sirve como hub: tiene dos núcleos y Wi-Fi. El S3 es más nuevo, y la versión Super Mini es muy compacta y trae USB nativo. Si ya tienes un ESP32 clásico, úsalo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuántos nodos puede manejar un hub por ESP-NOW?
&lt;/h3&gt;

&lt;p&gt;Hasta 20 &lt;em&gt;peers&lt;/em&gt; registrados a la vez. Es un límite del SDK de Espressif, no de la RAM. En la parte 4 explico cómo funciona la comunicación entre placas.&lt;/p&gt;

</description>
      <category>esp32</category>
      <category>esp32s3</category>
      <category>esp32c3</category>
      <category>hardware</category>
    </item>
    <item>
      <title>Arquitectura de una casa inteligente con ESP32 y AWS: las piezas y cómo encajan</title>
      <dc:creator>Steven Carvajal</dc:creator>
      <pubDate>Sat, 03 Oct 2026 10:14:39 +0000</pubDate>
      <link>https://dev.to/stevencarvajal/arquitectura-de-una-casa-inteligente-con-esp32-y-aws-las-piezas-y-como-encajan-5d1h</link>
      <guid>https://dev.to/stevencarvajal/arquitectura-de-una-casa-inteligente-con-esp32-y-aws-las-piezas-y-como-encajan-5d1h</guid>
      <description>&lt;p&gt;&lt;em&gt;Publicado originalmente en &lt;a href="https://iot.gripe/blog/arquitectura-casa-inteligente-esp32-aws" rel="noopener noreferrer"&gt;iot.gripe&lt;/a&gt;, como parte 1 de la serie "Domótica con ESP32 y AWS desde cero".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;La mayoría de tutoriales de domótica con ESP32 terminan en un LED que se enciende desde el celular. Los problemas aparecen después: cuando tienes diez dispositivos, cuando otra persona de la casa quiere usarlos, cuando quieres controlarlos por voz o cuando un corte de luz desordena todo.&lt;/p&gt;

&lt;p&gt;En esta serie construimos, paso a paso, un &lt;strong&gt;proyecto de ejemplo&lt;/strong&gt; de domótica con ESP32 y AWS. Cada parte explica una pieza (firmware, nube, app o seguridad) con código mínimo y nombres genéricos, para que la adaptes a tu propio proyecto. Esta primera parte es el mapa: qué piezas hay, cómo se hablan y qué opciones tienes en cada capa.&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%2Fawaiwzb86zapeftucaew.jpg" 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%2Fawaiwzb86zapeftucaew.jpg" alt="Un ESP32-S3 Super Mini arriba y dos ESP32-C3 Super Mini abajo" width="760" height="995"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Un ESP32-S3 (arriba) y dos ESP32-C3 (abajo): el hardware típico de un proyecto así.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  La arquitectura en una imagen
&lt;/h2&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%2Fiot.gripe%2Fimagenes%2Farquitectura-casa-inteligente-esp32-aws%2Farquitectura-ejemplo.svg" 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%2Fiot.gripe%2Fimagenes%2Farquitectura-casa-inteligente-esp32-aws%2Farquitectura-ejemplo.svg" alt="Diagrama de tres capas: un hub ESP32-S3 conectado por ESP-NOW a nodos con relés y sensores, y por MQTT a AWS IoT Core; en la nube, Cognito, Lambda y DynamoDB; y una web app y Atajos de Siri como apps" width="960" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Las tres capas del proyecto de ejemplo. La caja punteada es la alternativa: cada ESP32 conectado directo a la nube.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Casi todos los sistemas de domótica conectados a la nube tienen estas tres capas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dispositivos en la casa:&lt;/strong&gt; placas ESP32 que mueven relés o leen sensores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nube:&lt;/strong&gt; un &lt;em&gt;broker&lt;/em&gt; MQTT que recibe y reparte los mensajes, un servicio de login, una base de datos y alguna API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apps:&lt;/strong&gt; una web app o app móvil, y quizá control por voz.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Con AWS, todo puede ser &lt;strong&gt;serverless&lt;/strong&gt;: no hay servidores propios que mantener, y con uso doméstico el costo es de centavos al mes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capa 1: cómo se conectan los dispositivos
&lt;/h2&gt;

&lt;p&gt;La primera decisión es si cada dispositivo habla con la nube o si uno solo lo hace por todos.&lt;/p&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;Cada dispositivo conectado a la nube&lt;/th&gt;
&lt;th&gt;Un hub y nodos locales&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Conexiones TLS abiertas&lt;/td&gt;
&lt;td&gt;Una por dispositivo&lt;/td&gt;
&lt;td&gt;Una por casa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificados que administrar&lt;/td&gt;
&lt;td&gt;Uno por dispositivo&lt;/td&gt;
&lt;td&gt;Uno por hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clientes conectados al router&lt;/td&gt;
&lt;td&gt;Todos&lt;/td&gt;
&lt;td&gt;Solo el hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memoria que necesita cada placa&lt;/td&gt;
&lt;td&gt;TLS + MQTT + JSON en todas&lt;/td&gt;
&lt;td&gt;Los nodos necesitan muy poca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si el hub falla&lt;/td&gt;
&lt;td&gt;No aplica&lt;/td&gt;
&lt;td&gt;Los nodos pierden el control remoto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complejidad&lt;/td&gt;
&lt;td&gt;Menor: un solo firmware&lt;/td&gt;
&lt;td&gt;Mayor: dos firmwares y un protocolo local&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Conexión directa&lt;/strong&gt; es lo más simple para empezar, y lo que hace la mayoría de enchufes comerciales: cada placa con su Wi-Fi, su certificado y su conexión MQTT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hub y nodos&lt;/strong&gt; escala mejor cuando hay muchos dispositivos pequeños. El hub (un ESP32-S3, con más memoria) es el único con Wi-Fi e internet; los nodos (ESP32-C3, más baratos) reciben órdenes por un protocolo local. Para el protocolo local hay varias opciones: &lt;strong&gt;ESP-NOW&lt;/strong&gt; (de Espressif, sin router), Bluetooth LE, Zigbee o Thread. Las comparo en la guía de comunicación entre dispositivos.&lt;/p&gt;

&lt;p&gt;El proyecto de ejemplo usa un hub con nodos ESP-NOW porque así la serie cubre las dos cosas: la conexión de un ESP32 con AWS (parte 3) y la comunicación entre placas (parte 4). La elección de placas para cada papel está en la parte 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Un interruptor físico que no depende de internet
&lt;/h3&gt;

&lt;p&gt;Sea cual sea la arquitectura, conviene que cada luz tenga un interruptor de pared que funcione en local: el dispositivo cambia el estado al instante y después avisa a la nube. Si se cae internet, la luz sigue funcionando como siempre. Lo construimos en la parte 18.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capa 2: la nube en AWS
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Servicio&lt;/th&gt;
&lt;th&gt;Para qué sirve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS IoT Core&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;Broker&lt;/em&gt; MQTT gestionado. Autentica cada dispositivo con un certificado X.509&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 &lt;strong&gt;deseado&lt;/strong&gt; y el &lt;strong&gt;reportado&lt;/strong&gt;. Guarda el estado aunque el dispositivo esté desconectado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cognito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Login de usuarios (User Pool) y credenciales temporales de AWS para la app (Identity Pool)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DynamoDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Base de datos para usuarios, dispositivos o lecturas de sensores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lambda&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Funciones para las APIs: por ejemplo, la que recibe una orden de voz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS CDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Toda la infraestructura definida como código&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Si es tu primer contacto con AWS IoT, empieza por la guía de AWS IoT Core.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo viaja una orden con el Device Shadow
&lt;/h2&gt;

&lt;p&gt;El patrón más usado con AWS IoT es separar &lt;strong&gt;lo que el usuario quiere&lt;/strong&gt; de &lt;strong&gt;lo que el dispositivo confirma&lt;/strong&gt;:&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;"sala"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"cocina"&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="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;"sala"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cocina"&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;ol&gt;
&lt;li&gt;La app escribe el estado &lt;strong&gt;deseado&lt;/strong&gt; (&lt;code&gt;desired&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;AWS IoT calcula la diferencia entre deseado y reportado (el &lt;code&gt;delta&lt;/code&gt;) y se la envía al dispositivo.&lt;/li&gt;
&lt;li&gt;El dispositivo aplica el cambio (o se lo pasa al nodo que corresponde) y espera la confirmación.&lt;/li&gt;
&lt;li&gt;Con el cambio confirmado, publica el nuevo estado &lt;strong&gt;reportado&lt;/strong&gt; (&lt;code&gt;reported&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;La app, suscrita a los cambios, actualiza el botón.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La regla de oro: &lt;strong&gt;el dispositivo solo reporta lo que de verdad aplicó.&lt;/strong&gt; Si un nodo está desconectado, la app no debe mostrar un estado falso. Lo implementamos en la parte 5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capa 3: las apps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;La web app&lt;/strong&gt; puede ser un sitio estático con React y Vite que se conecta a AWS IoT Core por MQTT sobre WebSocket (parte 10) y que se instala en el celular como una app (parte 15). Un sitio estático se puede alojar gratis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La voz&lt;/strong&gt; no necesita un altavoz inteligente: un Atajo de iOS puede llamar a una API HTTPS y Siri lo ejecuta con una frase (parte 9).&lt;/p&gt;

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

&lt;p&gt;Para una casa, &lt;strong&gt;centavos de dólar al mes&lt;/strong&gt;: AWS IoT Core cobra por conexión y por mensaje, Cognito tiene una capa gratuita amplia, DynamoDB y Lambda en modo bajo demanda cobran por uso, y la web app se puede alojar gratis. Cómo estimarlo con números está en la parte 22.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los límites que conviene conocer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESP-NOW admite un máximo de 20 *peers&lt;/strong&gt;* registrados por dispositivo (menos si usas cifrado). Es un límite del SDK de Espressif.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El control remoto depende de internet.&lt;/strong&gt; Sin conexión, la app y la voz no funcionan; los interruptores físicos sí.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un dispositivo apagado no recibe órdenes.&lt;/strong&gt; El Shadow guarda el estado deseado y se lo entrega cuando vuelve, pero la app debe mostrar que está desconectado (parte 19).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  ¿Por qué no usar Home Assistant?
&lt;/h3&gt;

&lt;p&gt;Home Assistant es excelente para domótica local: todo funciona dentro de tu red y tiene miles de integraciones. Una arquitectura en la nube tiene sentido si quieres control remoto sin abrir puertos ni mantener un servidor encendido en casa, o si quieres aprender a construir cada pieza. Comparo las dos opciones en un artículo aparte.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿ESP-NOW o Wi-Fi para todos los dispositivos?
&lt;/h3&gt;

&lt;p&gt;Con pocos dispositivos, Wi-Fi directo es más simple. Con muchos, o con nodos a batería, ESP-NOW reduce memoria, consumo y conexiones al router. La parte 4 explica ESP-NOW paso a paso.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito AWS para seguir la serie?
&lt;/h3&gt;

&lt;p&gt;Para las partes de la nube, sí. Las partes de firmware (ESP-NOW, NVS, portal cautivo, interruptor físico) sirven para cualquier proyecto con ESP32, uses otra nube o ninguna.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué viene en la serie?
&lt;/h3&gt;

&lt;p&gt;El hardware (parte 2), la conexión con AWS IoT Core (parte 3), ESP-NOW (parte 4) y, después, la base de datos, las APIs, la web app, la seguridad y los costos. El índice completo está en la &lt;a href="https://iot.gripe/serie/domotica-esp32-aws" rel="noopener noreferrer"&gt;página de la serie&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>domotica</category>
      <category>esp32</category>
      <category>awsiotcore</category>
      <category>espnow</category>
    </item>
  </channel>
</rss>
