Wemos d1 switch mode wifi

Bonsoir,

Je suis nouveau, soyez cool svp.

J'ai un wemos d1
Je voudrais faire basculer avec 2 bouton physique (bouton poussoir)
En mode client ou en mode server...

Merci d'avance

Ivan

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Cela ne veut pas dire grand chose.
Etant donné qu'un ESP8266 en mode serveur peut à tout moment envoyer une requête à un autre serveur, et donc se comporter comme un client, le basculement est implicite.
Par contre si l'ESP8266 doit envoyer une requête lors d'un appui sur un bouton, qu'il le fasse, tout simplement. Il devient donc client, temporairement.
Pour résumer, l'ESP8266 est serveur par défaut, et il suffit de définir les événements (boutons, timer, etc.) qui provoqueront l'envoi de requêtes vers un ou des sites externes.

Je pensais que juste un client pouvait faire une requête sur un server en Arduino...
Mais non merci de l'info...

En faite voila
C'est pour expliquer le but

Le dispositif A doit pouvoir trouver plein de dispositif genre

Dispositif B est a 25 mètres
Dispositif C est a 15 mètres
Dispositif D est a 45 mètres
....
Le A cherche, il trouve le C ....
Il envoie une requête au C (button) "tu veux jouer"
Le C repond : oui ou non
Si oui (button) , led bleu s'allume sur le dispositif C et repond au A et une led verte s'allume sur le A
si le dispositif C repond non (button) et la led rouge sur le A s'allume et relance le scan pour détecté le suivant au plus proche.

Ainsi de suite...

mais chaque dispositif son les mêmes juste un nom diff pour identifiant unique.

Est-ce plus clair?

Non ce n'ai pas ce que t'a expliquer @hbachetti
Ce que tu dis est très approximatif, qu'appel tu un client, de même qu'appel tu un serveur en Arduino.
Avec un esp8266, tu peux ennoyer ou recevoir par exemple des requêtes HTTP, mais tu peux aussi établir des connexions TCP/IP, mais pas que :slight_smile:
Je te parle de ça parce ce que tu décris, cela me fait plus penser à des trames UDP en broadcast.
Mais je ne suis pas sûr que tu sache vraiment comment tu veux réaliser ton projet.
Il y a aussi avec des ESP d'avoir une architecture MESH, mais je ne sais pas les limites techniques

//Bouton + led ok



// set pin numbers:
const int buttonPin = 16;    // le numéro de la broche du bouton poussoir // Souris
const int buttonPin2 = 12;    // le numéro de la broche du bouton poussoir // Chat
const int ledPin = 0;      // the number of the LED pin
const int ledPin2 = 2;
// Variables will change:
int ledState = LOW;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

int ledState2 = LOW;         // the current state of the output pin
int buttonState2;             // the current reading from the input pin
int lastButtonState2 = LOW;   // the previous reading from the input pin

// the following variables are unsigned long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
/*---------------------------- Acces Point  - SOURIS------------------------*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#ifndef APSSID
#define APSSID "car-1"
#define APPSK  "car1234!"
#endif
const char *ssid = APSSID;
const char *password = APPSK;
ESP8266WebServer server(80);
void handleRoot() {
  server.send(200, "text/html", "<h1>You are connected a car-1</h1>");
}
/*---------------------------- Acces Point - SOURIS------------------------*/

/*---------------------------- Mode Station - CHAT ------------------------*/ 


//In this example, ESP8266 works in AP mode.
//wifi
#include <ESP8266WiFiMulti.h>
#include <U8g2lib.h>
#include <Wire.h>

/*oled debut*/
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// U8G2_R0 ou U8G2_R2: mode paysage, U8G2_R1 ou U8G2_R3: mode portrait
/*oled fin*/

ESP8266WiFiMulti wifiMulti;
const uint32_t connectTimeoutMs = 2000;

/*---------------------------- Mode Station - CHAT ------------------------*/

/* -------------------------------Fonction Setup---------------------------*/
void setupBtn1(){
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  // set initial LED state
  digitalWrite(ledPin, ledState);
  Serial.begin(115200);
}

void setupBtn2(){
  pinMode(buttonPin2, INPUT);
  pinMode(ledPin2, OUTPUT);
  // set initial LED state
  digitalWrite(ledPin2, ledState2);
  Serial.begin(115200);
}

void setupMulti(){
  
  //*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*In this example, ESP8266 works in AP mode.*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
Serial.begin(115200);
Serial.println("run");
//init oled
u8g2.begin();
u8g2.enableUTF8Print(); //nécessaire pour écrire des caractères accentués
// Don't save WiFi configuration in flash - optional
WiFi.persistent(false);
Serial.begin(115200);
Serial.println("\nESP8266 Multi WiFi example");
// Set WiFi to station mode

// More is possible
u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
u8g2.setFont(u8g2_font_ncenB10_tf); // choix d'une police de caractères
u8g2.setCursor(40, 20);
u8g2.print("Yeah");
u8g2.setCursor(12, 45);
u8g2.print(" ! ! ! Barjo ! ! ! ");
u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
delay(6000);
u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
u8g2.setFont(u8g2_font_ncenB10_tf); // choix d'une police de caractères
u8g2.setCursor(15, 20);
u8g2.print("Fait un choix");
u8g2.setCursor(15, 40);
u8g2.print("Souris/Chat" );
u8g2.setCursor(30, 60);
u8g2.print("!!! FDP !!!" );
u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
//*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*In this example, ESP8266 works in AP mode.*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
}
/* -------------------------------Fonction Setup---------------------------*/

