Actionner un bouton sur un Arduino et transmettre via wifi l'information sur un autre pour allumer des leds

Merci à tous, j'ai essayé aussi de mon coté mes cela ne fonctionne pas ... je vais reprendre ce que vous m'avez proposé :wink:

#include <WiFi.h>
#include <WiFiClient.h>

// Broches des boutons et LEDs (seulement pour tester localement)
const int buttonGreenPin = 5;
const int buttonYellowPin = 6;
const int buttonRedPin = 7;

const int ledGreenPin = 9;
const int ledYellowPin = 10;
const int ledRedPin = 11;

// Informations de connexion WiFi
char ssid[] = "Votre_SSID";          
char password[] = "Votre_MotDePasse";  
const char* arduino2_ip = "192.168.1.100"; // Adresse IP d'Arduino 2
WiFiClient client;

void setup() {
  // Configurer les boutons et LEDs
  pinMode(buttonGreenPin, INPUT_PULLUP);
  pinMode(buttonYellowPin, INPUT_PULLUP);
  pinMode(buttonRedPin, INPUT_PULLUP);
  pinMode(ledGreenPin, OUTPUT);
  pinMode(ledYellowPin, OUTPUT);
  pinMode(ledRedPin, OUTPUT);
  
  // Éteindre les LEDs au départ
  eteindreToutesLesLeds();

  // Initialisation de la connexion série et WiFi
  Serial.begin(9600);
  WiFi.begin(ssid, password);

  // Attendre la connexion au réseau WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connexion au WiFi...");
  }
  Serial.println("Connecté au WiFi !");
}

void loop() {
  int buttonGreenState = digitalRead(buttonGreenPin);
  int buttonYellowState = digitalRead(buttonYellowPin);
  int buttonRedState = digitalRead(buttonRedPin);

  if (buttonGreenState == LOW) {
    allumerLed(ledGreenPin);
    sendColorToArduino2("VERT");
  } else if (buttonYellowState == LOW) {
    allumerLed(ledYellowPin);
    sendColorToArduino2("JAUNE");
  } else if (buttonRedState == LOW) {
    allumerLed(ledRedPin);
    sendColorToArduino2("ROUGE");
  }
  delay(500);  // Anti-rebond pour éviter plusieurs envois à la fois
}

void allumerLed(int ledPin) {
  eteindreToutesLesLeds();
  digitalWrite(ledPin, HIGH);
}

void eteindreToutesLesLeds() {
  digitalWrite(ledGreenPin, LOW);
  digitalWrite(ledYellowPin, LOW);
  digitalWrite(ledRedPin, LOW);
}

void sendColorToArduino2(String color) {
  if (client.connect(arduino2_ip, 80)) {
    client.print(color);  // Envoyer la couleur à Arduino 2
    client.stop();
    Serial.println("Couleur envoyée : " + color);
  } else {
    Serial.println("Erreur de connexion à Arduino 2");
  }
}
#include <WiFi.h>
#include <WiFiServer.h>

const int ledGreenPin = 9;
const int ledYellowPin = 10;
const int ledRedPin = 11;

WiFiServer server(80);  // Démarrage du serveur sur le port 80

// Informations de connexion WiFi
char ssid[] = "Votre_SSID";          
char password[] = "Votre_MotDePasse";

void setup() {
  // Configurer les LEDs
  pinMode(ledGreenPin, OUTPUT);
  pinMode(ledYellowPin, OUTPUT);
  pinMode(ledRedPin, OUTPUT);

  // Éteindre les LEDs au départ
  eteindreToutesLesLeds();

  // Initialisation de la connexion série et WiFi
  Serial.begin(9600);
  WiFi.begin(ssid, password);

  // Attendre la connexion au WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connexion au WiFi...");
  }
  Serial.println("Connecté au réseau WiFi !");

  // Démarrer le serveur
  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    Serial.println("Client connecté");
    String req = client.readStringUntil('\r');
    client.flush();

    // Afficher la requête reçue pour le débogage
    Serial.println("Requête reçue : " + req);

    if (req.indexOf("VERT") != -1) {
      allumerLed(ledGreenPin);
    } else if (req.indexOf("JAUNE") != -1) {
      allumerLed(ledYellowPin);
    } else if (req.indexOf("ROUGE") != -1) {
      allumerLed(ledRedPin);
    }

    client.stop();
    Serial.println("Client déconnecté");
  }
}

void allumerLed(int ledPin) {
  eteindreToutesLesLeds();
  digitalWrite(ledPin, HIGH);
  delay(1000);  // Délai pour éviter le clignotement rapide
}

void eteindreToutesLesLeds() {
  digitalWrite(ledGreenPin, LOW);
  digitalWrite(ledYellowPin, LOW);
  digitalWrite(ledRedPin, LOW);
}

si vous pouvez éviter les String, ce sera pas plus mal...

c'est a dire ?

et

ça ne sert pas à grand chose d'envoyer le texte de la couleur. passez juste un octet qui dit quelle couleur vous voulez allumer ou quel N° de pin vous voulez activer

Bonjour J-M-L

Oui, dans ce cas, mais l'envoi de String peut démontrer comment envoyer des commandes plus complexes que de simples indexes, et là les String ont toute leur place.

Cordialement
jpbbricole

le besoin c'était

donc on pouvait faire plus simple :slight_smile:

Cela dit oui, on peut passer un peu ce que l'on veut.

Comme ça arrive sous forme de groupes d'octets, on pourrait quand même se passer d'une String, d'ailleurs votre structure utilise une cString

donc pourquoi ensuite dupliquer la mémoire et passer avec des Strings...

au lieu de

vous pouviez écrire simplement

      if (strcmp(tcpData.ledName, "VERT") == 0) {
        analogWrite(ledVertPin, tcpData.ledIntensity);
      } else if (strcmp(tcpData.ledName, "ORANGE") == 0) {
        analogWrite(ledOrangetPin, tcpData.ledIntensity);
      } else if (strcmp(tcpData.ledName, "ROUGE") == 0) {
        analogWrite(ledRougetPin, tcpData.ledIntensity);
      } 

ou au lieu de

vous pouviez faire

client.print(F("Recu de "));
client.print(tcpData.emitterID);
client.print(F("\n\t\tCouleur recue: "));
client.print(tcpData.ledName);
client.write(' ');
client.print(tcpData.ledIntensity);
client.write(' ');
client.print(cmdOk);

Bonjour J-M-L

Parce que pour moi, les Strings sont nettement plus aisées à utiliser, c'est d'ailleurs pour ça quelles ont été crées, pour faciliter le traitement de chaînes de caractères.
Je sais quelles ne sont pas "aimées" de tous.

Et puis, en programmation, il y a autant de façons de programmer qu'il y a de programmeur :wink:

Cordialement
jpbbricole

D'accord merci je vais faire les modifications merci.

On ne peut pas dire que le code que j’ai proposé ci dessus est compliqué… si ?

Bonsoir bryansurf

Est ce qu'une de ces "proposition" fonctionne?

Cordialement
jpbbricole

Non, ce n'est pas ce que j'ai voulu dire, c'est simplement une autre façon de faire, personnellement, je suis plus à l'aise avec les Strings.

Cordialement
jpbbricole

Pour l'instant le wifi ne fonctionne pas.

Ca veut dire qu'autant l'émetteur que le récepteur ne peuvent se connecter à ton Wifi ou ils se connectent mais ne se "voient" pas?

j'ai fait un test wifi il n'arrive pas à se connecter

tu as bien mis ton non de réseau et ton mot de passe?

oui

Je n'ai pas essayé, mais c'est a peu près la même chose qu'avec une trame UDP.

Plus simple pour le développeur, mais moins pour l'utilisateur :slight_smile:

C'est plus pour savoir que ça existe et qu'a l'occasion, ca peut valoir le coup de passer un peu de temps dessus.

Oui et non, dans ce cas là il y un aller retour, donc oui, il faut traiter le timeout du retour.

C'est sûr que c'est plus aisés et encore cela se discute sur de gros projets gourmand en mémoire.
Je ne sais plus de quand les Strings dates, mais c'est massivement utiliser sur des PC ou la mémoires n'est plus un aspect de contrainte et les temps de traitements non plus.

@jpbbricole c'est plus aisé surtout sur des traitements complexes, mais pour faire un test d'égalité ou de commence par, franchement ça ce vaut.
A la limite c'est un peu moins lisible.

Je pense que l'idée de @J-M-L est que connaissant les contraintes des microcontrôleurs(surtout les 8bits), il est bon lorsque on le peut aisément, prendre l'habitude de ce passer de cette sur couche.

Pour le coup, ce n'est pas une façon de programmer, mais de conséquence et ce que cela engendre.
tu peux par exemple programme sans retour chariot, pour autant il ne faut pas s'étonner, que l'on ne conseille pas de faire.
Là c'est un conseille qui se justifie, pas un reproche personnel.

Bonsoir terwal

Pour le sport je vais demander à l'IA d'ajouter cette possibilité de broadcast au programme.