Problèmes de compréhension programmation arduino uno wifi.

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 :slight_smile: :slight_smile: !!!

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 :

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:///arduino/webserver et http:///arduino/digital.

si webserver, alors on est dans le cas de figure :

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

WebServer(client); est ceci :

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
");
  client.print("Click<input type=button onClick=\"var w=window.open('/arduino/digital/13/0','_parent');w.close();\"value='OFF'>pin13 OFF
");

  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 :

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 :

  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à :

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é...

Postez tout le code complet

#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...
"));
    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!

Wifi est une instance de la classe ArduinoWifiClass définie à la fin de UnoWiFiDevEd.cpp parArduinoWifiClass Wifi;

Cette classe est définie ainsi dans UnoWiFiDevEd.h 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


```
[color=blue]GET /webserver/xxx HTTP/1.1
Host: www.server.fr
Connection: close

[/color]
```


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

--> tout dépend donc de la structure de l'URL passée en GET

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 :frowning:

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

vous tapez quoi dans votre navigateur web?

si je remplace "webserver" dans la ligne de commande

if (command == "webserver"),

par "toto" par exemple :

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" :

if (command == "webserver").

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

Vous êtes sûr que vous ne tapez pas plutôt
http://monIP/arduino/webserver[b][color=red]/[/color][/b]?

et si vous essayez avec

http://monIP/arduino/toto[b][color=red]/[/color][/b]

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

/*
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

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.

C'est louche :slight_smile:

Imprimez command en effet semble la première des choses à faire (la seconde étant de laisser le tomber la classe String)

j'ai realisé un affichage du string command :

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

html://monip/arduino/webserver

, ça m'affiche :

"arduinowebserver>Poulailler St Baudilleblabla lien vers page de presentation sur serveur ftp"

sur la page web, et dans la console arduino wifi j'ai :

"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?

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

et encore mieux Serial.print("["); Serial.print(command); Serial.println("]"); // DEBUGpour voir exactement ce qu'il y a dans le buffer (par exemple un retour à la ligne)

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

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 !!!

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 !

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

ils y disent aussi:

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

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);
 }
[sub]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)[/sub]

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

Oh merci pour cette mine d'informations. Je n'avais trouvé que l'aide de la mise en route et rien d'autre avec mes recherches.

Je vais étudier tout ca.

Merci beaucoup.