Dans ce projet divertissant, vous allez connecter un capteur de couleur TCS3200D/TCS230 à un ESP32 et diffuser les couleurs détectées vers un navigateur web en temps réel. La page web présente un personnage Minion animé et ludique dont la couleur de peau se met à jour en direct selon ce que le capteur détecte. Pour simplifier la création de l'interface web et la gestion de la communication WebSocket, ce projet utilise la Exemple de WebApp personnalisée pour ESP32 - Tutoriel d'interface Web simple pour les débutants..
Voici un résumé de ce qui se passe :
L'ESP32 lit les données de couleur RGB du capteur TCS3200D/TCS230
Il convertit les valeurs RGB en code couleur HEX (par exemple, #FF8000)
Le code HEX est diffusé vers le navigateur web via WebSocket
Un Minion animé amusant sur la page web change instantanément ses couleurs de corps, bras et paupières pour correspondre à la couleur détectée
Un tutoriel vidéo étape par étape est également disponible en bas de ce guide.
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.
Prérequis
Si vous découvrez le capteur de couleur TCS3200D/TCS230 ou DIYables ESP32 WebApps, les tutoriels suivants vous aideront à vous familiariser :
Le diagramme ci-dessous montre comment connecter le capteur de couleur TCS3200 à un ESP32 :
Capteur de couleur TCS3200
ESP32
VCC
5V (VIN)
GND
GND
S0
GPIO 17
S1
GPIO 16
S2
GPIO 18
S3
GPIO 5
OUT
GPIO 19
Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
Si vous ne savez pas comment alimenter l'ESP32 et d'autres composants, consultez les instructions dans le tutoriel suivant : Comment alimenter l'ESP32..
Comment ça fonctionne
Voici le flux étape par étape de ce projet :
Chaque seconde, l'ESP32 lit le capteur de couleur en basculant entre les filtres rouge, vert et bleu en utilisant les broches de contrôle S2/S3, et mesure la largeur d'impulsion sur la broche OUT.
Les valeurs brutes de largeur d'impulsion sont converties en valeurs RGB de 0 à 255 en utilisant les données d'étalonnage (obtenues lors de ESP32 - Capteur de couleur TCS3200D/TCS230.).
Les valeurs RGB sont formatées en chaîne de couleur HEX comme #FF8000.
Cette chaîne de couleur est diffusée à tous les navigateurs web connectés via WebSocket grâce à la bibliothèque DIYables ESP32 WebApps.
Sur la page web, JavaScript reçoit la couleur et l'applique instantanément au corps, aux bras et aux paupières du personnage Minion.
Code ESP32 - Application Web Capteur de couleur Minion
Ce projet se compose de 4 fichiers :
ColorSensorESP32.ino - Sketch principal : initialise le capteur, lit les couleurs et les envoie à la page web
CustomWebApp.h - Fichier d'en-tête : déclare la classe de page d'application web personnalisée
CustomWebApp.cpp - Fichier d'implémentation : gère la messagerie WebSocket en utilisant l'identifiant "Color sensor:"
custom_page_html.h - Page web : le Minion animé construit avec HTML/CSS/JavaScript qui réagit aux couleurs reçues
ColorSensorESP32.ino
/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-color-sensor-via-web*/#include <DIYables_ESP32_Platform.h>#include <DIYablesWebApps.h>#include"CustomWebApp.h"// CHANGE THESE TO YOUR WIFI DETAILSconstchar WIFI_SSID[] = "YOUR_WIFI_SSID";constchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";// Configure TCS3200 pins for ESP32constint S0 = 17;constint S1 = 16;constint S2 = 18;constint S3 = 5;constint sensorOut = 19;// Create server and pagesESP32ServerFactory serverFactory;DIYablesWebAppServerwebAppsServer(serverFactory, 80, 81);DIYablesHomePage homePage;CustomWebAppPage customPage;unsignedlong lastColorRead = 0;voidsetup() {Serial.begin(9600);delay(1000);Serial.println("Starting Custom WebApp...");// Initialize TCS3200 pinspinMode(S0, OUTPUT);pinMode(S1, OUTPUT);pinMode(S2, OUTPUT);pinMode(S3, OUTPUT);pinMode(sensorOut, INPUT);// Set frequency scaling to 20%digitalWrite(S0, HIGH);digitalWrite(S1, LOW);// Add pages to serverwebAppsServer.addApp(&homePage);webAppsServer.addApp(&customPage);// Start WiFi and web serverif (!webAppsServer.begin(WIFI_SSID, WIFI_PASSWORD)) {while (1) {Serial.println("Failed to connect to WiFi!");delay(1000); } }Serial.println("Custom WebApp ready!"); customPage.sendToWeb("Arduino is ready!");}voidloop() {// Handle web serverwebAppsServer.loop();// Send sensor data every 1 secondif (millis() - lastColorRead > 1000) {// Read Red colordigitalWrite(S2, LOW);digitalWrite(S3, LOW);int r = map(pulseIn(sensorOut, LOW), 31, 150, 255, 0);// Read Green colordigitalWrite(S2, HIGH);digitalWrite(S3, HIGH);int g = map(pulseIn(sensorOut, LOW), 35, 180, 255, 0);// Read Blue colordigitalWrite(S2, LOW);digitalWrite(S3, HIGH);int b = map(pulseIn(sensorOut, LOW), 30, 150, 255, 0);// Convert to HEX color and send to Webchar hexColor[8]; sprintf(hexColor, "#%02X%02X%02X", constrain(r, 0, 255), constrain(g, 0, 255), constrain(b, 0, 255)); customPage.sendToWeb(String(hexColor));Serial.println("Sent to Minion: " + String(hexColor)); lastColorRead = millis(); }}
CustomWebApp.h
/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-color-sensor-via-web*/#ifndef CUSTOM_WEBAPP_H#define CUSTOM_WEBAPP_H#include <DIYablesWebApps.h>/** * Simple Custom WebApp Page * * This is a template for creating your own custom web applications. * It provides basic controls like buttons and sliders that communicate * with your Arduino in real-time. */class CustomWebAppPage : public DIYablesWebAppPageBase {private:// WebSocket message identifier for this custom appstaticconstString APP_IDENTIFIER;public: CustomWebAppPage();// ========================================// REQUIRED METHODS - USED BY LIBRARY - DON'T CHANGE THESE!// ========================================void handleHTTPRequest(IWebClient& client) override;void handleWebSocketMessage(IWebSocket& ws, const char* message, uint16_tlength) override;const char* getPageInfo() constoverride;String getNavigationInfo() constoverride;// ========================================// YOUR METHODS - USE THESE IN YOUR CODE!// ========================================void onCustomMessageReceived(void (*callback)(const String& payload));void sendToWeb(const String& message);};#endif
CustomWebApp.cpp
/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-color-sensor-via-web*/#include"CustomWebApp.h"#include"custom_page_html.h"// Define the static member - WebSocket message identifier for this custom appconstString CustomWebAppPage::APP_IDENTIFIER = "Color sensor:";// Callback function for handling messages from web browservoid (*customMessageCallback)(const String& payload) = nullptr;CustomWebAppPage::CustomWebAppPage() : DIYablesWebAppPageBase("/custom") {}void CustomWebAppPage::handleHTTPRequest(IWebClient& client) {// Send the HTML page to web browser sendHTTPHeader(client); client.print(CUSTOM_PAGE_HTML);}void CustomWebAppPage::handleWebSocketMessage(IWebSocket& ws, const char* message, uint16_tlength) {String messageStr = String(message, length);Serial.print("Color sensor WebApp received: ");Serial.println(messageStr);// Only handle messages that start with our app identifierif (messageStr.startsWith(APP_IDENTIFIER)) {String payload = messageStr.substring(APP_IDENTIFIER.length()); // Remove identifier// Call your callback function with the payloadif (customMessageCallback) { customMessageCallback(payload); } }}void CustomWebAppPage::onCustomMessageReceived(void (*callback)(const String& payload)) { customMessageCallback = callback;}void CustomWebAppPage::sendToWeb(const String& message) {// Send message to web browser with app identifierString fullMessage = APP_IDENTIFIER + message; broadcastToAllClients(fullMessage.c_str());}const char* CustomWebAppPage::getPageInfo() const {return"🔧 Color sensor WebApp";}String CustomWebAppPage::getNavigationInfo() const {String result = "<a href=\""; result += getPagePath(); result += "\" class=\"app-card custom\" style=\"background: linear-gradient(135deg, #007bff 0%, #0056b3 100%);\">"; result += "<h3>🔧 Color sensor WebApp</h3>"; result += "<p>Simple template for your own apps</p>"; result += "</a>";return result;}
Remplacez les valeurs d'étalonnage dans les appels map() à l'intérieur de loop() par les nombres que vous avez notés pendant l'étalonnage. Par exemple, si votre étalonnage a produit redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172, mettez à jour les lignes ainsi :
int r = map(pulseIn(sensorOut, LOW), 42, 210, 255, 0);int g = map(pulseIn(sensorOut, LOW), 55, 185, 255, 0);int b = map(pulseIn(sensorOut, LOW), 60, 172, 255, 0);
Cliquez sur le bouton Téléverser pour flasher le code sur l'ESP32.
Ouvrez le Moniteur série. Vous devriez voir quelque chose comme :
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
Starting Custom WebApp...
Custom WebApp ready!
INFO: Added app /
INFO: Added app /custom
DIYables ESP32 WebApp Library
Network connected!
IP address: 192.168.0.5
HTTP server started on port 80
WebSocket server started on port 81
==========================================
DIYables WebApp Ready!
==========================================
📱 Web Interface: http://192.168.0.5
🔗 WebSocket: ws://192.168.0.5:81
📋 Available Applications:
🏠 Home Page: http://192.168.0.5/
🔧 Color sensor WebApp: http://192.168.0.5/custom
==========================================
Sent to Minion: #FFD200
Sent to Minion: #00C832
Sent to Minion: #0028FF
Ln 11, Col 1
ESP32 Dev Module on COM15
2
Si rien n'apparaît, essayez d'appuyer sur le bouton reset de l'ESP32.
Copiez l'adresse IP affichée dans le Moniteur série et ouvrez-la dans un navigateur web sur votre téléphone ou ordinateur.
Par exemple : http://192.168.0.5
Sur la page d'accueil, appuyez sur la carte Color sensor WebApp pour ouvrir la page Minion.
Alternativement, allez directement à http://[ADRESSE_IP]/custom.
Vous verrez le Minion animé qui rit sur votre écran.
Tenez un objet coloré près du capteur TCS3200 — la couleur de peau du Minion se mettra à jour instantanément pour refléter la couleur détectée !
Vous pouvez suivre le guide vidéo étape par étape ci-dessous.
Comprendre le code
Côté ESP32 (ColorSensorESP32.ino)
Le sketch principal effectue ces tâches :
Configure le capteur TCS3200 : Configure S0/S1 pour une mise à l'échelle de fréquence de 20% et prépare S2/S3 pour la sélection de filtre.
Échantillonne la couleur une fois par seconde : À l'intérieur de loop(), l'ESP32 fait le cycle à travers les filtres de couleur rouge, vert et bleu, mesure la largeur d'impulsion avec pulseIn(), et convertit chaque lecture en une valeur de 0 à 255 en utilisant map() avec vos données d'étalonnage.
Formate en HEX : Les trois valeurs RGB sont combinées en une chaîne HEX (par exemple, #FF8000) en utilisant sprintf() et constrain().
Diffuse aux navigateurs : La couleur HEX est transmise à chaque client web connecté grâce à customPage.sendToWeb().
Côté page web (custom_page_html.h)
Le fichier HTML contient :
Un Minion animé en CSS uniquement : Le personnage présente des yeux qui clignent, une bouche qui rit avec une langue qui remue, et des pupilles qui bougent aléatoirement — le tout alimenté par des animations CSS et un petit intervalle JavaScript.
Écouteur WebSocket : JavaScript ouvre une connexion persistante au serveur WebSocket de l'ESP32 sur le port 81 et traite les messages de couleur entrants.
Application de couleur en direct : Chaque couleur HEX reçue est appliquée en douceur au corps, aux bras et aux paupières du Minion en utilisant une transition CSS pour un effet visuel fluide.
Reconnexion automatique : Si le WebSocket se déconnecte, la page retente la connexion toutes les 2 secondes sans intervention de l'utilisateur.
Disposition responsive : Le Minion se redimensionne automatiquement pour s'adapter à toute taille d'écran, des téléphones aux ordinateurs de bureau.
Protocole de message
Ce projet suit le framework d'application personnalisée DIYables ESP32 WebApps. Les messages sont étiquetés avec l'identifiant "Color sensor:" :
N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !