Go Down

Topic: Problèmes de compréhension programmation arduino uno wifi.  (Read 912 times) previous topic - next topic

Vidou12

Bonjour.

J'ai fais l'achat (il y a peut), de la carte aduino uno wifi.
Tout content je m'empresse de regarder les programmes d'exemples et de les envoyer sur la carte pour les analyser et comprendre le fonctionnement de la bibliothèque (qui visiblement n'a aucun tuto ou aide ou quoi que ce soit d'autre... bref), et tout content du résultat en local, je m'empresse de le relier à internet.

Parfait, j'ai maintenant accès à mon aduino uno wifi n'importe ou dans le monde trop cool !
j'allume ma diode D13, je l'éteint, trop de la balle  :)  :) !!!

Maintenant c'est bien joli tout ça mais il serait bon de voir ce que duino à dans le ventre...

Et c'est là que je galère...

j'ai ce code dans l'exemple blink par exemple :

Code: [Select]
void process(WifiData client) {
  // read the command
  String command = client.readStringUntil('/');

  if (command == "webserver") {
    WebServer(client);
  }

  if (command == "digital") {
    digitalCommand(client);
  }
}


en gros j'ai 2 adresses :  http://<ip arduino>/arduino/webserver et http://<ip arduino>/arduino/digital.

si webserver, alors on est dans le cas de figure :
Code: [Select]
  if (command == "webserver") {
    WebServer(client);
  }


WebServer(client); est ceci :

Code: [Select]
void WebServer(WifiData client) {

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println();
  client.println("<html>");

  client.println("<head> </head>");
  client.print("<body>");

  client.print("Click<input type=button onClick=\"var w=window.open('/arduino/digital/13/1','_parent');w.close();\"value='ON'>pin13 ON<br>");
  client.print("Click<input type=button onClick=\"var w=window.open('/arduino/digital/13/0','_parent');w.close();\"value='OFF'>pin13 OFF<br>");

  client.print("</body>");
  client.println("</html>");
  client.print(DELIMITER); // very important to end the communication !!!

}



jusque ici je comprends à peut près mais j'ai tout de même une question :

dans ma fonction loop j'ai ceci :

Code: [Select]
void loop() {

    while(Wifi.available()){
      process(Wifi);
    }
  delay(50);
}


