Programmation Wemos D1 avec bibliotheque ESP8266WiFi.h

a marqué ce sujet comme résolu.

Bonjour Je découvre la carte ESP8266 et je voudrais créer une commande via un smartphone de plusieurs relais. J’ai pris l’exemple wifiwebserver de cette bibliothèque. Jusque là tout va bien. Aussi quand je veux faire une commande d’une autre sortie ça ne fonctionne pas. Ca n’avait pas l’air bien compliqué au départ mais je coince. Voici le code d’origine.

#include <ESP8266WiFi.h>

const char* ssid = "your-ssid";
const char* password = "your-password";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while (!client.available()) {
    delay(1);
  }

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1) {
    val = 0;
  } else if (req.indexOf("/gpio/1") != -1) {
    val = 1;
  } else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(2, val);

  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val) ? "high" : "low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

J’ai numéroté la commande en ajoutant le N° du GPIO. (GPIO 4 et GPIO5) J’ai créé un val4 pour l’état de la sortie 4 et val5 pour la sortie 5. Mais à la commande à 1 de mon GPIO5 ma valeur val5 devient 1073671544 !!! Je ne comprends pas…??? Voici l’extrait de mon code modifié

 // prepare GPIO5 D1
  pinMode(5, OUTPUT);
  digitalWrite(5, 0);

   // prepare GPIO4 D2
  pinMode(4, OUTPUT);
  digitalWrite(4, 0);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while (!client.available()) {
    delay(1);
  }

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  // Match the request
int val4;
int val5;
  if (req.indexOf("/gpio5/0") != -1) {
    val5 = 0;
  } else if (req.indexOf("/gpio5/1") != -1) {
    val5 = 1;
  } 
  else if (req.indexOf("/gpio4/0") != -1) {
    val4 = 0;
  } 
  else if (req.indexOf("/gpio4/1") != -1) {
    val4 = 1;
  } 
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(4, val4);
  digitalWrite(5, val5);
  Serial.println(val4);
  Serial.println(val5);
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val4) ? "high" : "low";
  s += (val5) ? "high" : "low";
  s += "</html>\n";

Merci de votre aide

+0 -0

Coucou,

Ton sujet concerne Arduino n’est-ce pas ? Tu auras peut-être plus de chance dans la section "Système et Matériel". Ici, c’est un composant assez spécifique que je n’ai jamais manipulé.

Par-contre, si val5 vaut autre chose que -1 ou 0 c’est très certainement que tu n’entres jamais dans les blocs lignes 55 et 57. Pour le confirmer tu peux initialiser tes variables.

C’est à dire :

  // Match the request
int val4 = 42;  // Si tu vois afficher 42, c'est que val4 n'est jamais modifier
int val5 = 1337; // Si tu vois afficher 1337, c'est que val5 n'est jamais modifier
  if (req.indexOf("/gpio5/0") != -1) {
    val5 = 0;
  } else if (req.indexOf("/gpio5/1") != -1) {
    val5 = 1;
  } 
  else if (req.indexOf("/gpio4/0") != -1) {
    val4 = 0;
  } 
  else if (req.indexOf("/gpio4/1") != -1) {
    val4 = 1;
  } 
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

En C\C++ et donc Arduino, une variable non initialisée n’a pas pour valeur 0 mais une valeur un peu aléatoire. D’où le fait que si elle n’est jamais modifiée, elle garde sa valeur aléatoire.

Je ne peux pas plus t’aider pour ce problème spécifique mais -1 étant la valeur de retour courante pour signaler une erreur, je suppose que tes tests échoues. Il faut comprendre pourquoi.

PS: J’en ai profiter pour déplacer le sujet et rajouter la bonne coloration syntaxique à ton code.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte