[RESOLU]frequence 433mhz shield ethernet et wamp

bonjour à toutes et tous

voila mon petit probleme j ai deux cartes arduino qui sont connectees entre elle avec un emetteur recepteur 433mhz la carte qui a le recepteur a aussi un shield ethernet branché sur ma box et qui envoi des donnees à un serveur wamp sur mon ordi.

pour l'instant la carte emettrice n'envoi que temperature et humidité j aimerai y ajouter par la suite un capteur de niveau et un capteur de presence

mon soucis et que du coté du shield ethernet j'arrive à inscrire des donnees sur le serveur wamp mais ca me parait aléatoire j'imagine que mon programme à un soucis dans son ecriture j'aimerai voir avec vous s'il est possible de l'ameliorer.

voila donc le programmme et merci d'avance a ceux qui s'y pencheront

#include <VirtualWire.h>
#include <SPI.h>
#include <Ethernet.h>

//declaration variables 
int mouvement_detecte;
int humidite;
int temperature;
unsigned long temps;

//init pour ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//adresse mac du shield
IPAddress server(192,168,0,10); //l'adresse ip du serveur ici wamp
IPAddress ip(192, 168, 0, 32); //l'adresse ip du shield
EthernetClient client;

//init tableau de string à envoyer
char mess_recu_mvt[64];

//setup 
void setup() 
  {
     Serial.begin(9600);
     pinMode(2,OUTPUT);//pin pour le ventilo
     pinMode(10,OUTPUT);//pin pour la led
     
     if (Ethernet.begin(mac)==0)
    {
       Serial.println("Connection impossible revoir parametre DHCP");
       Ethernet.begin(mac, ip);  
     }
     delay(1000);
    Serial.println("connexion...");
     
     if (client.connect(server, 80)) 
     {
      Serial.println("connecté");
      client.println("Connection: fermee");
      client.println();
  }
  else {
    
    Serial.println("connection corrompu");
  }
     vw_set_rx_pin(3);
     vw_setup(2000);   // Bits par seconde   
     vw_rx_start();       

  }

//loop
 
void loop()
  {
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    
   if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
      {
         Serial.println("take_message");  
          if (vw_get_message(buf, &buflen))
         
            {
               Serial.println("get_message");  
               int i;
                   for (i=0;i<buflen;i++)
                  {
                        mess_recu_mvt[i] = char(buf[i]);
                       
                      digitalWrite(10, true); 
                      //sscanf(mess_recu_mvt, "%d,%d,%d",&mouvement_detecte,&temperature,&humidite);
                      sscanf(mess_recu_mvt, "%d,%d",&temperature,&humidite);
                      Serial.print("la temperature est de : " );
                      Serial.print(temperature);
                      Serial.println(" *C");
                      Serial.print("le taux d'humidite est de : ");
                      Serial.print(humidite);
                      Serial.println(" %");
                      Serial.println("on entre dans la boucle connexion au serveur");
                      digitalWrite(10,false);
                      delay(10000);
                    }
                  if ((millis()-temps)>60000)
                  Serial.println("temps");
                {
                 if (client.connect(server,80))
                    {
                     Serial.println("youhou");
                     client.print("GET /temperature_2/add_data.php?");
                     client.print("temperature=");
                     client.print(temperature);
                     client.print("&humidite=");
                     client.print(humidite);
                     client.println( " HTTP/1.1");
                     client.println( "Host: 192.168.0.10" );
                     client.print(" Host: ");
                     client.println(server);
                     client.println( "Connection: close" );
                     client.println();
                     client.println();
                     client.stop();
                      Serial.println("je suis entré dans la methode get");
                      digitalWrite(10,false);
                     temps=millis(); 
                      }
                if (client.connected())
                      {
                        client.stop();
                       }  
   //delay(60000);
   }
             } 
       
        }
        
    
    memset( mess_recu_mvt, 0, sizeof( mess_recu_mvt));// pour reset le string recu 
   if (temperature>=20) 
       {
          digitalWrite(2,HIGH);
        }
        else
        {
          Serial.println("temperature basse");
          delay(5000);
        }
//        if (mouvement_detecte ==1)
//        {
//         // digitalWrite(10, true);
//          Serial.print("attention mouvement detecte : ");
//          Serial.println(mouvement_detecte);
//         // digitalWrite(10, false);  
//          delay(3000);
//          
//        }
   




}

Salut,

Pour éclaircir :

  1. Sur l'Arduino avec le shield, tout se passe bien ? Tu reçois bien out par radio et visualise par le port série que tout se passe bien ?
  2. "Impression que c'est aléatoire" c'est âchement vague ... Ca fait quoi ? Que dit le log serveur ?
  3. Dans l'absolu 80 c'est pas le meilleur port à prendre, c'est celui par defaut du http. Ceci n'explique pas forcement cela, mais bon ...

il me semble que buflen (qui est la copie de VW_MAX_MESSAGE_LEN) vaut 200 (à voir dans la librairie virtualwire)

du coup quand tu recopies la chaine reçue en RF dans la chaine que tu veux envoyer mess_recu_mvt[64] il peut y avoir un dépassement de capacité dans la boucle for (i=0;i<buflen;i++) quand tu fais mess_recu_mvt = char(buf*);*
suivant tes messages tu peux diminuer VW_MAX_MESSAGE_LEN ou augmenter mess_recu_mvt

salut
et merci à vous 2

@B@tto

oui coté arduino avec le shield je recois bien les donnees et je les visualise sur le port serie elles sont memes reinscrites sur le serveur web je pense que le programme et pas tres bien ecrit car des fois sur le serial il reste bloqué quelques minutes sur par exemple Serial.println("je suis entré dans la methode get"); ou sur Serial.println("take_message"); 

en fait par aleatoire je voulais dire que sur ma page web la temperature et l'humidité sont inscrites toute les 2 ou 3 min alors que dans ma fonction millis je lui demande de l'inscrire par exemple tout les 600000 soit tout les 10 min.

avant de me coucher hier soir j'ai eu une idee ne serait il pas mieux d'afficher le msg recu par radio sur ma page web uniquement s'il est different du precedent et ma fonction millis le ferai tout les 10 min par exemple.

pour le port 80 si je le change dans arduino je dois aussi parametrer mon serveur wamp ou pas :o

@B83s

n'etant pas tres fort en code c'est une partie que j'ai bricolé en regardant sur differents forum :frowning: en fait je ne veux pas envoyer la chaine je ne fais que la lire et recupere les variables temperature et humidité. sinon pour augmenter mess_recu_mvt il faut le faire a ce niveau la char mess_recu_mvt[64];et mettre 128 par exemple
cela ne va t il pas m'occuper de la memoire su ma carte car avec ce programme j'utilise deja 63% de memoire dynamique

du coup j'aurai aimé savoir si cette facon de procéder est bonne ou faudrait il mieux changer de methode

encore merci a vous tous et tout bientot

Un petit up......

resist_tanz:
pour le port 80 si je le change dans arduino je dois aussi parametrer mon serveur wamp ou pas :o

Deux options : la première oui tu modifies les deux, la deuxième : tu modifies l'arduino et la redirection de port du routeur (mais ce n'est valable que depuis un envoi exterieur, pas en local).