je ne comprends rien car la procédure process prends pour paramètre mon objet Wifi, et après quand on regarde la procédure (1er code envoyé), on vois qu'il demande un objet "WifiData" qu'il va nommé client. Mais client est lui aussi un objet (et comme on dispose d'aucune info sur la bibliothèque, j'ai aucune idée des paramètres qu'elle possède... bref.)

Mais cette question n'est pas celle qui me préoccupe le plus.

Si je remplace, à mon code :

Code: [Select]

  if (command == "webserver") {
    WebServer(client);
  }


"webserver" par autre chose, ma page ne se lis plus.

il en va de même pour digital.
Pourquoi ???

J'ai une dernière question :


J'en suis arrivé à ce code là :

Code: [Select]
void digitalCommand(WifiData client)
{
  int pin = 0;

  // Read pin number
  pin = client.parseInt();

  client.print(F("<!DOCTYPE html>"));
  client.print(F("<html>"));
  client.print(F("<head>"));
  //client.print(F("<meta charset=""utf-8"" />"));
  //client.print(F("<title></title>"));
  client.print(F("</head>"));
  client.print(F("<body>"));
 
  if (pin == 1)
  {
    tone(13,3000,300);

    client.print("Ouverture en cours...");
    client.print("Ouverture terminée.");
  }


  client.print(F("</body>"));
  client.print(F("</html>"));
  client.println(DELIMITER); // very important to end the communication !!! 
}


ce code m'affiche bien à l'écran les lignes "Ouverture en cours...Ouverture terminée."

mais si j'enlève la partie commentée, je n'ai qu'une partie des lignes : "Ouverture" qui s'affiche.

Pourquoi diable est il aussi feignant ???

Si déjà vous pouvez m'éclaircir la vue avec ces questions... ce sera énorme.

Merci d'avoir pris le temps de me lire et désolé du pavé...

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vidou12

Code: [Select]
#include <Wire.h>
#include <UnoWiFiDevEd.h>

void setup()
{
    pinMode(13,OUTPUT);
    Wifi.begin();
    Wifi.println(F("Web Server is up"));
}
void loop()
{
    while(Wifi.available())
    {
      process(Wifi);
    }
  delay(50);
}

void process(WifiData client)
{
  // read the command
  String command = client.readStringUntil('/');

  if (command == "webserver")
  {
    WebServer(client);
  }

  if (command == "digi")
  {
    digitalCommand(client);
  }
}

void WebServer(WifiData client)
{
    int i = 0;
  client.println(F("HTTP/1.1 200 OK"));
  client.println(F("Content-Type: text/html"));
  client.println();
  client.print(F("<!DOCTYPE html>"));
  client.print(F("<html>"));
  client.print(F("<head>"));
  client.print(F("<meta charset=""utf-8"" />"));
  client.print(F("<title>Poulailler St Baudille</title>"));
  client.print(F("</head>"));
  client.print(F("<body>"));
  client.print(F("blabla lien vers page de presentation sur serveur ftp"));
    client.print(F("</body>"));
  client.print(F("</html>"));
  client.println(DELIMITER); // very important to end the communication !!!
}
void digitalCommand(WifiData client)
{
  int pin = 0;

  // Read pin number
  pin = client.parseInt();

  client.print(F("<!DOCTYPE html>"));
  client.print(F("<html>"));
  client.print(F("<head>"));
  //client.print(F("<meta charset=""utf-8"" />"));
  //client.print(F("<title></title>"));
  client.print(F("</head>"));
  client.print(F("<body>"));
 
  if (pin == 1)
  {
    tone(13,3000,300);
 
    client.println(F("Ouverture en cours...<br />"));
    client.println(F("Ouverture terminée."));
  }
   
  else
  {
    tone(13,4500,300);

    client.print("Fermeture en cours...");
    client.print("Fermeture terminée.");
  }

  client.print(F("</body>"));
  client.print(F("</html>"));
  client.println(DELIMITER); // very important to end the communication !!! 
}



voila le code complet!

J-M-L

Wifi est une instance de la classe ArduinoWifiClass définie à la fin de UnoWiFiDevEd.cpp par
Code: [Select]
ArduinoWifiClass Wifi;

Cette classe est définie ainsi dans UnoWiFiDevEd.h
Code: [Select]
class ArduinoWifiClass : public WifiData, elle hérite donc de la classe WifiData

c'est pour cela que vous pouvez passer à votre fonction process Wifi comme étant de type WifiData, c'est une sorte de Wifi data, un peu plus spécialisé.




la fonction process(Wifi); finalement ne fait que lire ce qui est envoyé dans le cadre d'une requête HTTP et extrait petit à petit des bouts de code compris jusqu'à un  '/' donc si la requête ressemble à un

-----
GET /webserver/xxx HTTP/1.1
Host: www.server.fr
Connection: close


-----
alors la première fois ça lit GET puis vous trouvez le mot clé webserver et quand vous continuez à lire le flux entrant dans votre appel de fonction vous aurez xxx ensuite à lire

--> tout dépend donc de la structure de l'URL passée en GET
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vidou12

d'accord ! merci pour la réponse qu wifiData je comprends un peut mieux.

Mais pour ce qui est du reste, ça m'explique pas pourquoi si je remplace  "webserver" par "toto" par exemple, je n'ai pas accès à cette page  :(

ni pourquoi je suis limité dans les caractères d'affichage de ma page...

 

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vidou12

si je remplace "webserver" dans la ligne de commande

Code: [Select]
if (command == "webserver"),

par "toto" par exemple :

Code: [Select]
if (command == "toto")

et que mon adresse deviens : "http://monIP/arduino/toto" ça ne fonctionne pas.

Alors que "http://monIP/arduino/webserver" fonctionne quand le code est "normal" :

Code: [Select]
if (command == "webserver").

Si j'ai bien compris ça devrais fonctionner avec toto non ?

J-M-L

Vous êtes sûr que vous ne tapez pas plutôt
http://monIP/arduino/webserver/?

et si vous essayez avec

http://monIP/arduino/toto/

(votre code provient d'un des exemples inclus et ils disent bien au début du code

Code: [Select]
/*
File: WebServer.ino
This example creates a simple web server on your Arduino Uno WiFi. It serves a
simple web page which shows values of the analog pins, and refreshes every 20 seconds.
Please type on your browser http://<IP>/arduino/webserver/ or http://<hostname>.local/arduino/webserver/

Note: works only with Arduino Uno WiFi Developer Edition.

http://www.arduino.org/learning/tutorials/boards-tutorials/webserver
*/


--> ils mettent bien un '/' en fin de ligne

pour vous assurer de ce qu'il se passe, imprimez command à chaque fois... ça vous donnera une idée de ce que fait le programme
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vidou12

oui c'est ce qui est marqué mais avec ou sans / c'est pareil, webserver fonctionne mais pas toto ou autre.

je vais essayer d'écrire command et voir plus loin.


J-M-L

C'est louche :)

Imprimez command en effet semble la première des choses à faire (la seconde étant de laisser le tomber la classe String)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vidou12

j'ai realisé un affichage du string command :

Code: [Select]
void process(WifiData client)
{
  // read the command
  String command = client.readStringUntil('/');

  client.print(command);
 
  if (command == "webserver")
  {
    WebServer(client);
  }

  if (command == "digi")
  {
    digitalCommand(client);
  }
}


mais ça m'affiche juste mon url sans les / :
pour
Quote
html://monip/arduino/webserver
, ça m'affiche :
Quote
"arduinowebserver><meta charset=utf-8 /><title>Poulailler St Baudille</title></head><body>blabla lien vers page de presentation sur serveur ftp</body></html><!--~-->"
sur la page web, et dans la console arduino wifi j'ai :
Quote
"arduinowebserverHTTP/1.1 200 OK
Content-Type: text/html

blabla lien vers page de presentation sur serveur ftp"
.

en revanche pour toto, j'ai not found sur a page web et rien sur la console.

C'est louche.
Apres comment et pourquoi ne pas utiliser string?

J-M-L

il ne faut pas faire
Code: [Select]
  client.print(command); mais
Code: [Select]
  Serial.print(command); si vous voulez voir ce qu'il a reçu....

et encore mieux
Code: [Select]
Serial.print("["); Serial.print(command); Serial.println("]"); // DEBUGpour voir exactement ce qu'il y a dans le buffer (par exemple un retour à la ligne)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vidou12

oui j'ai aussi essayé mais comme "command" est un string ça fonctionne pas... et je ne sais pas comment le convertir :/

Edit : Pardon maintenant ça fonctionne je ne sais pas pourquoi ça ne fonctionnait pas avant..

Bref du coups j'ai bien :
[]
[arduino]
[webserver]

qui s'affiche dans ma console avec l'adresse /webserver
et rien du tout quand je tape toto et que dans mon programme je le définit ... C'est.... Bizarre !!!

Vidou12

Bon...
J'ai fais plusieurs essais.
Visiblement il attends au moins le mot "web" apres "arduino/", ou "dig" (pour digital) ou "ana" (pour analog)... j'ai essayé quelques autres choses mais ça n'a jamais été pris en compte par le serial.print.

Maintenant est-ce que c'est inchangeable cette config ou non??? et comment je peux afficher mes autres caractères sur ma seconde page ... ca encore je cherches je vais voir avec le print encore pour voir plus loin.

Merci en tous cas jusqu'ici !

J-M-L

Je n'ai pas d'arduino Wifi donc  j'ai lu la doc pour vous :)

ils y disent aussi:
Quote
On the Arduino Uno Wi-Fi is pre-uploaded the RestServer sketch that allows you to command immediately your board via browser
Si vous n'avez rien changé, vous avez donc par défaut un serveur Rest (Representational State Transfer, plein d'info sur ce thème sur internet, par exemple celle ci)

Si vous allez voir le firmware du RestServer vous verrez que c'est dans ce code qu'ils ont câblé en dur ce que le serveur web attend

Code: [Select]
void process(WiFiClient client) {
 // read the command//
 if(listen_service(client, "arduino")){  // <<--- ICI ILS ATTENDENT arduino dans l'URL
 String command = client.readStringUntil('/');
 // is "digital" command?
 if (command == "digital") {
 digitalCommand(client);
 }


Possible commands created in this shetch:

 * "/arduino/digital/13" -> digitalRead(13)
 * "/arduino/digital/13/1" -> digitalWrite(13, HIGH)
 * "/arduino/analog/2/123" -> analogWrite(2, 123)
 * "/arduino/analog/2" -> analogRead(2)
 * "/arduino/mode/13/input" -> pinMode(13, INPUT)
 * "/arduino/mode/13/output" -> pinMode(13, OUTPUT)



il mentionnent aussi Arduino UNO WiFi firmware updater qui vous permet de changer le firmware et il semble que ce soit lié à l'IDE version américaine (arduino.org et pas arduino.cc).

le chemin de chargement semble spécifique et lié à l'architecture spéciale qui permet de basculer d'un upload wifi ou Serial.


Je me demande en fait si votre code est bien téléchargé et opérationnel sans que votre version de l'IDE ne le détecte et donc vous vous retrouvez en fait avec toujours le code REST par défaut ?

bref - explorer l'IDE de .org et les processus de mise à jour du firmware dont ils parlent serait sans doute une bonne idée



Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up