Bonjour bryansurf
Sur la lancée, j'ai fait une version TCP, avec l'aide de l'IA, un peu arrangé par la suite.
Comme la version UDP, il faut d'abord installer le récepteur afin de renseigner l'émetteur de son adresse IP:
const char* tcpHost = "192.168.1.122"; // Mettre ici l'adresse IP du récepteur
Il y a quelques plus par rapport à la version UDP:
Côté émetteur:
avec la commande de couleur, s'ajoute l'intensité (0-255)
sendMessage("ORANGE", 127);
Au récepteur, la LED ORANGE sera à moitié allumée.
Il y a possibilité, depuis la ligne de commande du moniteur (115200),

d'envoyer des ordres au récepteur;
VERT,127 Allume la LED à moitié
ORANGE,255 Allume la ORANGE en plein
ROUGE,0 Eteint la ROUGE.
Autant du côté émetteur que du côté récepteur, il y a des indications quant au fonctionnement du programme.
L'émetteur:
/*
Name: Test_TCPsender.ino
Created:
Author: jpbbricole/IA
https://chatgpt.com/share/66fec528-ea1c-8013-bf88-0d44719ba34d
Remarque: Envoi de commandes via TCP avec quittance du récepteur.
Les commandes s'envoient par 3 boutons ou des commandes dans le moniteur
La commande ORANGE,127 allume à moitié la LED ORANGE, au récepteur
L'émetteur est identifié par la variable emitterID
*/
#include <WiFi.h>
#include <WiFiClient.h>
// Paramètres WiFi
const char* ssid = "ton-SSID";
const char* password = "ton-Password";
// Adresse IP du serveur (récepteur)
const char* tcpHost = "192.168.1.122"; // Mettre ici l'adresse IP du récepteur
const uint16_t tcpPort = 5410; // Port à utiliser
// Pins des boutons
const int btnVertPin = 13;
const int btnOrangetPin = 12;
const int btnRougetPin = 14;
// Identification de l'émetteur
const char* emitterID = "EM1"; // Adapter pour chaque ESP32 (EM2, EM3, etc.)
// Structure des données à envoyer
struct Message {
char emitterID[10];
char ledName[10]; // "VERT", "ORANGE", "ROUGE"
int ledIntensity; // Intensité de la LED à allumer (0-255)
};
void setup() {
// Initialisation série
Serial.begin(115200);
// Configuration des boutons
pinMode(btnVertPin, INPUT_PULLUP);
pinMode(btnOrangetPin, INPUT_PULLUP);
pinMode(btnRougetPin, INPUT_PULLUP);
// Connexion WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connexion au WiFi...");
}
Serial.print("Connecté au réseau WiFi avec l'adresse IP: ");
Serial.println(WiFi.localIP());
}
void loop() {
// S'il y a une commande moniteur
if (Serial.available()) {
cmdExecute(Serial.readStringUntil('\n'));
}
// Vérification des boutons et envoi du message correspondant
if (digitalRead(btnVertPin) == LOW) {
sendMessage("VERT", 0); // Intensité 255 pour le maximum
delay(500); // Anti-rebond
}
if (digitalRead(btnOrangetPin) == LOW) {
sendMessage("ORANGE", 127);
delay(500); // Anti-rebond
}
if (digitalRead(btnRougetPin) == LOW) {
sendMessage("ROUGE", 255);
delay(500); // Anti-rebond
}
}
//------------------------------------- Fonction d'envoi d'un message TCP
void sendMessage(const char* ledColor, int ledIntensity) {
WiFiClient client;
if (client.connect(tcpHost, tcpPort)) {
Serial.println("Connecté au serveur");
Serial.println("\tEnvoi de " + (String)ledColor + " " + String(ledIntensity));
// Préparation du message
Message tcpData;
strncpy(tcpData.emitterID, emitterID, sizeof(tcpData.emitterID));
strncpy(tcpData.ledName, ledColor, sizeof(tcpData.ledName));
tcpData.ledIntensity = ledIntensity;
// Envoi du message
client.write((uint8_t*)&tcpData, sizeof(tcpData));
// Lecture de la réponse du serveur
while (client.connected()) {
if (client.available()) {
String response = client.readString();
Serial.println("\t\tRéponse du serveur: " + response);
break;
}
}
client.stop();
} else {
Serial.println("Erreur de connexion au serveur");
}
}
//------------------------------------- Commandes moniteur CMD,PARAM
void cmdExecute(String cmdRx){
cmdRx.trim(); // Nettoyage de cmd
cmdRx.toUpperCase(); // En majuscules
cmdRx.replace(" ", ""); // Supprimer les espaces
Serial.println("Moniteur : " + cmdRx);
String cmd = cmdRx.substring(0, cmdRx.indexOf(","));
int cmdParam = cmdRx.substring(cmdRx.indexOf(",") +1).toInt();
sendMessage(cmd.c_str(), cmdParam);
}
Le récepteur:
/*
Name: Test_TCPreceiver.ino
Created:
Author: jpbbricole/IA
https://chatgpt.com/share/66fec528-ea1c-8013-bf88-0d44719ba34d
Remarque:
*/
#include <WiFi.h>
#include <WiFiServer.h>
// Paramètres WiFi
const char* ssid = "ton-SSID";
const char* password = "ton-Password";
const int ledVertPin = 9;
const int ledOrangetPin = 10;
const int ledRougetPin = 11;
// Structure des données reçues
struct Message {
char emitterID[10];
char ledName[10]; // "VERT", "ORANGE", "ROUGE"
int ledIntensity; // Intensité de la LED à allumer (0-255)
};
WiFiServer server(5410);
void setup() {
// Initialisation série
Serial.begin(115200);
// Configuration des LEDs
pinMode(ledVertPin, OUTPUT);
pinMode(ledOrangetPin, OUTPUT);
pinMode(ledRougetPin, OUTPUT);
// Connexion WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connexion au WiFi...");
}
Serial.print("Connecté au réseau WiFi avec l'adresse IP: ");
Serial.println(WiFi.localIP());
// Démarrage du serveur TCP
server.begin();
}
void loop() {
WiFiClient client = server.available(); // Vérifie s'il y a un client
if (client) {
Serial.println("Client connecté");
Message tcpData;
int bytesReceived = client.read((uint8_t*)&tcpData, sizeof(tcpData));
if (bytesReceived == sizeof(tcpData)) {
Serial.print("Message reçu de: ");
Serial.println(tcpData.emitterID);
Serial.print("\tledName: ");
Serial.print(tcpData.ledName);
Serial.print("\tIntensité: ");
Serial.println(tcpData.ledIntensity);
String cmdOk = "OK";
// Contrôle des LEDs
if ((String)tcpData.ledName == "VERT") {
analogWrite(ledVertPin, tcpData.ledIntensity);
} else if ((String)tcpData.ledName == "ORANGE") {
analogWrite(ledOrangetPin, tcpData.ledIntensity);
} else if ((String)tcpData.ledName == "ROUGE") {
analogWrite(ledRougetPin, tcpData.ledIntensity);
} else {
cmdOk = "???"; // Si commande inconnue
}
// Envoi de la quittance
String ackMessage = "Recu de " + (String)tcpData.emitterID;
ackMessage += "\n\t\tCouleur recue: ";
ackMessage += tcpData.ledName;
ackMessage += " ";
ackMessage += tcpData.ledIntensity;
ackMessage += " ";
ackMessage += cmdOk;
client.print(ackMessage);
}
client.stop(); // Ferme la connexion avec le client
Serial.println("Client déconnecté");
}
}
A +
Cordialement
jpbbricole