ESP32 et Arduino

Tutoriel ESP32-C6 MQTT : d'une carte Wi-Fi 6 à un broker cloud avec Arduino

Faites publier un ESP32-C6 vers broker.connectmq.com avec le core Arduino 3.x, pilotez sa LED RGB depuis la ligne de commande et comprenez ses différences avec l'ESP32 classique double cœur.

Carte ESP32-C6 DevKitC-1 avec une LED RGB allumée connectée à un broker cloud dans un tutoriel esp32-c6 mqtt
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

Ce tutoriel ESP32-C6 MQTT permet à une carte C6 de publier de la télémétrie et de recevoir des commandes en une quinzaine de minutes. Vous allez installer le bon core Arduino, publier la température interne de la puce vers broker.connectmq.com, commander la LED RGB intégrée depuis votre ordinateur portable et découvrir quelles habitudes héritées de l'ESP32 classique ne s'appliquent plus.

Ce qui distingue l'ESP32-C6

L'ESP32-C6 n'est pas simplement un ESP32 plus récent. Il utilise une autre architecture de processeur et un autre ensemble de radios, et certaines de ces différences se manifestent immédiatement dans les sketches Arduino.

Caractéristique ESP32 classique ESP32-C6
CPU Xtensa LX6 double cœur, jusqu'à 240 MHz RISC-V monocœur, jusqu'à 160 MHz, plus un cœur RISC-V basse consommation
Wi-Fi 802.11 b/g/n, 2,4 GHz 802.11ax (Wi-Fi 6), 2,4 GHz uniquement
Bluetooth Classic et BLE 4.2 BLE 5 uniquement, pas de Classic
802.15.4 Non Oui (Thread, Zigbee)
Core Arduino 2.x et 3.x 3.x uniquement
USB Puce USB-UART externe USB Serial/JTAG natif plus UART sur la plupart des DevKits
LED intégrée (DevKitC-1) Généralement une LED simple sur GPIO 2 LED RGB adressable sur GPIO 8

Pour MQTT, les conséquences pratiques sont les suivantes :

  • Il vous faut le core Arduino 3.x. Le C6 n'est pas disponible dans les paquets de cartes 2.x.
  • Il n'y a qu'un seul cœur applicatif. Tout code qui épingle des tâches sur le cœur 1 doit passer au cœur 0.
  • La sortie série peut apparaître sur un autre port. Si rien ne s'affiche, activez « USB CDC On Boot » ou branchez-vous sur le port UART.
  • Le Wi-Fi 6 est facultatif, pas obligatoire. Le C6 se connecte aussi aux points d'accès 802.11n ordinaires. Il ne voit toujours pas les réseaux 5 GHz.

Le protocole MQTT lui-même ne se soucie de rien de tout cela. Le même code PubSubClient qui tourne sur un ESP32 tourne sur un C6, c'est pourquoi ce tutoriel se concentre sur les détails de configuration qui font trébucher.

Prérequis

  • Une carte ESP32-C6. Les étapes supposent l'ESP32-C6-DevKitC-1 d'Espressif ; les autres cartes C6 fonctionnent avec de légers changements de broches.
  • Arduino IDE 2.x.
  • Le paquet de cartes esp32 d'Espressif Systems, version 3.0 ou plus récente, depuis le gestionnaire de cartes.
  • La bibliothèque PubSubClient de Nick O'Leary depuis le gestionnaire de bibliothèques.
  • Les clients Mosquitto en ligne de commande sur votre ordinateur.

Configurer Arduino pour l'ESP32-C6

  1. Ouvrez le gestionnaire de cartes, recherchez esp32 et installez ou mettez à jour le paquet Espressif vers une version 3.x.
  2. Sélectionnez Tools > Board > esp32 > ESP32C6 Dev Module.
  3. Sur la DevKitC-1, branchez le port USB-C marqué UART pour l'expérience la plus simple. Si vous utilisez le port marqué USB, réglez Tools > USB CDC On Boot > Enabled pour que Serial corresponde à l'USB natif.
  4. Choisissez le port COM correspondant et téléversez une fois un sketch vide pour vérifier que la chaîne d'outils fonctionne.

Si le téléversement échoue avec un timeout de connexion, maintenez BOOT, appuyez brièvement sur RESET, relâchez BOOT et réessayez. Cela force le bootloader en ROM.

Le sketch ESP32-C6 MQTT

Le sketch publie toutes les dix secondes la mesure du capteur de température interne, la puissance du signal Wi-Fi et le tas libre, s'abonne à un topic de commande de LED et publie l'état de la LED en retained message.

#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID     = "YOUR_WIFI_SSID";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
const char* MQTT_HOST     = "broker.connectmq.com";
const uint16_t MQTT_PORT  = 1883;
const char* PREFIX        = "connectmq/demo/c6x41z";   // remplacez par votre propre identifiant aléatoire

WiFiClient   net;
PubSubClient mqtt(net);
String clientId;
String topicTelemetry, topicLedSet, topicLedState, topicStatus;
unsigned long lastPublish = 0;
uint8_t ledR = 0, ledG = 0, ledB = 0;

void setLed(uint8_t r, uint8_t g, uint8_t b) {
  ledR = r; ledG = g; ledB = b;
  rgbLedWrite(RGB_BUILTIN, r, g, b);   // API du core Arduino 3.x
  char state[40];
  snprintf(state, sizeof(state), "{\"r\":%u,\"g\":%u,\"b\":%u}", r, g, b);
  mqtt.publish(topicLedState.c_str(), state, true);
}

void onMessage(char* topic, byte* payload, unsigned int length) {
  String msg;
  for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
  msg.trim();
  msg.toUpperCase();
  Serial.printf("Command on %s: %s\n", topic, msg.c_str());

  if (msg == "OFF")        setLed(0, 0, 0);
  else if (msg == "RED")   setLed(40, 0, 0);
  else if (msg == "GREEN") setLed(0, 40, 0);
  else if (msg == "BLUE")  setLed(0, 0, 40);
  else if (msg == "WHITE") setLed(30, 30, 30);
}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nIP %s, RSSI %d dBm\n", WiFi.localIP().toString().c_str(), WiFi.RSSI());
}

