Ethernet Shield / Web Client / indexOf ?

Bonjour à tous,
étant en T STI2D, je dois rendre un projet pour le bac en fin d’année.
Mon projet est de commander un arduino uno grâce a un site web. Le site web n’est pas sur l’arduino.
Le site est tout prêt (du moins je pense) et il me reste plus qu’à coordonner l’arduino et le site:
le souhaiterais qu’en fonction de ce qu’il est marqué sur une page, l’arduino envoie un signal haut/bas ou qu’il fasse certaine choses (gestion d’un chauffage par exemple).
La page est sous la forme arrosage=1
Voici mon code arduino :

#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = { 0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x02 };
IPAddress ip(192,168,1,177);
IPAddress server(xx,xx,xx,xx);
 
EthernetClient client;
 
 
 
void connect(){
if (client.connect(server, 80)) {
Serial.print("Make a HTTP request ... ");
 
client.println("GET /info.php HTTP/1.1");
client.println("HOST: xxx.com");
client.println();
 
Serial.println("ok");
 
}
else {
// kf you didn't get a connection to the server:
Serial.println("connection failed");
}
}
 
void setup() {
Serial.begin(9600);
 
Serial.print("Setup LAN ... ");
// give the Ethernet shield a second to initialize:
delay(1000);
Ethernet.begin(mac, ip);
Serial.println("ok");
delay(1000);
 
 
connect();
}
 
void loop(){
 
if (client.available()) {
char c = client.read();
String str(c);
Serial.println(str);
if ((str.indexOf("arrosage=0")) !=NULL ){
Serial.println(F("test0"));}
if ((str.indexOf("arrosage=1")) !=NULL){
Serial.println(F("test1"));}
}
 
// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
 
delay(3000);
 
connect();
}
 
}

Mais le probleme est : quelque soit l’état de “arrosage=0/1” le serial m’affiche “test0” et “test1” comme s’il ne respectait pas les conditions.

1)Es-ce que j’utilise .indexOf comme il faut ?
2)Es-ce la bonne méthode?
Merci

Salut, un petit up ^^

Merci pour ta réponse, je me suis servis de l'exemple webclient de l'ide pour faire mon programme, ainsi que divers post sur plusieurs forums.

  1. dans l'ide arduino, j'ai compris que ca renvoyait tout ce qu'il lisait, c'est pour ca que je m'en suis servis
 // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

d'ou mon erreur

  1. j'ai donc a faire une comparaison ? par exemple
if ((str.indexOf("arrosage=0")) >=0 ){
Serial.println(F("test0"));}

donc je dois faire str += c ou quelque chose comme sa et boucler le nombre de fois qu'il y a de caractère?

ok merci de ton aide je test ca ce soir

EDIT: Bon le site est offline (hebergement gratuit) donc je me permet de te mettre le code, l’ide ne me met pas d’erreur.

#include <SPI.h>
#include <Ethernet.h> 
byte mac[] = { 0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x02 };
IPAddress ip(192,168,1,177);
IPAddress server(xx,xx,xx,xx);
EthernetClient client; 
void connect(){
if (client.connect(server, 80)) {
Serial.print("Make a HTTP request ... "); 
client.println("GET /info.php HTTP/1.1");
client.println("HOST: xx");
client.println(); 
Serial.println("ok"); 
}
else {// if you didn't get a connection to the server:
Serial.println("connection failed");}} 
void setup() {
Serial.begin(9600); 
Serial.print("Setup LAN ... ");
delay(1000);// give the Ethernet shield a second to initialize:
Ethernet.begin(mac, ip);
Serial.println("ok");
delay(1000); 
connect();}
void loop(){
if (client.available()) {
char c = client.read();
int inc = 0;
String str;
while (inc < 350)
{
inc++;
str += c;
}
Serial.println(str);
if ((str.indexOf("arrosage=0"))>=0){
Serial.println(F("test0"));}
if ((str.indexOf("arrosage=1"))>=0){
Serial.println(F("test1"));}
}
// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
delay(3000);
connect();
}
}

C’est tout bon ???

Salut, je reviens pour dire qu'avec la boucle du dessus ( voir EDIT) sa ne fonctionne pas : le serial me sort 350 mêmes caractères par ligne , donc pas l'effet escompté.
avec simplement str += c sa me met chaque caractère a la ligne, du coup le indexOf ne me met rien (normal). Merci

Salut,
après quelques tests, celui-ci semble fonctionner :