Sinon si tu veux toute les 10 minute tu t'es tout simplement trompé ici :

 if ((millis()-temps)>60000)
                  Serial.println("temps");
                {
                 if (client.connect(server,80))
....

D'une part 60000 ms = 1 minute pas 10 :wink:

Ensuite ton accolade est mal placée, le client.connect est lancé à chaque fois, pas sous condition du if. Il faut écrire :

 if ((millis()-temps)>60000) {
Serial.println("temps");
 if (client.connect(server,80))
...

J'ajouterai qu'il y a une erreur d'accolade avec la boucle for ... mais tu peux te passer de la recopie de la chaine dans une autre et du coup tu peux supprimer ta variable char mess_recu_mvt[64]; et donc tu gagnes de la mémoire et tu évites le dépassement de capacité

Serial.println("get_message"); 
               int i;
                   for (i=0;i<buflen;i++)
                  {
                        mess_recu_mvt[i] = char(buf[i]);
                       
                      digitalWrite(10, true);
                      //sscanf(mess_recu_mvt, "%d,%d,%d",&mouvement_detecte,&temperature,&humidite);
                      sscanf(mess_recu_mvt, "%d,%d",&temperature,&humidite);

peut se remplacer par

Serial.println("get_message"); 
digitalWrite(10, true); //pourquoi ça ??? bref
sscanf((char*)buf, "%d,%d",&temperature,&humidite);

PS : soigner les indentations !!! ça rend le code beaucoup plus facile à lire et évite les erreurs d'accolades

salut et encore merci

j'avance petit a petit la correction de B83s : d'apres les tests que j'ai effectué j'ai l'impression que ca marche mieux sur le moniteur de série il me donnait avant des valeurs où il manquait un seul chiffre, la ca marche beaucoup mieux.
du coup j ai supprimé la variable mess_recu_mvt[64] comme preconisé et aussi enlevé la ligne memset.
le digitalWrite(10, true); c'etait pour visualiser la reception du message sur une led :grinning:

pour B@tto pour l'instant je vais laisser comme ca pour le port.
pour l'accolade je l'ai deplacé mais maintenant, sur le port serie je boucle sur Serial.println("temps"); je ne rentre jamais dans la condition if (client.connect(server,80)) pourtant au demarrage il me dit bien sur le moniteur serie que je suis connecté

encore merci à vous deux

attention ... la pin 10 (11 12 et 13 aussi) est reservée au shield ethernet ...

ah yes merci bien vu :wink:

salut à tous,

j ai toujours un probleme je ne sais pas pourquoi je ne rentre pas dans la condition de client.connect
if (client.connect(server,80)).
pourtant j'ai deja reussi à inscrire la temperature et l'humidité sur la base de donnees du serveur wamp mais la je seche et en plus comme dit avant sur le serial monitor je me connecte bien au debut dans la condition du setup

if (client.connect(server, 80)) 
     {
      Serial.println("connecté");
      client.println("Connection: fermee");
      client.println();
  }

j ai appuyé sur post sans remercier B83s et B@tto pour leurs participation et vous dire a +

remet ton code en entier stp ... sur 3 lignes c'est difficile de se faire une idée

#include <VirtualWire.h>
#include <SPI.h>
#include <Ethernet.h>

//declaration variables 
int mouvement_detecte;
int humidite;
int temperature;
unsigned long temps;

//init pour ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//adresse mac du shield
IPAddress server(192,168,0,10); //l'adresse ip du serveur ici wamp
IPAddress ip(192, 168, 0, 32); //l'adresse ip du shield
EthernetClient client;

//init tableau de string à envoyer
//char mess_recu_mvt[64];

//setup 
void setup() 
  {
     Serial.begin(9600);
     pinMode(2,OUTPUT);//pin pour le ventilo
     pinMode(4,OUTPUT);//pin pour la led
     
     if (Ethernet.begin(mac)==0)
    {
       Serial.println("Connection impossible revoir parametre DHCP");
       Ethernet.begin(mac, ip);  
     }
     delay(1000);
    Serial.println("connexion...");
     
     if (client.connect(server, 80)) 
     {
      Serial.println("connecté");
      client.println("Connection: fermee");
      client.println();
  }
  else {
    
    Serial.println("connection corrompu");
  }
     vw_set_rx_pin(3);
     vw_setup(2000);   // initialisation librairie a 2000 bauds   
     vw_rx_start();    // activation de la partie reception de la librairie virtualwire   

  }

//loop
 
void loop()
  {
    digitalWrite(4, LOW); 
    uint8_t buf[VW_MAX_MESSAGE_LEN]; //Tableau qui va contenir le message recu (de taille maximum VW_MAX_MESSAGE_LEN
    uint8_t buflen = VW_MAX_MESSAGE_LEN;//Taille max du tableau
    
   if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
      {
         Serial.println("message pres a recevoir");  
          if (vw_get_message(buf, &buflen)) //on copie le message qu'il soit corrompu ou non
         
            {
                Serial.println("get_message"); 
                digitalWrite(4, true); 
                sscanf((char*)buf, "%d,%d",&temperature,&humidite);
                Serial.print("la temperature est de : " );
                Serial.print(temperature);
                Serial.println(" *C");
                Serial.print("le taux d'humidite est de : ");
                Serial.print(humidite);
                Serial.println(" %");
                Serial.println("on entre dans la boucle connexion au serveur");
                digitalWrite(4,false);
                delay(10000);
             }
                      
        }
        
    // memset( mess_recu_mvt, 0, sizeof( mess_recu_mvt));// pour reset le string recu
     
      if ((millis()-temps)>120000)
           {
               Serial.println("temps");
               delay (1000);
               if (client.connected())
              {
                Serial.println("youhou");
                digitalWrite(4, true); 
                client.print("GET /temperature_2/add_data.php?");
                client.print("temperature=");
                client.print(temperature);
                client.print("&humidite=");
                client.print(humidite);
                client.println( " HTTP/1.1");
                client.println( "Host: 192.168.0.10" );
                client.print(" Host: ");
                client.println(server);
                client.println( "Connection: close" );
                client.println();
                client.println();
                client.stop();
                Serial.println("je suis entré dans la methode get");
                digitalWrite(4,false);
                temps=millis(); 
               }
               if (client.connected())
               {
                 client.stop();
                 Serial.println("client deconnecté");
                }
            } 
            
   if (temperature>=20) 
       {
          digitalWrite(2,HIGH);
        }
        else
        {
          Serial.println("temperature basse");
          digitalWrite(2,LOW);
          delay(5000);
        }

voila le code je rentre une fois dans la boucle client.connected j'ai bien "youhou" et "je suis entré dans la methode get" qui sont visibles dans le moniteur serie mais apres je boucle sur temps qui revient toute les secondes pendant une minute environ j ai un "message pret a recevoir" et hop ca repart sur "temps" et riens sur la base de donnees du serveur je me demande si la boucle millis il ne faut pas la mettre à l'interieur de cette conditon if (vw_get_message(buf, &buflen))

merci encore à toi

Ps : c'est normal de ne pouvoir poster qu'un message toute les 10 min :o

j'ai trouvé un exemple (car je n'ai pas de serveur WAMP ou je ne sais quoi) Arduino and MySQL Server: Arduino + Ethernet Shield + Temperature Sensor + WAMP Server

la ligne client.print(server); est en commentaire

la pin 4 est réservée à la carte SD du shield ethernet ... il y a peut être un conflict ... utilises la pin 13 qui est cablée d'origine avec une led ...

si tu vois le message "je suis entré dans la methode get" ... temps devrait être initialisé à millis() et le programme devrait retenter une connexion après 120000ms ... étrange ...

Oups j'ai dit une bêtise ... N'utilises pas la 13 ... Laisse tomber la led ! Utilise la console serie pour l'instant

#include <VirtualWire.h>
#include <SPI.h>
#include <Ethernet.h>

//declaration variables 
int mouvement_detecte;
int humidite;
int temperature;
unsigned long temps;

//init pour ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//adresse mac du shield
IPAddress server(192,168,0,10); //l'adresse ip du serveur ici wamp
IPAddress ip(192, 168, 0, 32); //l'adresse ip du shield
EthernetClient client;

//init tableau de string à envoyer
//char mess_recu_mvt[64];

//setup 
void setup() 
  {
     Serial.begin(9600);
     pinMode(2,OUTPUT);//pin pour le ventilo
     //pinMode(13,OUTPUT);//pin pour la led
     
     if (Ethernet.begin(mac)==0)
    {
       Serial.println("Connection impossible revoir parametre DHCP");
       Ethernet.begin(mac, ip);  
     }
     delay(1000);
    Serial.println("connexion...");
     
     if (client.connect(server, 80)) 
     {
      Serial.println("connecté");
      //client.println("Connection: fermee");
      client.println();
  }
  else {
    
    Serial.println("connection corrompu");
  }
     vw_set_rx_pin(3);
     vw_setup(2000);   // initialisation librairie a 2000 bauds   
     vw_rx_start();    // activation de la partie reception de la librairie virtualwire   

  }

//loop
 
void loop()
  {
    //digitalWrite(13, LOW); 
    uint8_t buf[VW_MAX_MESSAGE_LEN]; //Tableau qui va contenir le message recu (de taille maximum VW_MAX_MESSAGE_LEN
    uint8_t buflen = VW_MAX_MESSAGE_LEN;//Taille max du tableau
    
   if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
      {
         Serial.println("message pres a recevoir");  
          if (vw_get_message(buf, &buflen)) //on copie le message qu'il soit corrompu ou non
         
            {
                Serial.println("get_message"); 
                //digitalWrite(13, true); 
                sscanf((char*)buf, "%d,%d",&temperature,&humidite);
                Serial.print("la temperature est de : " );
                Serial.print(temperature);
                Serial.println(" *C");
                Serial.print("le taux d'humidite est de : ");
                Serial.print(humidite);
                Serial.println(" %");
                Serial.println("on entre dans la boucle connexion au serveur");
                //digitalWrite(13,false);
                delay(10000);
             }
          if ((millis()-temps)>120000)
           {
               Serial.println("temps");
               delay (1000);
               if (client.connected())
              {
                Serial.println("youhou");
               // digitalWrite(13, true); 
                client.print("GET /temperature_2/add_data.php?");
                client.print("temperature=");
                client.print(temperature);
                client.print("&humidite=");
                client.print(humidite);
                client.println( " HTTP/1.1");
                client.println( "Host: 192.168.0.10" );
                client.print(" Host: ");
                client.println(server);
                client.println( "Connection: close" );
                client.println();
                client.println();
                client.stop();
                Serial.println("je suis entré dans la methode get");
                //digitalWrite(13,false);
                temps=millis(); 
               }
               else
               {
                 Serial.println("client deconnecté");
                }
                delay(5000);
            }              
        }
        
    // memset( mess_recu_mvt, 0, sizeof( mess_recu_mvt));// pour reset le string recu
     
     
            
   if (temperature>=20) 
       {
          digitalWrite(2,HIGH);
        }
        else
        {
          Serial.println("temperature basse");
          digitalWrite(2,LOW);
          delay(5000);
        }

j ai un peu changer le code j'ai donc viré la led pour le moment et j'ai mis la boucle du millis dans la boucle de reception RF ca ma l'air de mieux fonctionnner sauf que la au lieu de d'avoir le youhou et je suis entré dans la methode get j'ai client deconnecté je vais peut etre m'inspiré de son modele pour reecrire mon code et vous tiens au jus

merci encore

bon ca à l'air de fonctionner je remet le code propre j inscris bien la temperature et l'humidité sur la base de donnees et toutes les 2 min

#include <VirtualWire.h>
#include <SPI.h>
#include <Ethernet.h>

//declaration variables 
int mouvement_detecte;
int humidite;
int temperature;
unsigned long temps;

//init pour ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//adresse mac du shield
IPAddress server(192,168,0,10); //l'adresse ip du serveur ici wamp
IPAddress ip(192, 168, 0, 32); //l'adresse ip du shield
EthernetClient client;

//init tableau de string à envoyer
//char mess_recu_mvt[64];

//setup 
void setup() 
  {
     Serial.begin(9600);
     pinMode(2,OUTPUT);//pin pour le ventilo
     //pinMode(13,OUTPUT);//pin pour la led
     
     if (Ethernet.begin(mac)==0)
    {
       Serial.println("Connection impossible revoir parametre DHCP");
       Ethernet.begin(mac, ip);  
     }
     delay(1000);
    Serial.println("connexion...");
     
     
 
     vw_set_rx_pin(3);
     vw_setup(2000);   // initialisation librairie a 2000 bauds   
     vw_rx_start();    // activation de la partie reception de la librairie virtualwire   

  }

//loop
 
void loop()
  {
    //digitalWrite(13, LOW); 
    uint8_t buf[VW_MAX_MESSAGE_LEN]; //Tableau qui va contenir le message recu (de taille maximum VW_MAX_MESSAGE_LEN
    uint8_t buflen = VW_MAX_MESSAGE_LEN;//Taille max du tableau
   
   if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
      {
         Serial.println("message pres a recevoir");  
          if (vw_get_message(buf, &buflen)) //on copie le message qu'il soit corrompu ou non
         
            {
                Serial.println("get_message"); 
                //digitalWrite(13, true); 
                sscanf((char*)buf, "%d,%d",&temperature,&humidite);
                Serial.print("la temperature est de : " );
                Serial.print(temperature);
                Serial.println(" *C");
                Serial.print("le taux d'humidite est de : ");
                Serial.print(humidite);
                Serial.println(" %");
                Serial.println("on entre dans la boucle connexion au serveur");
                //digitalWrite(13,false);
                delay(10000);
             }
          if ((millis()-temps)>120000)
           {
             
               Serial.println("temps");
               if (client.connect(server, 80)) 
                   {
                      Serial.println("connecté");
                      //client.println("Connection: fermee");
                      client.println();
                    }
               
               
               if (client.connected())
              {
                Serial.println("youhou");
               // digitalWrite(13, true); 
                client.print("GET /temperature_2/add_data.php?");
                client.print("temperature=");
                client.print(temperature);
                client.print("&humidite=");
                client.print(humidite);
                client.println( " HTTP/1.1");
                client.println( "Host: 192.168.0.10" );
                client.println( "Connection: close" );
                client.println();
                client.println();
                client.stop();
                Serial.println("je suis entré dans la methode get");
                //digitalWrite(13,false);
                temps=millis(); 
               }
               else
               {
                 Serial.println("client deconnecté");
                }
                
            }              
        }
        
    
     
     
            
   if (temperature>=20) 
       {
          digitalWrite(2,HIGH);
        }
        else
        {
          Serial.println("temperature basse");
          digitalWrite(2,LOW);
          delay(5000);
        }

merci encore B83s

je voulais savoir maintenant si je cree un bouton sur mon fichier php est il possible d'actionner une sortie de l'arduino distant c'est à dire que ma requete passe par le serveur wamp qui donne l'ordre à l'arduino avec le shield ethernet qui lui retransmettra à l'arduino avec capteur et relais
je sais pas si c clair
pour l'instant j ai fait :
arduino1->arduino2->serveur wamp->page php
et je voudrais faire la marche contraire faut il un module emetteur dans l'arduino 2 et module recepteur dans l'arduino 1 en fait peut on mettre un module emetteur et un module recepteur dans un un seul arduino

De rien ....

Mais pour la suite ... Je ne suis pas sûr que l'on puisse faire du bi directionnel avec n'importe quel émetteur/récepteur 433 ...

Google est ton ami ...

mmmm

donc en fait il n'est pas possible qu'à terme je mette mon arduino avec le shield ethernet comme maitre qui fait des requetes pour voir etats entrees et sorties et qui peut aussi agir dessus, sur des arduinos esclaves vais devoir plancher sur ca