Stazione meteo: primo firmware sulla XIAO ESP32-C6 (ESP-IDF nativo)

Stazione meteo: primo firmware sulla XIAO ESP32-C6 (ESP-IDF nativo)

Rifacciamo l’esercizio del tutorial precedente — LED e deep sleep sulla XIAO ESP32-C6 — questa volta con ESP-IDF nativo, il framework ufficiale Espressif basato su FreeRTOS. Niente Arduino: è più verboso, ma è il framework che userai per progetti professionali dove servono controllo fine e prestazioni massime.

Perché imparare anche ESP-IDF

Arduino/PlatformIO nasconde molta complessità dietro funzioni semplici come digitalWrite(). ESP-IDF invece espone direttamente le API del chip: più codice da scrivere, ma capisci davvero cosa succede sotto — utile quando in futuro dovrai ottimizzare consumi al microampere o usare periferiche che Arduino non copre bene.

Setup dell’ambiente ESP-IDF

  1. Installa ESP-IDF seguendo la guida ufficiale Espressif (esiste anche un’estensione VS Code dedicata “ESP-IDF” che automatizza l’installazione della toolchain)
  2. Apri il terminale ESP-IDF (su Windows, “ESP-IDF PowerShell” dal menu Start, che imposta le variabili d’ambiente necessarie)
  3. Crea un nuovo progetto: idf.py create-project firmware-base
  4. Imposta il target corretto: idf.py set-target esp32c6

Il codice (main/firmware-base.c)

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_sleep.h"
#include "esp_log.h"

#define LED_GPIO GPIO_NUM_15   // verifica il pin esatto sul pinout della tua XIAO
#define SLEEP_SECONDS 10

static const char *TAG = "firmware-base";

// La RTC memory sopravvive al deep sleep, la RAM normale no.
RTC_DATA_ATTR static int boot_count = 0;

void app_main(void) {
    boot_count++;
    ESP_LOGI(TAG, "Risveglio numero: %d", boot_count);

    gpio_reset_pin(LED_GPIO);
    gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);

    gpio_set_level(LED_GPIO, 0);   // acceso, se attivo basso
    vTaskDelay(pdMS_TO_TICKS(300));
    gpio_set_level(LED_GPIO, 1);   // spento

    ESP_LOGI(TAG, "Vado in deep sleep per %d secondi...", SLEEP_SECONDS);

    esp_sleep_enable_timer_wakeup((uint64_t)SLEEP_SECONDS * 1000000ULL);
    esp_deep_sleep_start();

    // Il codice da qui in poi non viene mai eseguito
}

Compilazione e caricamento

idf.py build
idf.py -p COM7 flash monitor

Sostituisci COM7 con la porta seriale corretta (su Linux/Mac sarà qualcosa come /dev/ttyACM0). Il comando monitor apre subito il log seriale: vedrai gli stessi messaggi “Risveglio numero” del tutorial precedente, con lo stesso comportamento.

Confronto con la versione Arduino/PlatformIO

Arduino/PlatformIO ESP-IDF nativo
Configurazione pin pinMode() + digitalWrite() gpio_set_direction() + gpio_set_level(), con reset esplicito del pin
Attesa non bloccante delay() vTaskDelay(pdMS_TO_TICKS(...)): esplicitamente una API FreeRTOS
Log Serial.print... ESP_LOGI(), con livelli (I/W/E) e tag configurabili
Deep sleep stesse funzioni esp_sleep_* stesse funzioni esp_sleep_* — sono le API native, Arduino le richiama identiche sotto il cofano

Nota l’ultima riga: per il deep sleep, Arduino su ESP32 è ESP-IDF sotto la superficie. La differenza reale sta in come configuri pin, task e logging — lì ESP-IDF ti dà controllo diretto ma richiede più righe.

Va oltre

Con le fondamenta pronte in entrambi gli approcci, nel prossimo tutorial colleghiamo il sensore BME280 alla XIAO ESP32-C6 e leggiamo i primi dati ambientali reali — il primo “ingrediente” della stazione meteo.

Riguardo

Imprenditore, maker, MBSE enthusiast e co-autore di Web App Portal. Collegati su LinkedIn.