Tutoriel ESP32 52/55 - Synchronisation globale WS2812 CheerLights MQTT avec LCD | Kit IoT SunFounder ESP32
Dans ce tutoriel, nous allons créer un projet CheerLights en utilisant l'ESP32, qui synchronisera les couleurs à l'échelle mondiale via MQTT. Ce projet changera non seulement les couleurs en fonction des entrées d'autres utilisateurs, mais affichera également la couleur actuelle et le nombre de fois qu'elle a été mise à jour sur un écran LCD. Le résultat est une démonstration amusante des capacités de l'IoT, montrant comment les appareils peuvent interagir et maintenir les utilisateurs connectés à distance. Pour plus de précisions, regardez la vidéo à (dans la vidéo à 00:00).
Matériel expliqué
Pour réaliser ce projet, vous aurez besoin d'un microcontrôleur ESP32, d'une bande LED WS2812 et d'un écran LCD. L'ESP32 sert de cerveau à l'opération, utilisant ses capacités Wi-Fi intégrées pour se connecter à Internet et recevoir des messages MQTT. Cela permet des mises à jour en temps réel des couleurs des LED en fonction d'une entrée globale d'autres utilisateurs.
La bande LED WS2812 est un choix populaire pour les projets nécessitant des LEDs RGB adressables. Chaque LED peut être contrôlée indépendamment, permettant des affichages de couleurs riches. L'écran LCD fournira une confirmation visuelle de la couleur actuelle et du nombre de fois qu'elle a été changée, améliorant l'interaction avec l'utilisateur.
Détails de la fiche technique
| Fabricant | SunFounder |
|---|---|
| Numéro de pièce | ESP32 |
| Tension logique/IO | 3,3 V |
| Tension d'alimentation | 5 V |
| Courant de sortie (par canal) | 20 mA |
| Courant de pointe (par canal) | 60 mA |
| Directives sur la fréquence PWM | 400 Hz |
| Seuils de logique d'entrée | 0,15 V (faible), 0,8 V (élevé) |
| Chute de tension / RDS(on)/ saturation | 0,2 V |
| Limites thermiques | 85 °C |
| Paquet | module ESP32 |
| Notes / variantes | Comprend le Wi-Fi et le Bluetooth intégrés |
- Assurez-vous d'une alimentation appropriée pour l'ESP32 (5 V) et la bande WS2812 (5 V).
- Utilisez un sol commun entre l'ESP32 et la bande LED.
- Implémentez un broker MQTT approprié pour la synchronisation des couleurs.
- Faites attention à la connexion de la broche de données pour le WS2812 (broche 14 selon le code).
- Soyez prudent avec le nombre de LED ; dépasser les limites de puissance nécessite des sources d'alimentation supplémentaires.
Instructions de câblage


Pour câbler les composants, commencez par connecter la bande LED WS2812. Connectez la broche de masse (habituellement noire) de la bande LED à la broche de masse de l'ESP32. Ensuite, connectez la broche VCC (habituellement rouge) de la bande LED à la sortie 5V de l'ESP32. Enfin, connectez la broche de données (souvent jaune) à la broche GPIO 14 sur l'ESP32.
Pour l'écran LCD, connectez la broche de masse (souvent noire) à la masse sur l'ESP32. La broche VCC (généralement rouge) doit être connectée à la sortie 5V. La broche SDA (typiquement grise) se connecte à la broche GPIO 21, tandis que la broche SCL (généralement blanche) se connecte à la broche GPIO 22. Cette configuration permet à l'ESP32 de communiquer avec l'écran LCD et d'afficher des informations au besoin.
Exemples de code et guide étape par étape
Dans la fonction de configuration, nous initialisons l'écran LCD et nous connectons au Wi-Fi. Le code ci-dessous montre comment définir les bibliothèques nécessaires et configurer l'écran LCD :
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // set the LCD address
void setup() {
Serial.begin(115200);
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
}Cela initialise l'écran LCD pour une utilisation, lui permettant d'afficher des messages. L'extrait suivant montre comment la connexion Wi-Fi est établie :
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //for LCD
delay(500);
}
Serial.println("WiFi connected");
}Cette fonction établit une connexion au réseau Wi-Fi spécifié, affichant un message sur l'écran LCD pendant la connexion. Enfin, la logique de changement de couleur est gérée dans la fonction de rappel :
void callback(char* topic, byte* message, unsigned int length) {
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)message[i];
}
if (String(topic) == "cheerlights") {
setColor(messageTemp);
}
}Cette fonction écoute les messages entrants sur le sujet "cheerlights" et met à jour la couleur en conséquence. Le code complet se charge en dessous de l'article, alors assurez-vous de le consulter pour l'implémentation complète.
Démonstration / À quoi s'attendre
À la fin du projet, vous pouvez vous attendre à ce que la bande LED change de couleurs en fonction des entrées d'un flux MQTT mondial. L'écran LCD affichera le nom de la couleur actuelle et combien de fois elle a été changée. Si vous déconnectez Internet, l'écran LCD indiquera "Connexion..." jusqu'à ce qu'une connexion soit rétablie (dans la vidéo à 12:30).
Les pièges courants incluent s'assurer que les broches correctes sont utilisées pour les connexions de données et vérifier que les identifiants Wi-Fi sont exacts. S'il y a des divergences dans le SSID ou le mot de passe, l'ESP32 échouera à se connecter, et l'affichage continuera à montrer le message de connexion.
Horodatages vidéo
- 00:00 Début
- 1:59 Introduction au projet
- 6:16 Explication du câblage
- 8:13 Explication du code Arduino
- 14:26 Sélection de la carte ESP32 et du port COM sur l'IDE Arduino
- 16:07 Démonstration CheerLight avec LCD
/*
* Ceci est le code original des Exemples->iot_5_cheerlight de SunFounder
* instructions vidéo complètes https://youtu.be/xEqmxMiF-E8
* 📚⬇️ Page de téléchargement et ressources https://robojax.com/RJT685
*
* J'ai ajouté un écran LCD pour afficher :
* 1- Le nom de la couleur
* 2- Comptez le nombre de fois que la couleur est mise à jour
* 3- Affichez sur l'écran LCD si le wifi est connecté
* 4- Affichez "connexion" si non connecté ou déconnecté
*
* Écrit par Ahmad Shamshiri
* www.Robojax.com
* 29 déc. 2023
*
* :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
* https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27, 16,2); // définir l'adresse LCD à 0x27 pour un affichage de 16 caractères et 2 lignes
int colorCount = 0;
int lastColor=0;
byte connected[] = {
B00001,
B00001,
B00011,
B00111,
B00111,
B01111,
B01111,
B11111
};
#include <WiFi.h>
#include <PubSubClient.h>
// #include <Wire.h>
#include <Adafruit_NeoPixel.h>
// Remplacez les variables suivantes par votre combinaison SSID/Mot de passe.
const char* ssid = "dars";
const char* password = "5152535455";
// Ajoutez l'adresse de votre courtier MQTT :
const char* mqtt_server = "mqtt.cheerlights.com";
const char* unique_identifier = "sunfounder-client-sdgvsasdda";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;
// Définir les couleurs de CheerLights prises en charge et leurs valeurs RGB
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};
int colorRGB[][3] = { 255, 0, 0, // rouge
255, 192, 203, // rose
0, 255, 0, // vert
0, 0, 255, // bleu
0, 255, 255, // cyan
255, 255, 255, // blanc
255, 223, 223, // blanc chaud
255, 223, 223, // "vieux dentelle"
128, 0, 128, // "violet"
255, 0, 255, // magenta
255, 255, 0, // jaune
255, 165, 0}; // orange
// initialiser bande RGB
#define LED_PIN 13
#define NUM_LEDS 8
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
lcd.init(); // initialiser l'écran LCD
lcd.backlight(); // Active le rétroéclairage LCD.
// paramètres par défaut du wifi
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// ruban rgb début
pixels.begin();
pixels.show();
}
void setup_wifi() {
delay(10);
// Nous commençons par nous connecter à un réseau WiFi.
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); // pour LCD
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Si un message est reçu sur le sujet, vous vérifierez ce message.
// Modifie l'état de sortie en fonction du message.
if (String(topic) == "cheerlights") {
Serial.print("Changing color to ");
Serial.println(messageTemp);
setColor(messageTemp);
}
}
void reconnect() {
// Boucle jusqu'à ce que nous soyons reconnectés.
while (!client.connected()) {
lcdConnect();
Serial.print("Attempting MQTT connection...");
// Tentative de connexion
if (client.connect(unique_identifier)) {
Serial.println("connected");
// S'abonner
client.subscribe("cheerlights");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Attendez 5 secondes avant de réessayer
delay(5000);
}
}
}
void setColor(String color) {
// Parcourez la liste des couleurs pour trouver la couleur correspondante.
for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
if (color == colorName[colorIndex]) {
lastColor = colorIndex; // souviens-toi de la dernière couleur
colorCount++; // incrémenter le compteur
// Définissez la couleur de chaque NeoPixel sur la bande.
for (int pixel = 0; pixel < NUM_LEDS; pixel++) {
pixels.setPixelColor(pixel, pixels.Color (colorRGB [colorIndex][0], colorRGB [colorIndex][1], colorRGB [colorIndex][2]));
delay(100);
}
pixels.show();
}
}
}
void lcdConnect()
{
lcd.clear();
lcd.setCursor(0, 0); // ligne 0
lcd.print("Connecting...");
lcd.setCursor(0, 1);
lcd.print("SSID:"); // ligne 1
lcd.print(ssid);
}
void loop() {
lcd.clear();
if (!client.connected()) {
reconnect();
}else{
lcd.createChar(0, connected);
lcd.setCursor(15, 0);
lcd.write(byte(0));
}
client.loop();
// première ligne
lcd.setCursor(0, 0);
lcd.print("Color: ");
lcd.print(colorName[lastColor]);
// deuxième rangée
lcd.setCursor(0, 1);
lcd.print("Changed ");
lcd.print(colorCount);
lcd.print(" times");
delay(1000); // nous devons avoir un retard pour pouvoir lire l'affichage
}
Common Course Links
Common Course Files
Ressources et références
-
DocumentationTutoriel ESP32 52/55 - Page doc SunFounder pour CheerLightdocs.sunfounder.com
Fichiers📁
Aucun fichier disponible.