Code de recherche

Tutoriel ESP32 52/55 - Synchronisation globale WS2812 CheerLights MQTT avec LCD | Kit IoT SunFounder ESP32

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).

esp32-52-lumière-encouragement-lcd-principal

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.

cheeLights_LCD

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

ESP32-11_LCD-wiring
esp32-47-cheer-light-wiring

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

Images

ESP32-11_LCD-wiring
ESP32-11_LCD-wiring
esp32-47-cheer-light-wiring
esp32-47-cheer-light-wiring
esp32-52-cheer-light-lcd-main
esp32-52-cheer-light-lcd-main
cheeLights_LCD
cheeLights_LCD
853-ESP32 Tutorial 52/55- CheerLight MQTT and LCD
Langue: C++
/*
 * 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







}

Ressources et références

Fichiers📁

Aucun fichier disponible.