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
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
....
}
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 ?
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.