void setup() {
 //appel de la fct Setup 
 setupBtn1();
 setupBtn2();
 setupMulti();
}
void loop()
{

 Bouton1();
  
 Bouton2();
 
}

void Bouton1(){
  
   // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:
    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;
      Serial.println("\n");
      Serial.println("\n");
      // ne fait basculer la LED que si le nouvel état du bouton est HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
        Serial.println(ledState);
        if (ledState == 1){
        Serial.println("Mod Souris");
          delay(1000);
          u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
          u8g2.setFont(u8g2_font_7x13B_tf); // choix d'une police de caractères
          u8g2.setCursor(30, 20);
          u8g2.print("Mod Souris");
          u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
          delay(1500);
          Serial.begin(115200);
          Serial.println();
          Serial.print("Configuring access point...");
          WiFi.softAP(ssid, password);
          IPAddress myIP = WiFi.softAPIP();
          Serial.print("AP IP address: ");
          Serial.println(myIP);
          server.on("/", handleRoot);
          server.begin();
          Serial.println("HTTP server started");
          server.handleClient();
          //affichage oled
          u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
          u8g2.setFont(u8g2_font_ncenB10_tf); // choix d'une police de caractères
          u8g2.setCursor(1, 20);
          u8g2.print("Trouve Moi FDP!");
          u8g2.setCursor(12, 45);
          u8g2.print("Je suis car-1" );
          u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
          
        }
        else{
          Serial.println("Mod Souris off ... ");
          u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
          u8g2.setFont(u8g2_font_ncenB10_tf); // choix d'une police de caractères
          u8g2.setCursor(15, 20);
          u8g2.print("Mod Souris off");
          u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
          DisableWifi();
          delay(10);
          u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
          u8g2.setFont(u8g2_font_ncenB10_tf); // choix d'une police de caractères
          u8g2.setCursor(15, 20);
          u8g2.print("Fait un choix");
          u8g2.setCursor(15, 40);
          u8g2.print("Souris/Chat" );
          u8g2.setCursor(30, 60);
          u8g2.print("!!! FDP !!!" );
          u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
          delay(10000);
          ESP.restart();
          } 
      }
    }
  }
  // définit la LED :
  digitalWrite(ledPin, ledState);
// enregistre la lecture. La prochaine fois dans la boucle,
// ce sera le lastButtonState :
  lastButtonState = reading; 
}

void DisableWifi()
{
 WiFi.disconnect();
 WiFi.mode(WIFI_OFF);
 WiFi.forceSleepBegin();
 delay(1);
}

void Bouton2(){
   // read the state of the switch into a local variable:
  int reading2 = digitalRead(buttonPin2);

  if (reading2 != lastButtonState2) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:
    // if the button state has changed:
    if (reading2 != buttonState2) {
      buttonState2 = reading2;
      // ne fait basculer la LED que si le nouvel état du bouton est HIGH
      if (buttonState2 == HIGH) {
        ledState2 = !ledState2;
        Serial.println(ledState2);
        if (ledState2 == 1){
        Serial.println("Mod Chat ....");
        u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
        u8g2.setFont(u8g2_font_7x13B_tf); // choix d'une police de caractères
        u8g2.setCursor(40, 20);
        u8g2.print("Mod Chat");
        u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
        //*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*In this example, ESP8266 works in AP mode.*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
             // WiFi.scanNetworks will return the number of networks found
            int n = WiFi.scanNetworks();
            Serial.println("scan done");
            if (n == 0) {
            Serial.println("no networks found");
            }
            // Maintain WiFi connection
            WiFi.mode(WIFI_STA);
            // Register multi WiFi networks
           // wifiMulti.addAP("car-1", "car1234!");
            wifiMulti.addAP("car-2", "car1234!");
            wifiMulti.addAP("car-3", "car1234!");
            wifiMulti.addAP("car-4", "car1234!");
            wifiMulti.addAP("car-5", "car1234!");
            wifiMulti.addAP("car-6", "car1234!");
            wifiMulti.addAP("car-7", "car1234!");
            wifiMulti.addAP("car-8", "car1234!");
            wifiMulti.addAP("car-9", "car1234!");
            wifiMulti.addAP("car-10", "car1234!");
            if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED)  {
            Serial.print("WiFi connected: ");
            Serial.print(WiFi.SSID());
            Serial.print(" ");
            Serial.println(WiFi.localIP());
            Serial.println(" --> " + WiFi.SSID());
            //oled affichage si reseau trouvé
            u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
            u8g2.setFont(u8g2_font_7x13B_tf); // choix d'une police de caractères
            u8g2.setCursor(40, 20);
            u8g2.print(WiFi.SSID());
            u8g2.setCursor(2, 45);
            u8g2.print(" ! Souris Trouvé ! ");
            u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
            }
            
            else {
              
            Serial.println("WiFi not connected!");
            u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
            u8g2.setFont(u8g2_font_7x13B_tf);
            u8g2.clearBuffer();
            u8g2.setCursor(8, 35);
            u8g2.print("... Trouve pas ... ");
            u8g2.sendBuffer();
            delay(5000);
            ESP.restart();
            }
//*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*In this example, ESP8266 works in AP mode.*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
}
        else{
          Serial.println("Mod Chat off ... ");
          u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
          u8g2.setFont(u8g2_font_ncenB10_tf); // choix d'une police de caractères
          u8g2.setCursor(15, 20);
          u8g2.print("Mod Chat off");
          u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
          DisableWifi();
          u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
          u8g2.setFont(u8g2_font_ncenB10_tf); // choix d'une police de caractères
          u8g2.setCursor(15, 20);
          u8g2.print("Fait un choix");
          u8g2.setCursor(15, 40);
          u8g2.print("Souris/Chat" );
          u8g2.setCursor(30, 60);
          u8g2.print("!!! FDP !!!" );
          u8g2.sendBuffer();  // l'image qu'on vient de construire est affichée à l'écran
          delay(5000);
          ESP.restart();
          
          
          } 
      }
    }
  }
  // définit la LED :
  digitalWrite(ledPin2, ledState2);
// enregistre la lecture. La prochaine fois dans la boucle,
// ce sera le lastButtonState :
  lastButtonState2 = reading2; 
}

j'ai pas mal bossé sur le code avec mon petit niveau, mais j'aurais besoin de conseil

 else {
              
            Serial.println("WiFi not connected!");
            u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
            u8g2.setFont(u8g2_font_7x13B_tf);
            u8g2.clearBuffer();
            u8g2.setCursor(8, 35);
            u8g2.print("... Trouve pas ... ");
            u8g2.sendBuffer();
            delay(5000);
            ESP.restart();
            }

dans cette partie au lieu de restart de voudrais qu'il relance le scan en auto tant que je ne rappuies pas sur le btn2 pour sortir... afin de recommencer a chercher...

pouvez vous m'aider??? svp ...

Du coup tu as essayé un truc du genre

while(buttonState2 == HIGH) {
    WiFi.scanNetworks();
    buttonState2 = digitalRead(buttonPin2);
}

je peux essayer mais du coup je devrais le mettre ou ca ?

apres le else que j'ai mis au dessus ou dans le else?

merci du suivi :smiley:

Je dirais à la place du restart, si c'est ce que tu veux faire.
Mais comme je ne comprend pas pourquoi tu veux faire ça à la place du restart, je ne serait trop te dire.
Pourquoi veux tu relancer le scan tant que le bouton est appuyé?
Pourquoi un seul scan ne suffit pas?

en faite le bouton n'est pas appuyé constamment je joue avec l'etat d'une led, si la led 2 est allumée logiquement il cherche l'autre esp si au bout de X temps il trouve pas, je voudrait qu'il recommence a chercher
mais non...

if (ledState2 == 1){... if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED)  { }..
.... else {}
.}
 donc normalement tant que ledState2 est true donc ledpin2  est allumé l dervrait tourner en boucle mais si il trouve pas l'autre esp il reste bloqué sur 


else {

        Serial.println("WiFi not connected!");
        u8g2.clearBuffer(); // on efface ce qui se trouve déjà dans le buffer
        u8g2.setFont(u8g2_font_7x13B_tf);
        u8g2.clearBuffer();
        u8g2.setCursor(8, 35);
        u8g2.print("... Trouve pas ... ");
        u8g2.sendBuffer();

Dans ce cas je ne suis pas sûre que ton code correspond à ce que tu veux faire.
Tu mélange tous dans ton code, du coup il est difficile le faire évoluer.

Un exemple le code suivant fait changer ton état uniquement lorsque le bouton est au niveau high

if (buttonState2 == HIGH) {
        ledState2 = !ledState2;
        ...
        int n = WiFi.scanNetworks();
}

Donc à chaque fois que tu passe dans la fonction bouton2, si le bouton est à HIGH, tu change l'état, que le bouton soit maintenue à ce niveau ou que tu ais eu le temps d'appuyer plusieurs fois.
comme en plus tu appel une fonction qui doit surement prendre du temps pour scanner les réseaux wifi disponible.
Pendant ce temps tu peux avoir appuyé plusieurs fois sur ton bouton.

Si tu veux garder ton code comme ça, peut être devrais tu simplement organiser ton code en action que tu veux faire.
par exemple :

  • lire l'état des boutons et en déduire des états(ledState2)
  • faire les actions en fonction des états précédemment calculé.

cela ne réglera pas ton problème de détection d'appuis sur le bouton, mais cela correspondra plus à ce que tu veux faire.

Une bonne chose quand on commence la programmation est de faire des diagrammes de l'algorithme que l'on veut implémenter.

merci pour tout les renseignements