Módulo 1

Herramientas de desarrollo: Arduino IDE vs PlatformIO vs ESP-IDF

Introducción al ESP32 y su Ecosistema

ESP32 Mecatrónica IoT UNAM

Comparativa de Herramientas de Desarrollo

El ecosistema de desarrollo para ESP32 ofrece múltiples opciones, cada una diseñada para diferentes necesidades y niveles de experiencia. La elección correcta de la herramienta de desarrollo puede marcar la diferencia entre un proyecto exitoso y horas de frustración.

Arduino IDE

Ideal para principiantes y proyectos simples

  • Fácil de usar
  • Gran comunidad
  • Muchas librerías
  • Funciones limitadas
PlatformIO

Perfecto para desarrolladores intermedios

  • Más profesional
  • Gestión de librerías
  • Múltiples plataformas
  • Curva de aprendizaje
ESP-IDF

Para desarrolladores avanzados

  • Máximo control
  • Documentación oficial
  • Optimización máxima
  • Muy complejo

Análisis Técnico Comparativo

Característica Arduino IDE PlatformIO ESP-IDF
Facilidad de uso Excelente Buena Difícil
Gestión de librerías Básica Avanzada Nativa
Debugging Limitado Completo Profesional
Control de hardware Medio Alto Máximo
Tiempo de setup 5 min 15 min 30+ min
Tamaño del código Grande Optimizado Mínimo

Mismo Proyecto, Tres Enfoques

Para ilustrar las diferencias, implementemos el mismo proyecto (conexión WiFi con servidor web básico) en las tres herramientas:

Arduino IDE

Arduino C++ (.ino)
#include 
#include 

const char* ssid = "TU_WIFI";
const char* password = "TU_PASSWORD";

WebServer server(80);

void setup() {
  Serial.begin(115200);
  
  // Conectar a WiFi
  WiFi.begin(ssid, password);
  Serial.print("Conectando a WiFi");
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println();
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());
  
  // Configurar ruta web
  server.on("/", []() {
    server.send(200, "text/html", 
      "

ESP32 Web Server

" "

Funcionando desde Arduino IDE

"); }); server.begin(); Serial.println("Servidor iniciado"); } void loop() { server.handleClient(); }

PlatformIO

platformio.ini + main.cpp
; platformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps = 
    ESP Async WebServer

; main.cpp
#include 
#include 
#include 

const char* ssid = "TU_WIFI";
const char* password = "TU_PASSWORD";

AsyncWebServer server(80);

void setup() {
    Serial.begin(115200);
    
    // Configuración WiFi con mejor gestión de errores
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    
    Serial.printf("Conectando a %s", ssid);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    
    Serial.printf("\nConectado! IP: %s\n", WiFi.localIP().toString().c_str());
    
    // Servidor asíncrono más eficiente
    server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
        request->send(200, "text/html", 
            ""
            "ESP32 Server"
            "

PlatformIO ESP32

" "

Servidor asíncrono optimizado

"); }); server.begin(); Serial.println("Servidor HTTP iniciado"); } void loop() { // El servidor asíncrono no necesita handleClient() delay(1000); }

ESP-IDF

ESP-IDF C/C++
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_http_server.h"
#include "nvs_flash.h"

#define WIFI_SSID "TU_WIFI"
#define WIFI_PASS "TU_PASSWORD"

static const char *TAG = "ESP32_Server";

// Handler para la página principal
esp_err_t root_handler(httpd_req_t *req) {
    const char* response = 
        ""
        "ESP-IDF Server"
        "

ESP-IDF Native

" "

Máximo control y optimización

"; httpd_resp_send(req, response, HTTPD_RESP_USE_STRLEN); return ESP_OK; } // Configuración del servidor httpd_handle_t start_webserver(void) { httpd_config_t config = HTTPD_DEFAULT_CONFIG(); httpd_handle_t server = NULL; if (httpd_start(&server, &config) == ESP_OK) { httpd_uri_t root = { .uri = "/", .method = HTTP_GET, .handler = root_handler, .user_ctx = NULL }; httpd_register_uri_handler(server, &root); } return server; } // Event handler para WiFi static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { esp_wifi_connect(); } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; ESP_LOGI(TAG, "IP obtenida:" IPSTR, IP2STR(&event->ip_info.ip)); start_webserver(); } } void app_main(void) { // Inicialización NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); // Inicialización WiFi con control completo ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_netif_create_default_wifi_sta(); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL)); wifi_config_t wifi_config = { .sta = { .ssid = WIFI_SSID, .password = WIFI_PASS, }, }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "Conectando a %s", WIFI_SSID); }

Ejercicios Prácticos

1

Instalación de las 3 Herramientas

Principiante 45 min

Objetivo: Instalar y configurar Arduino IDE, PlatformIO y ESP-IDF en tu sistema.

Pasos:

  1. Descargar e instalar Arduino IDE
  2. Instalar Visual Studio Code + PlatformIO
  3. Configurar ESP-IDF mediante instalador
  4. Compilar un proyecto "Hello World" en cada uno
2

Benchmark de Compilación

Intermedio 30 min

Objetivo: Comparar tiempos de compilación y tamaños de archivo entre herramientas.

Métricas: Tiempo de compilación, tamaño del binario, uso de memoria

Proyecto: Servidor web con múltiples funcionalidades

3

Migración de Proyecto

Avanzado 60 min

Objetivo: Migrar un proyecto de Arduino IDE a PlatformIO y luego a ESP-IDF.

Desafío: Mantener la funcionalidad mientras se optimiza el código

Resultado: Tres versiones del mismo proyecto con análisis comparativo

Recomendaciones por Tipo de Proyecto

Arduino IDE
Ideal para:
  • • Estudiantes principiantes
  • • Prototipos rápidos
  • • Proyectos educativos
  • • Demostraciones simples
Mecatrónica:

Control básico de sensores y actuadores

PlatformIO
Ideal para:
  • • Proyectos comerciales
  • • Desarrollo en equipo
  • • Múltiples plataformas
  • • CI/CD integration
Mecatrónica:

Sistemas complejos con múltiples sensores

ESP-IDF
Ideal para:
  • • Aplicaciones críticas
  • • Máxima optimización
  • • Productos industriales
  • • Funciones avanzadas
Mecatrónica:

Control industrial de alta precisión

Referencias y Recursos Adicionales