int inc = 0;
while (sizeof(str) != sizeof(c)){
if (client.available()) {
c = client.read();
str+=c;
}
if ((str.indexOf("arrosage=0"))>=0){
Serial.println(F("arrosage eteint"));}
if ((str.indexOf("arrosage=1"))>=0){
Serial.println(F("arrosage allume"));}

Bon maintenant je n'arrive plus a me connecter au serveur(pas grand chose je pense, j'ai fais tellement d'essai different que j'ai du toucher qqc...), par contre , comment faire actualiser la page chargé? Je dois déplacer ma fonction connect?
Merci
EDIT: pb de connexion résolu.

Je n’ai pas l’impression que cela fonctionne, mon code :

#include <SPI.h>
#include <Ethernet.h> 
byte mac[] = { 0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x03 };
IPAddress ip(192,168,1,100);
IPAddress server(xx,xx,xx,xx);
//IPAddress ip(192,168,23,71);
//IPAddress dnsserver(192,168,23,2);
//IPAddress gateway(192,168,23,250);
//IPAddress subnet(255,255,255,0);
EthernetClient client; 
String str;
char c;

void connect(){
if (client.connect(server, 80)) {
Serial.print("Make a HTTP request ... "); 
client.println("GET /info.php HTTP/1.1");
client.println("HOST: xx");
client.println(); 
Serial.println("ok"); 
}
else {// if you didn't get a connection to the server:
Serial.println("connection failed");}} 

void setup() {
Serial.begin(9600); 
Serial.print("Setup LAN ... ");
delay(1000);// give the Ethernet shield a second to initialize:
Ethernet.begin(mac, ip);
//Ethernet.begin(mac, ip, dnsserver, gateway, subnet); 
Serial.println("ok");
delay(1000); 
connect();}

void loop(){
while (sizeof(str) != sizeof(c)){
if (client.available()) {
c = client.read();
str+=c;
}
if ((str.indexOf("arrosage=0"))>=0){
Serial.println(F("arrosage eteint"));}
if ((str.indexOf("arrosage=1"))>=0){
Serial.println(F("arrosage allume"));}
if ((str.indexOf("alarme=0"))>=0){
Serial.println(F("alarme eteinte"));}
if ((str.indexOf("alarme=1"))>=0){
Serial.println(F("alarme allumee"));}
}
// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
delay(3000);
connect();
}
}

Le site est sur un hébergement gratuit gérer sur 000webhost, mais j’ai eu un bug de la box je pense, je l’ai redémarré et c’était bon.

j’ai pas l’impression que le programme se déconnecte, pour mettre a jour, je n’ai aucun “disconnecting” est apres avoir changer les valeurs, pas de rehargement dans le serial. Je dois redemarrer le sketch pour que sa s’actualise.

rajoute après client.stop();

for(;;)
      ;

salut, merci pour ton aide, mais j'ai l'impression que mon programme ne sort pas de la boucle

while (sizeof(str) != sizeof(c)){
if (client.available()) {
c = client.read();
str+=c;
}

En fait, je ne savais pas quoi mettre comme condition et j'avais oublié que c ne contenait qu'un seul caractère a la fois, du coup c'est sur sa ne marche pas .... en faite je voulais qu'il mette c dans str jusqu'a que str soit complete, c'est a dire avec tout le code php. Mais du coup je ne sais pas quoi mettre comme condition. Je met une incrémentation ?

1)oui, pourtant je pensais a html^^
2)la page contient uniquement arrosage=0/1 alarme=0/1 et chauffage=0->26
plus le code html de base inclus automatiquement.
3) pour le chauffage, c'est le meme système? par contre je pense que je vis faire un if pour chaque valeure possible de chauffage, ( je ne sais pas comment prendre directement la valeure après "chauffage=") cela ne va pas surcharger l'arduino?
4)client.flush() permet de vider le client si je comprend bien ?
5)Merci pour ton aide!!

avec ton programme, le serial ne renvoie rien, j'ai l'impression que cela vient du fait qu'il y a environ 350 caractères au total, en incluant tout les balises html ( html , body, head, ...) qu'il n'y a pas dans le php mais que le serveur renvoie ( vu quand j'affichait str dans le serial ). Es-ce réellement utile de faire tout ce système de vérification de longueure?
si je remet juste le string a zéro a la fin sa ne suffit pas ?