void connectMqtt() {
  while (!mqtt.connected()) {
    Serial.print("Connecting to MQTT... ");
    if (mqtt.connect(clientId.c_str(), topicStatus.c_str(), 1, true, "offline")) {
      Serial.println("connected");
      mqtt.publish(topicStatus.c_str(), "online", true);
      mqtt.subscribe(topicLedSet.c_str(), 1);
    } else {
      Serial.printf("failed, state %d, retrying in 5 s\n", mqtt.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  delay(500);

  clientId       = "esp32c6-" + String((uint32_t)ESP.getEfuseMac(), HEX);
  topicTelemetry = String(PREFIX) + "/telemetry";
  topicLedSet    = String(PREFIX) + "/led/set";
  topicLedState  = String(PREFIX) + "/led/state";
  topicStatus    = String(PREFIX) + "/status";

  connectWifi();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  mqtt.setCallback(onMessage);
  mqtt.setBufferSize(512);
  connectMqtt();
  setLed(0, 0, 0);
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) connectWifi();
  if (!mqtt.connected()) connectMqtt();
  mqtt.loop();

  if (millis() - lastPublish >= 10000) {
    lastPublish = millis();
    char payload[160];
    snprintf(payload, sizeof(payload),
             "{\"chipTemp\":%.1f,\"rssi\":%d,\"freeHeap\":%lu,\"uptime\":%lu}",
             temperatureRead(), WiFi.RSSI(),
             (unsigned long)ESP.getFreeHeap(), millis() / 1000);
    mqtt.publish(topicTelemetry.c_str(), payload);
    Serial.println(payload);
  }
}

Le capteur de température interne mesure la puce, pas la pièce : attendez-vous à des valeurs supérieures de plusieurs degrés à la température ambiante. Il reste utile comme indicateur de santé et comme valeur de démonstration sans aucun câblage.

Tester les messages ESP32-C6 MQTT

Ouvrez un terminal et abonnez-vous à tout ce qui se trouve sous votre préfixe :

mosquitto_sub -h broker.connectmq.com -p 1883 -i c6-viewer-x41z -t "connectmq/demo/c6x41z/#" -v

Vous devriez voir status online, l'état retained de la LED et un message de télémétrie toutes les dix secondes. Dans un second terminal, envoyez une commande :

mosquitto_pub -h broker.connectmq.com -p 1883 -i c6-cmd-x41z -t "connectmq/demo/c6x41z/led/set" -m "green" -q 1

La LED RGB passe au vert et un nouvel état retained apparaît. Comme l'état est retained, tout client qui s'abonne ensuite connaît immédiatement la couleur actuelle. La zone publique de ConnectMQ ne nécessite aucun compte mais elle est visible de tous : limitez-vous donc à des données de démonstration. La page du serveur MQTT public gratuit en explique les limites, dont 10 messages par seconde et par client.

Porter du code ESP32 classique vers le C6

La plupart des sketches compilent sans modification. Voici les changements dont vous aurez le plus probablement besoin :

  1. Épinglage des tâches. Remplacez xTaskCreatePinnedToCore(..., 1) par le cœur 0, ou appelez xTaskCreate. Le guide ESP32 FreeRTOS MQTT présente une organisation de tâches qui fonctionne sur les deux familles de puces avec ce seul changement.
  2. Broches de LED. digitalWrite(2, HIGH) n'allume rien sur une DevKitC-1. Utilisez rgbLedWrite(RGB_BUILTIN, r, g, b).
  3. Broches ADC. Le C6 possède un seul ADC sur les GPIO 0 à 6. Les numéros de broches comme 34 ou 36 des exemples pour ESP32 classique n'existent pas.
  4. API dépréciées. Le core 3.x a renommé ou supprimé plusieurs fonctions : par exemple, neopixelWrite est devenu rgbLedWrite et l'API PWM LEDC est passée à ledcAttach. Comparez les erreurs du compilateur aux notes de migration de la documentation Arduino-ESP32.
  5. Bluetooth Classic. BluetoothSerial n'est pas pris en charge. Utilisez BLE à la place.

Si vous compilez avec PlatformIO, choisissez une version de plateforme qui embarque le core Arduino 3.x pour le C6 ; la configuration PlatformIO MQTT détaille un fichier de projet reproductible.

Dépannage

  • mqtt.state() renvoie -2. La connexion TCP a échoué. Vérifiez que la carte a bien une adresse IP et que votre réseau autorise le port 1883 en sortie. Certains réseaux invités le bloquent ; essayez plutôt le port 8883 avec TLS.
  • mqtt.state() renvoie 2. Le broker a rejeté le client ID. Sur la zone publique, il doit être non vide et unique, ce que garantit le suffixe tiré de la MAC eFuse.
  • Connexion, puis déconnexion toutes les quelques secondes. Deux appareils utilisent le même client ID et chaque nouvelle connexion éjecte l'autre. Cela arrive souvent lorsque vous flashez le même identifiant codé en dur sur deux cartes.
  • Le Wi-Fi ne se connecte jamais à un routeur Wi-Fi 6. Vérifiez que la bande 2,4 GHz est activée et qu'elle n'est pas masquée par un réglage de band steering qui pousse les clients vers le 5 GHz uniquement. Les réseaux WPA3 seul peuvent aussi poser problème ; essayez le mode mixte WPA2/WPA3.
  • Aucune sortie série. Basculez USB CDC On Boot ou passez sur le port UART.

Passer en production sur un broker cloud

Pour de vrais appareils, passez à TLS sur le port 8883 avec des identifiants. Créez un broker sur app.connectmq.com et copiez le nom d'utilisateur, le mot de passe et le client ID générés. Remplacez WiFiClient par WiFiClientSecure, chargez le certificat ISRG Root X1 avec net.setCACert(...), réglez le port sur 8883 et passez les identifiants à mqtt.connect("YOUR_CLIENT_ID", "YOUR_USERNAME", "YOUR_PASSWORD", ...). Le C6 gère sans peine la négociation TLS, même si elle prend un peu plus de temps que sur un ESP32 classique à 240 MHz.

Ensuite, l'explorateur de topics en direct du portail affiche les messages de votre C6 au fil de leur arrivée, et la vue des appareils regroupe les cartes par site et par ligne si vous utilisez des noms de topics de style ISA-95. Si vous découvrez les brokers en général, ce que fait un broker MQTT est une courte introduction, et le tutoriel IoT ESP32 recense tous les projets de cette série.

Faites tourner votre parc d'ESP32-C6 sur ConnectMQ

L'ESP32-C6 est un excellent choix pour les nouvelles conceptions : efficacité du Wi-Fi 6, BLE 5 et chaîne d'outils moderne. Associez-le à un broker MQTT cloud que vous n'avez pas à exploiter. ConnectMQ, un broker MQTT managé, vous offre TLS sur le port 8883, MQTT 3.1.1 et 5.0, ainsi qu'une offre gratuite Serverless sans carte bancaire : vous passez ainsi en quelques minutes de la zone de démonstration publique à des appareils authentifiés. Si vous voulez les propriétés MQTT 5 sur le C6, ESP-IDF est la voie à suivre ; consultez esp-mqtt avec MQTT 5.

Questions fréquentes

L'ESP32-C6 prend-il en charge MQTT en Wi-Fi 6 ?

Oui. MQTT fonctionne sur TCP : il marche donc avec toutes les normes Wi-Fi prises en charge par le C6, y compris le 802.11ax en 2,4 GHz. Le Wi-Fi 6 améliore surtout l'efficacité énergétique et le comportement sur les réseaux encombrés.

Puis-je utiliser Thread ou Zigbee sur le C6 pour atteindre un broker MQTT ?

La radio du C6 prend en charge le 802.15.4, mais MQTT a besoin d'un chemin IP jusqu'au broker. Un réseau Thread nécessite un border router, et les appareils Zigbee ont généralement besoin d'une passerelle qui traduit vers MQTT.

Pourquoi mon ancien sketch ESP32 ne compile-t-il pas pour le C6 ?

Le C6 exige le core Arduino 3.x, qui a modifié plusieurs API, et il ne dispose ni du Bluetooth Classic ni du second cœur. Mettez à jour les fonctions renommées et supprimez l'épinglage sur le cœur 1.

Le capteur de température interne est-il assez précis pour mesurer la température ambiante ?

Non. Il mesure la puce et affiche une valeur plus élevée que celle de la pièce. Utilisez un capteur externe comme un DHT22 ou un BME280 pour les mesures ambiantes.

Articles liés

Exemple MQTT ESP-IDF : construire un client esp-mqtt à partir de zéro

Construisez un projet ESP-IDF à partir d'un dossier vide avec le composant esp-mqtt : configuration du Wi-Fi en mode station, gestionnaire d'événements MQTT, publication et abonnement, propriétés MQTT 5 et TLS avec le bundle de certificats.

9 min de lecture

Horodatage NTP ESP32 MQTT : ajouter une heure précise à chaque message

Synchronisez l'horloge de l'ESP32 avec NTP, formatez des horodatages ISO 8601 et epoch en millisecondes, et joignez-les aux payloads MQTT pour que les mesures conservent leur véritable heure de capture même lorsqu'elles sont publiées en retard.

8 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.