Projet existant et monitoring web

Bonjour

J'ai une petite question mais je voulais etre sur de comprendre.
J'a un systeme arduino que j'ai fait moi meme, qui pilote mes deux portes de poulailler (enclos + poulailler) par le biai de photoresistance qui ouvre et se ferme en fonction de la luminosité.

J'aurais aimé ajouté un monitoring de ce systeme sur une interface web, qui afficherai, les valeurs de luminosité detecté, et l'etat des portes et des differents capteurs haut et bas des portes.

J'ai commencé a regarder ca sur une nouvelle carte arduino wifi que j'ai achété, mais il y a un truc que je comprend pas dans la programmation de ses mini serveurs web, j'ai l'impression que le serveur web empêche un autre process de tourner, est ce que je me trompe ?
Notamment a cause de ce code la

 // Main loop

void loop(){
  // Create a client and listen for incoming clients
  WiFiClient client = server.available();   
  
  // Do nothing if server is not available
  if (!client) {
     return;
  }
  
  // Wait a client 
  while(!client.available()){}

....
}

Si je ne fais pas ce code, j'arrive pas a faire marche mon server web, mais ce code la empêcherai l'exécution de mon process de fermetures de portes ...

Bref j'ai besoin d'aide ou d'éclaircissement ...
Merci d'avance
Alex

Bonjour

le serveur n'a pas en permanence un ou des clients à servir...
.
insérer la gestion du 'process' dans la boucle d'attente d'un client , le serveur pourra travailler au poulailler au lieu de se tourner les pouces....

c'est cette partie du code qui empêche le reste de votre code de tourner puisque si personne ne se connecte la loop() est relancée

écrivez le code comme ceci à la place

void loop(){
 // gestion des requêtes web
  WiFiClient client = server.available();    
  if (client) { 
    while(!client.available()) {
      ... // gestion web avec déconnexion en fin de réponse pour sortir du while
  
      client.stop();
    }
  } 

  // ici le reste de votre code de gestion du poulailler
  ....
}

Super merci je vais essayer ça. Vous avez peut etre sauvé quelques jours de recherche et de test infructueux
Merci beaucoup je vous tiens au courant

Comme dit le proverbe, aide-toi et dieu t'aidera.
Dans le monde ARDUINO, Dieu s'appelle Console ou Moniteur Série.
Pour savoir pourquoi la loop() ne travaille pas comme tu le souhaites :

Hello, c'est encore moi.
Bon j'ai suivi vos conseils (enfin je crois).
J'ai ajouté un test le lecture de niveau de lumière sur ma photorésistance pour afficher uniquement la valeur, afin de tester que ca fonctionne.
J'ai donc ce code la


// Load Wi-Fi library
#include <ESP8266WiFi.h>

// Entree Lumiere
int Luminosite = 0;
int EntreeLumiere = A0;

// Replace with your network credentials
const char* SSID = XXXX";
const char* PASSWORD = "YYYYYY";

// Set web server port number to 80
WiFiServer server(80);

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

  // Connect to Wi-Fi network with SSID and PASSWORD
  Serial.print("Connecting to ");
  Serial.println(SSID);
  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address 
  Serial.println("");
  Serial.println("WiFi connected at IP address:");
  Serial.println(WiFi.localIP());

  // Start Web Server
  server.begin();
}

// Main loop
void loop(){
  // Create a client and listen for incoming clients
  WiFiClient client = server.available();   
  
  // Do nothing if server is not available
  if (client) {
    while(client.available()){
        // A new client is connected, get the request
        String request = client.readStringUntil('\r');
        Serial.println(request);
        client.flush();
              
        // Display GPIO status
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println(""); 
        client.println("<!DOCTYPE HTML>");
        client.println("<html>");
        client.print("Etat Lumiere: "); 
        client.println("<br><br>");
        client.println(String(Luminosite));
        client.println("<br><br>");
        client.println("</html>");
      
        Serial.println(""); 

        client.stop();
    }
  }
  else
  {
    Luminosite = analogRead(EntreeLumiere);
    Serial.println(String(Luminosite)); 
  }
}

Et ce que je comprends pas, c'est que dés que je met le code dans le Else qui permet de lire l'entrée "lumiere", ma page web ne se connecte plus, par contre dans la console je vois bien la valeur de la lecture de l'entrée analogique. Et si j'enlève le code, le web server refonctionne.
J'ai raté un truc ?

Encore merci pour votre aide.
Zed

vous ne videz pas complètement le client donc il n'est pas libéré

essayez un truc comme cela

// Load Wi-Fi library
#include <ESP8266WiFi.h>

// Entree Lumiere
const byte pinCapteurLuminosite = A0;
int luminosite = 0;

// Replace with your network credentials
const char* SSID = "XXXX";
const char* PASSWORD = "YYYYYY";

// Set web server port number to 80
WiFiServer server(80);

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

  // Connect to Wi-Fi network with SSID and PASSWORD
  Serial.print("Connecting to ");
  Serial.println(SSID);
  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address
  Serial.println("");
  Serial.println("WiFi connected at IP address: ");
  Serial.println(WiFi.localIP());

  // Start Web Server
  server.begin();
  luminosite = analogRead(pinCapteurLuminosite);
}

// Main loop
void loop() {
  // Create a client and listen for incoming clients
  WiFiClient client = server.available();

  // Do nothing if server is not available
  if (client) {
    while (client.available()) client.read();
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println();
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.println("Etat Lumiere:<br><br>");
    client.println(luminosite);
    client.println("<br><br>");
    client.println("</html>");
    client.stop();
  } else {
    static uint32_t chrono = -1000;
    if (millis() - chrono >= 1000) {
      chrono += 1000;
      luminosite = analogRead(pinCapteurLuminosite);
      Serial.println(luminosite);
    }
  }
}

j'ai rajouté un bout de code qui fait qu'on ne met à jour la luminosité qu'une fois par seconde, ce doit être bien suffisant

Effectivement ca fonctionne, mais j'aimerais bien comprendre exactement ce que j'ai raté.
Je renvoyais la page tant que mon client était available, a priori c'est pas ce qu'il fallait faire.
Est ce bien cela ?
En tout cas merci pour votre aide.

PS: pour mon test j'avais pas mis de tempo de lecture de lumiere, sur mon proramme du poulailler elle est recuperée toutes les 5 mins.

Vous faisiez stop sans avoir vidé le buffer du client ce qui fait que la resource n’était pas libérée (flush ne vide pas le buffer en entrée)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.