Salut, toujours le même problème après quelques magouilles, j’ai essayer de reprendre l’ancienne version avec une boucle for, mais pareil, ne sort pas de la boucle :

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x03 };
IPAddress ip(192, 168, 1, 100);
IPAddress server(xx, xx, xx, xx);
//IPAddress ip(192,168,23,71);
//IPAddress dnsserver(192,168,23,2);
//IPAddress gateway(192,168,23,250);
//IPAddress subnet(255,255,255,0);
EthernetClient client;
String str;
int i = 0 ;
char c;
void connect() {
  if (client.connect(server, 80)) {
    Serial.print("Make a HTTP request ... ");
    client.println("GET /info.php HTTP/1.1");
    client.println("HOST: xx");
    client.println();
    Serial.println("ok");
  }
  else {// if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void setup() {
  Serial.begin(9600);
  Serial.print("Setup LAN ... ");
  delay(1000);// give the Ethernet shield a second to initialize:
  Ethernet.begin(mac, ip);
  //Ethernet.begin(mac, ip, dnsserver, gateway, subnet);
  Serial.println("ok");
  delay(1000);
}

void loop() {
  connect();
  for (i = 0; i = 350; i++) {
    if (client.available()) {
      c = client.read();
      str += c;
    }
    if ((str.indexOf("arrosage=0")) >= 0) {
      Serial.println(F("arrosage eteint"));
    }
    if ((str.indexOf("arrosage=1")) >= 0) {
      Serial.println(F("arrosage allume"));
    }
    if ((str.indexOf("alarme=0")) >= 0) {
      Serial.println(F("alarme eteinte"));
    }
    if ((str.indexOf("alarme=1")) >= 0) {
      Serial.println(F("alarme allumee"));
    }
  }
  if (!client.connected()) {
    // vide la chaîne et le tampon de réception en prévision de la prochain requête
    str = "";
    client.flush();

    // met fin à la connexion
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    delay(3000);
  }
}

Le code HTML de la page source est :

    <html>
        <head></head>
        <body>

           [arrosage=0

            



            alarme=0

            



            chauffage=0]

            <!--

             Hosting24 Analytics Code 

            -->
            <script src="http://stats.hosting24.com/count.php" type="text/javascript"></script>
            <!--

             End Of Analytics Code 

            -->
            <div id="cacaowebfirefoxextension"></div>
            <script type="text/javascript"></script>
            <script id="isrunning" src="http://127.0.0.1:4001/isrunning" type="text/javascript"></script>
            <div id="cacaorunning"></div>
        </body>
    </html>

Mais concrètement je n’ai besoin que de ce qui est entre crochets. Merci!

Salut, j’ai reussi a faire une actualisation, mais maintenant que j’ai ajouté du ode pour un “chauffage”, j’ai un petit probleme : L’arduino se connecte au réseau … ok ensuite il telecharge la page …ok mais il me met quand meme que la connexion a échoué. Voici le code:

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x03 };
IPAddress ip(192, 168, 1, 100);
IPAddress server(xx, xx, xx, xx);
//IPAddress ip(192,168,23,71);
//IPAddress dnsserver(192,168,23,2);
//IPAddress gateway(192,168,23,250);
//IPAddress subnet(255,255,255,0);
EthernetClient client;
String str;
int i = 0 ;
char c;
int PinLed = 13;
int etatLed;
int commandeh;
int commandeb;
int commande;
#include <OneWire.h>
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté
  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }
  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur

  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20

  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus

  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;

  // Pas d'erreur
  return true;
}

void connect() {
  if (client.connect(server, 80)) {
    Serial.print("Telechargement de la page ... ");
    client.println("GET /info.php HTTP/1.1");
    client.println("HOST: xx.xx.xx");
    client.println();
    Serial.println("ok");
  }
  else {// if you didn't get a connection to the server:
    Serial.println("Connexion echoue");
  }
}

void setup() {
  pinMode(PinLed, OUTPUT);
  Serial.begin(9600);
  Serial.print("Connexion au reseau ... ");
  delay(1000);// give the Ethernet shield a second to initialize:
  Ethernet.begin(mac, ip);
  //Ethernet.begin(mac, ip, dnsserver, gateway, subnet);
  Serial.println("ok");
  delay(1000);
}

