IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Communication wifi entre deux modules ESP8266 programmés par IDE Arduino


Sujet :

Arduino

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 139
    Par défaut Communication wifi entre deux modules ESP8266 programmés par IDE Arduino
    Bonjour,

    J'ai tenté de résoudre le problème suivant :

    Sur un module ESP8266 je détecte l'ouverture ou la fermeture sur deux contacts et j'envoie le résultat sur le réseau WIFI.
    Sur le second module je lis le message envoyé du premier module et j'affiche par diode l'état des contacts (ouvert ou fermé).

    J'ai programmé les deux ESP8266 en m'inspirant d'exemples et le résultat n'est pas toujours conforme.

    Je pense que mes programmes ne sont pas au top et je vous les proposes à votre analyse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    #include <ESP8266WiFi.h>
     
    int pinGPIO16 = 16; //To control LED wifi connecte
    int pinGPIO05 = 5; //la porte 1 est fermée
    int pinGPIO04 = 4; //la porte 2 est fermée
     
    IPAddress ip(192 , 168 , 1 ,30);
    IPAddress gateway(192 , 168 , 1 , 1);
    IPAddress subnet(255 , 255 , 255 , 0);
     
    WiFiServer server (80);
     
    void setup()
     
    {
     
      Serial.begin(115200);
      Serial.println();
     
     
      WiFi.config(ip,gateway,subnet);
      WiFi.begin("Livebox-b", "xxxxx");
     
      Serial.print("Connecting");
      while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);
        Serial.print(".");
      }
      Serial.println();
     
      Serial.print("Connected, IP address: ");
      Serial.println(WiFi.localIP());
      pinMode(pinGPIO16, OUTPUT);
      pinMode(pinGPIO05, OUTPUT); 
      pinMode(pinGPIO04, OUTPUT);
      digitalWrite(pinGPIO16, HIGH);
      digitalWrite(pinGPIO05, LOW);
      digitalWrite(pinGPIO04, LOW);
      server.begin();
      Serial.println("Serveur demarrer !");
     
    }
     
     
     
     
    void loop()
    {
     
    WiFiClient client = server.available();
     
     
      if (client)
      {
        if (client.connected())
        {
           String request = client.readStringUntil('\r');
           Serial.println(request); 
           int porte1 = request[7];
           int porte2 = request[15];
           Serial.println(porte1);
           Serial.println(porte2);
           if (porte1 ==48)
           {
              digitalWrite(pinGPIO05, HIGH);
              Serial.println("05 high");
           }
           else
           {
              digitalWrite(pinGPIO05, LOW);
              Serial.println("05 low");
           }
           if (porte2 ==48)
           {
              digitalWrite(pinGPIO04, HIGH);
           }
           else
           {
              digitalWrite(pinGPIO04, LOW);
           }
     
           client.flush();
        }
     
     
      else
      {
        digitalWrite(pinGPIO04, LOW);
        digitalWrite(pinGPIO05, LOW);
        Serial.println("client non connecté");
      }
      }
     
        client.stop();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    #include <ESP8266WiFi.h>
    int pinGPIO16 = 16; //To control LED wifi connecte
    int pinGPIO14 = 14; //To contact porte 
    int pinGPIO12 = 12; //To contact porte 2
    int pinGPIO5 = 5; //La porte 1 est fermée
    int pinGPIO4 = 4; //La porte 2 est fermée
    int val1 = 0;
    int val2 = 0;
    String chaine;
    WiFiClient client;
    IPAddress ip(192 , 168 , 1 , 31);
    IPAddress server(192 , 168 , 1 ,30);
    IPAddress gateway(192 , 168 , 1 , 1);
    IPAddress subnet(255 , 255 , 255 , 0);
     
     
    void setup()
     
    {  
      Serial.begin(115200);
      Serial.println();
     
      WiFi.config(ip,gateway,subnet);
      WiFi.begin("Livebox-b", "xxxxx");
     
      Serial.print("Connecting");
      while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);
        Serial.print(".");
      }
      Serial.println();
     
      Serial.print("Connected, IP address: ");
      Serial.println(WiFi.localIP());
      pinMode(pinGPIO16, OUTPUT);
      pinMode(pinGPIO5, OUTPUT);
      pinMode(pinGPIO4, OUTPUT);
      pinMode(pinGPIO14, INPUT); 
      pinMode(pinGPIO12, INPUT); 
     
      digitalWrite(pinGPIO16, HIGH);
      digitalWrite(pinGPIO5, LOW); 
      digitalWrite(pinGPIO4, LOW); 
     
    }
     
     
    void testporte1()
    {
      pinMode(pinGPIO14, INPUT); 
      val1 = digitalRead(pinGPIO14);
     
      if (val1 == 1)
      {
      Serial.print("porte 1 ouverte : ");
      Serial.println(val1);
      digitalWrite(pinGPIO5, LOW);   
      }
      if (val1 == 0)
      {
      Serial.print("porte 1 fermée : ");
      Serial.println(val1);
      digitalWrite(pinGPIO5, HIGH); 
      }
    }
    void testporte2()
    {
     
      pinMode(pinGPIO12, INPUT); 
      val2 = digitalRead(pinGPIO12);
     
      if (val2 == 1)
      {
      Serial.print("porte 2 ouverte : ");
      Serial.println(val2);
      digitalWrite(pinGPIO4, LOW);   
      }
      if (val2 == 0)
      {
      Serial.print("porte 2 fermée : ");
      Serial.println(val2);
      digitalWrite(pinGPIO4, HIGH); 
      }
    }
    void cnxserveur()
    {
      client.connect(server,80);
     
      if (client.connect(server, 80)) 
      {
        Serial.println("connected");
        chaine = "porte1 ";
        chaine += val1;
        chaine += "porte2 "; 
        chaine += val2;
        chaine += "\r";
        client.println(chaine);
        client.println();
      } 
      else
      {
        Serial.println("connection failed");
      }
    }
    void loop()
    {
      delay(2000);
      testporte1();
     
      testporte2();
     
      cnxserveur();
    }
    Je vous remercie par avance de m'apporter votre aide.

    Cordialement
    Fichiers attachés Fichiers attachés
    • Type de fichier : odt p1.odt (15,0 Ko, 78 affichages)
    • Type de fichier : odt p2.odt (15,5 Ko, 48 affichages)

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 882
    Par défaut
    vous n'envoyez pas une requête GET bien formée depuis le client. cf l'exemple ClientConnect

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 139
    Par défaut
    Bonjour,

    Dans mon code je ne vois pas ou introduire le commande GET ni comment la construire

    Je suis novice dans ce genre d'exercice et je n'ai pas tout compris : j'ai surtout fait du copier/coller.

    Merci de m'aider dans ma démarche,

    Cordialement

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 882
    Par défaut
    Citation Envoyé par F6AAP Voir le message
    Bonjour,
    Dans mon code je ne vois pas ou introduire le commande GET ni comment la construire
    Bonne année 2020

    Votre requête est construite dans la. Fonction void cnxserveur(). regardez l’URL que vous construisez et comparez là à l’URL construite dans l’exemple cité ci dessous. Ils ont un GET, vous n’en avez pas. Commencez par là

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 139
    Par défaut
    Bonjour,

    Bonne année 2020.

    J e n'emploie pas le get mais l'instruction String request = client.readStringUntil('\r'); est sensé faire la même chose.

    Un des module envoie de manière cyclique l'état des swirtch l'autre réceptionne et affiche l'état.

    Ma question est de savoir si le module d'envoie est bien connecté. Quelle instruction est possible ? ping par exemple).

    Merci de vos réponse, cordialement

    Pour cela j'aurai besoin de connaître

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 882
    Par défaut
    Citation Envoyé par F6AAP Voir le message
    Je n'emploie pas le get mais l'instruction " String request = client.readStringUntil('\r');" est sensé faire la même chose.
    ça c'est sur le côté serveur, quand vous avez reçu une requête HTTP depuis un client.

    le souci c'est sur la construction de cette requête HTTP. dans l'exemple que j'ai mentionné ils font
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     if (client.connect(server, 80)) {
        Serial.println("connected");
        client.println("GET /search?q=arduino HTTP/1.0"); // NOTEZ LE GET DANS LA CHAINE
        client.println();
      } else {
        Serial.println("connection failed");
      }
    votre fonction cnxserveur elle ressemble à cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     void cnxserveur()
    {
      client.connect(server,80); // POURQUOI LE FAIRE 2 FOIS?
    
      if (client.connect(server, 80)) {  // VOUS LE FAITES DEJA ICI
        Serial.println("connected");
        chaine = "porte1 ";
        chaine += val1;
        chaine += "porte2 "; 
        chaine += val2;
        chaine += "\r";
        client.println(chaine);
        client.println();
      } 
      else
      {
        Serial.println("connection failed");
      }
    }
    ==> votre requête qui est dans la variable chaine ne comporte pas le GET et n'est pas sous la forme /programme.php?v1=xxx&v2=yyy HTTP/1.0 qu'attendrait un serveur web ou une simple URL

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 139
    Par défaut
    Bonjour,

    Merci pour votre réponse, mais je crois que j'ai du mal a assimilé la notion client/serveur.

    Comment dans le get passer l'information de l'état des portes.

    Cordialement

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 882
    Par défaut
    Citation Envoyé par F6AAP Voir le message
    Comment dans le get passer l'information de l'état des portes.
    Cordialement
    C’est une requête http comme quand vous écrivez une URL du genre

    http://mon.site.com/programme.php?v1=xxx&v2=yyy

    vous avez les paramètres dans l’URL et le GET c’est la fin de l’URL

    Ici vous n’avez pas de programme PHP donc pas forcément besoin de conserver ce formalisme mais il faut quand même dire que c’est une requête HTTP et donc l’écrire comme il faut

    Ensuite sur votre serveur il faut l’attraper correctement, ici vous utilisez une libraire qui appelle des fonctions suivant l’URL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Communication entre deux langages de programmation différents.
    Par Filadelphila dans le forum Protocoles
    Réponses: 11
    Dernier message: 14/11/2019, 17h01
  2. Réponses: 3
    Dernier message: 06/02/2019, 09h13
  3. [Radiocommunication] [ESP8266] Communication directe entre deux modules
    Par al1_24 dans le forum Embarqué
    Réponses: 2
    Dernier message: 25/01/2018, 18h35
  4. Réponses: 14
    Dernier message: 25/11/2007, 18h32
  5. Réponses: 2
    Dernier message: 30/08/2006, 18h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo