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
- Installa ESP-IDF seguendo la guida ufficiale Espressif (esiste anche un’estensione VS Code dedicata “ESP-IDF” che automatizza l’installazione della toolchain)
- Apri il terminale ESP-IDF (su Windows, “ESP-IDF PowerShell” dal menu Start, che imposta le variabili d’ambiente necessarie)
- Crea un nuovo progetto:
idf.py create-project firmware-base - 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.