void loop() {
  connect();
  for (i = 0; i < 350; i++) {
    if (client.available()) {
      c = client.read();
      str += c;
    }
  }
  if ((str.indexOf("arrosage=0")) >= 0) {
    Serial.println(F("L'arrosage est eteint"));
  }
  if ((str.indexOf("arrosage=1")) >= 0) {
    Serial.println(F("L'arrosage est allume"));
  }
  if ((str.indexOf("alarme=0")) >= 0) {
    Serial.println(F("L'alarme est eteinte"));
  }
  if ((str.indexOf("alarme=1")) >= 0) {
    Serial.println(F("L'alarme est allumee"));
  }
  if ((str.indexOf("chauffage=0")) >= 0) {
    Serial.println(F("Le chauffage est eteint"));
    commande = 0;
  }
  if ((str.indexOf("chauffage=7")) >= 0) {
    Serial.println(F("Le chauffage est en mode Hors-Gel"));
    commande = 7;
  }
  if ((str.indexOf("chauffage=16")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 16°C"));
    commande = 16;
  }
  if ((str.indexOf("chauffage=17")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 17°C"));
    commande = 17;
  }
  if ((str.indexOf("chauffage=18")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 18°C"));
    commande = 18;
  }
  if ((str.indexOf("chauffage=19")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 19°C"));
    commande = 19;
  }
  if ((str.indexOf("chauffage=20")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 20°C"));
    commande = 20;
  }
  if ((str.indexOf("chauffage=21")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 21°C"));
    commande = 21;
  }
  if ((str.indexOf("chauffage=22")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 22°C"));
    commande = 22;
  }
  if ((str.indexOf("chauffage=23")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 23°C"));
    commande = 23;
  }
  if ((str.indexOf("chauffage=24")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 24°C"));
    commande = 24;
  }
  if ((str.indexOf("chauffage=25")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 25°C"));
    commande = 25;
  }
  if ((str.indexOf("chauffage=26")) >= 0) {
    Serial.println(F("Le chauffage est regle pour 26°C"));
    commande = 26;
  }
  float temp;
    commandeh = commande + 1;
    commandeb = commande - 1;
 
  // Lit la température ambiante à ~1Hz
  if (temp < commandeb)
  {
    etatLed = HIGH;
  }
  if (temp > commandeh)
  {
    etatLed = LOW;

  }
  digitalWrite(PinLed, etatLed);
  if (etatLed == LOW)
  {
    delay(4000);
  }
  else {}
  if (!client.connected()) {
    // vide la chaîne et le tampon de réception en prévision de la prochain requête
    str = "";
    client.flush();// met fin à la connexion
    Serial.println(commandeb);
    Serial.println(commandeh);
    Serial.println("Deconnexion.");
    Serial.println();
    client.stop();

    delay(3000);
  }
}

Et voici ce qui se trouve dans le serial :

 Connexion au reseau ... ok
Telechargement de la page ... ok
Connexion echoue
Connexion echoue
L'arrosage est allume
L'alarme est allumee
Le chauffage est regle pour 22°C
21
23
Deconnexion.

En gros, le programme me dit que la connexion n’est pas bonne alors qu’elle est bonne mais continue de tourner.
Merci

Merci, donc c'est en fait un probleme de latence en quelques sorte? Je vais changer ca.
Pour info, le programme utilise 15 662 octets (48% de l'UNO) de ROM et 772 octets (37%) de RAM.

Une derniere question pour la route, c'est que je veux me servir de ce programme pour envoyer un signal vers un autre arduino en fonction de l'état des variables. J'avais fait un test rapide : envoyer un signal haut / bas pendant un certain temps et allumer une led lorsque le second arduino recoit un signal, suaf que le second arduino "captait" tout le temps un signal alors qu'il n'y en avait pas, et cela fonctionne en débranchant le fil.
Comment je peux faire pour que cela fonctionne ? Mettre une led pour pomper la fraction de signal qui sort de l'arduino?

En fia je voudrait que l’arduino equipé du shield envoie des que par exemple l’arrosage est a 1 un signal “HIGH” pour un autre arduino afin de démarrer l’arrosage par exemple . Si arrosage =0 alors il envoie un signal “LOW” qui servira a éteindre le système

Merci d'avoir pris le temps mais nous n'avons pas du nous comprendre:
L'arduino equipé du shield ethernet recupere les données d'un site, puis en fonction des valeurs, envoie un signal 5v/0v a un autre arduino qui lui controle un arrosage et qui n'a pas de shield ethernet.
En esperant m'etre fais comprendre. :slight_smile:

Merci, je vois qu'on c'est compris ^^ , pour relier les arduinos, il y aura un cable de 20 cm, quand on a fait les les tests, il devait y avoir des parasites ( salle pleine de pc allumé ) d'ou la détection constante de sigal haut (trop précis ces machins ^^) pour absorber ces parasites ont peut faire comment?

Bonjour,
Utilise un câble blindé pour la liaison avec la tresse reliée que d'un côté au GND.