arduino gsm

Portrait de ADOU

bonjour 

j'ai un problème a réaliser un code qui permet de déclencher arrosage a travers un smartphone.

voila le code qui permet de connaitre l'etat du sol a travers gsm .

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 8);

//int activer = 1; // ordre d'envoyer SMS

int val;

int l=13;

int i=0;

int secCount = 0;

int humideCount = 0;

int tropHumideCount = 0;

const int MAX_SMS_SENT = 2;

void setup()

{

   pinMode(13, OUTPUT);

    mySerial.begin(19200);              

    Serial.begin(19200);   

    delay(500);

    

}

void loop()

{

   val=analogRead(A0);

   String etat;

    Serial.print ("valeur est:");

  Serial.println(val);

  delay(100);

  if (val <=400){

    etat="sec";

  

    while(secCount < MAX_SMS_SENT){

     Serial.print ("\n secCount est : ");

     Serial.println(secCount);

  

     digitalWrite(13,HIGH);

    //Pour envoyer un sms sous forme de texte

       mySerial.print("AT+CMGF=1\r");    

       delay(100);

       //Numero de telephone du destinataire

       mySerial.println("AT + CMGS = \"numero\"");

       delay(100);

       mySerial.println("Alerte le sol est sec: ");

       delay(100);

       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)

       delay(100);

       mySerial.println("c'est fait."); 

       secCount++;

      }  

    }  

    if(val>400 && val<700){

     

       etat="humide";

    

    while(humideCount < MAX_SMS_SENT){

     Serial.print ("\n humideCount est : ");

     Serial.println(humideCount);

  

     digitalWrite(13,HIGH);

    //Pour envoyer un sms sous forme de texte

       mySerial.print("AT+CMGF=1\r");    

       delay(100);

       //Numero de telephone du destinataire

       mySerial.println("AT + CMGS = \"numero\"");

       delay(100);

       mySerial.println("Alerte le sol est humide: ");

       delay(100);

       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)

       delay(100);

       mySerial.println("c'est fait."); 

       humideCount++;

      }  

      

       digitalWrite(13,LOW);

    

       Serial.print("sol est");

       Serial. println(etat);

    }

    

    if(val >700){

      etat="trop";

    while(tropHumideCount < MAX_SMS_SENT){

     Serial.print ("\n tropHumideCount est : ");

     Serial.println(tropHumideCount);

  

     digitalWrite(13,HIGH);

    //Pour envoyer un sms sous forme de texte

       mySerial.print("AT+CMGF=1\r");    

       delay(100);

       //Numero de telephone du destinataire

       mySerial.println("AT + CMGS = \"numero \"");

       delay(100);

       mySerial.println("Alerte le sol est trop humide: ");

       delay(100);

       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)

       delay(100);

       mySerial.println("c'est fait."); 

       tropHumideCount++;

      }  

      

      digitalWrite(13,LOW);

    

      Serial.print("sol est");

      Serial. println(etat);

    }

  delay(1000);

 }

je voudrais ajouter le code qui permet de déclencher l'arrosager via gsm 

Portrait de Walter

Ba tu fais le contraire tu regarde si tu as reçu un SMS en provenance de ton smartphone.
A priori avec la commande CNMI ?

Portrait de ADOU

Bonjour  walter .

je ne comprend pas ce que vous expliquez

Portrait de Walter

simplement que ton programme envois un sms avec la commande "AT+CMGF", donc la tu veux recevoir un sms, donc tu utilise la commande correspondante à priori CNMI.
C'est bien ce que tu veux faire recevoir un SMS sur ton smartphone pour t'avertir que le sol est trop sec et envoyé un SMS de ce même smartphone pour déclencher l'arrosage.

Je ne vois pas ce qui te pose un problème en fait?
Que veux tu faire exactement?
Quel commande de ton module GSM te pose un problème.

Portrait de ADOU

bonjour walter

ok j'ai compris.

j'ai puis faire les deux programmes mais ils sont indépendant.

objectif du code est déclencher l'arrosage a travers le téléphone et le faire sans téléphone 

comment les faire fonctionner ensemble ?ces là que je suis bloque depuis hier nuit

voila les deux code  

//////////////////////////////////connaître l'etat du sol via gsm//////////////////////////////////////////

 val=analogRead(A0);
   String etat;
    Serial.print ("valeur est:");
  Serial.println(val);
  delay(100);
  if (val <=400){
    etat="sec";
  
    while(secCount < MAX_SMS_SENT){
     Serial.print ("\n secCount est : ");
     Serial.println(secCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est sec: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       secCount++;
      }  
    }  

    if(val>400 && val<700){
     
       etat="humide";
    
    while(humideCount < MAX_SMS_SENT){
     Serial.print ("\n humideCount est : ");
     Serial.println(humideCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est humide: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       humideCount++;
      }  
      
       digitalWrite(13,LOW);
    
       Serial.print("sol est");
       Serial. println(etat);
    }
    
    if(val >700){
      etat="trop";

    while(tropHumideCount < MAX_SMS_SENT){
     Serial.print ("\n tropHumideCount est : ");
     Serial.println(tropHumideCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est trop humide: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       tropHumideCount++;
      }  
      
      digitalWrite(13,LOW);
    
      Serial.print("sol est");
      Serial. println(etat);
    }
  delay(1000);

////////////////////////////////declencher l'arrossage via le smarphone /////////////////////////////////////////

 
#include <SoftwareSerial.h> //software serial library for serial communication b/w arduino & GSM

SoftwareSerial mySerial(7, 8);//connect Tx pin of GSM to pin 7of arduino && Rx pin of GSM to pin no 8of arduino

int led = 13;
String message;

void setup()
{
  mySerial.begin(19200);   // Setting the baud rate of GSM Module  
  Serial.begin(19200);    // Setting the baud rate of Serial Monitor (Arduino)
  delay(100);

 mySerial.print ("ATE0r");
//Réponse();
 mySerial.print ("ATr");
//Réponse();
 mySerial.print ("AT + CMGF = 1r");
//Réponse();
 mySerial.print ("AT + CNMI = 1,2,0,0,0r");
//Réponse();
  pinMode(led,OUTPUT);
  digitalWrite(led,LOW);
}

void loop()
{
  if (mySerial.available()>0){
  message = mySerial.readString();
  }

  if(message.indexOf("ON") > -1){
      Serial.println("LED ON");
     digitalWrite(led,HIGH);
     }
    else if(message.indexOf("OFF") > -1){

      Serial.println("LED OFF");
      digitalWrite(led,LOW);

  }

  delay(10);

//////////////////// j'ai rassembler les deux codes qui n'arrive pas  à fonctionner///////////////////////////

#include <SoftwareSerial.h> //software serial library for serial communication b/w arduino & GSM

SoftwareSerial mySerial(7, 8);//TX=7,rx=8
int val;
int l=13;
int i=0;
int secCount = 0;
int humideCount = 0;
int tropHumideCount = 0;
const int MAX_SMS_SENT = 2;

String message;

void setup() {
    pinMode(13, OUTPUT);
    mySerial.begin(19200);              
    Serial.begin(19200);   
     delay(100);
      mySerial.print ("ATE0r");
//Réponse();
 mySerial.print ("ATr");
//Réponse();
 mySerial.print ("AT + CMGF = 1r");
//Réponse();
 mySerial.print ("AT + CNMI = 1,2,0,0,0r");
//Réponse();
  //pinMode(led,OUTPUT);
  digitalWrite(13,LOW);
    

}

void loop() {
  
  if (mySerial.available()>0){
  message = mySerial.readString();
  }

  if(message.indexOf("ON") > -1){
      Serial.println("LED ON");
     digitalWrite(l,HIGH);
     }
    else if(message.indexOf("OFF") > -1){

      Serial.println("LED OFF");
      digitalWrite(l,LOW);

  }

  delay(10);

   val=analogRead(A0);
   String etat;
    Serial.print ("valeur est:");
  Serial.println(val);
  delay(100);
  if (val <=400){
    etat="sec";
  
    while(secCount < MAX_SMS_SENT){
     Serial.print ("\n secCount est : ");
     Serial.println(secCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est sec: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       secCount++;
      }  
    }  

    if(val>400 && val<700){
     
       etat="humide";
    
    while(humideCount < MAX_SMS_SENT){
     Serial.print ("\n humideCount est : ");
     Serial.println(humideCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est humide: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       humideCount++;
      }  
      
       digitalWrite(13,LOW);
    
       Serial.print("sol est");
       Serial. println(etat);
    }
    
    if(val >700){
      etat="trop";

    while(tropHumideCount < MAX_SMS_SENT){
     Serial.print ("\n tropHumideCount est : ");
     Serial.println(tropHumideCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est trop humide: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       tropHumideCount++;
      }  
      
      digitalWrite(13,LOW);
    
      Serial.print("sol est");
      Serial. println(etat);
    }
  delay(1000);

}

MERCI D'AVNCE 

  

Portrait de Walter

Ok, je ne sais pas trop comment te répondre, ca fait un moment que tu es sur le forum et que tu code sur arduino.

Donc peut être que je m'imagine des choses et que c'est un simple oubli.
Mais as tu bien compris comment fonctionne l'arduino et à quoi servent les fonctions setup et loop.
Si ce n'est pas le cas, il faudrait que tu reprenne des cours ou tutorial sur l'arduino avant d'aller plus loin.

Ton erreur viens que tu fait des actions dans le code d'initialisation de ton arduino.
La fonction "setup" est appelée une seule fois au début de l'activation de l'arduino.
La fonction loop est appelé après "setup" en boucle tant que l'arduino est alimentée.

Donc en gros, dans la fonction "setup" mieux vaut ne pas avoir une partie de ton algo, mais uniquement l'initialisation du hardware de l'arduino.

 

Portrait de ADOU

BONJOUR Manoé.

Manoé j'ai pas dit que walter me donne le code. j'ai un problème au niveau de mon code j'essai de trouver l'erreur .tout ce que vous avez dit j'ai compris.mais le programme ne marche toujours pas 

Portrait de Walter

Malheureusement ADOU, non si ton programme ne marche pas c'est que tu n'a pas compris ce que j'ai écrit rapidement et que Manoé a décrit plus en détail.
Je t'ai précisément dit pourquoi ton programme ne marche pas.
Je pense que te donner la ligne précise de ton erreur et les changements a effectuer, n'est pas dans ton intérêt.
Tu ne peux pas développer ce type de programme avec si peu de connaissance.
Tu dois dans un premier temps parfaire ta connaissance de l'envirronement même si tu dois rendre ton projet dans un temps limité.

Dans le cadre de ton projet à tu fait ou t'a ton demander une analyse, type UML.
Notamment le diagramme d'activité ou un équivalent?

Lorsque l'on aborde un sujet complexe ou que l'on maîtrise peu, on gagne beaucoup de temps à faire ce genre de diagramme, pour au moins avoir une idée claire de ce que doit faire le programme.

Normalement tu as toutes les informations pour fusionner correctement tes deux programmes.
Si tu as des questions précises n'hésites pas.

Portrait de ADOU

bonsoir walter 

j'ai pas fais analyse UML(si possible de l'expliquez svp).

je vais organiser le programme et poster 

Portrait de ADOU

REBONSOIR 

WALTER ou es on doit mettre les commandes AT dans void loop?

#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8);

int val;
int l=13;
String message;
String etat;
int i=0;
int secCount = 0;
int humideCount = 0;
int tropHumideCount = 0;
const int MAX_SMS_SENT = 2;

void setup()
{
   pinMode(13, OUTPUT);
    mySerial.begin(19200);              
    Serial.begin(19200);   
    delay(500);
mySerial.print ("ATE0r");
mySerial.print ("ATr");
 mySerial.print ("AT + CMGF = 1r");
mySerial.print ("AT + CNMI = 1,2,0,0,0r");
}

void loop(){
mySerial.print ("ATE0r");
 mySerial.print ("ATr");
 mySerial.print ("AT + CMGF = 1r");
 mySerial.print ("AT + CNMI = 1,2,0,0,0r");

  if (mySerial.available()>0){
  message = mySerial.readString();
  }

  if(message.indexOf("ON") > -1){
      Serial.println("LED ON");
     digitalWrite(l,HIGH);
     }
    else if(message.indexOf("OFF") > -1){

      Serial.println("LED OFF");
      digitalWrite(l,LOW);

  }

  delay(10);
   val=analogRead(A0);
  // String etat;
    Serial.print ("valeur est:");
  Serial.println(val);
  delay(100);
  if (val <=400){
    etat="sec";
  
    while(secCount < MAX_SMS_SENT){
     Serial.print ("\n secCount est : ");
     Serial.println(secCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est sec: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       secCount++;
      }  
    }  

    if(val>400 && val<700){
     
       etat="humide";
    
    while(humideCount < MAX_SMS_SENT){
     Serial.print ("\n humideCount est : ");
     Serial.println(humideCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est humide: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       humideCount++;
      }  
      
       digitalWrite(13,LOW);
    
       Serial.print("sol est");
       Serial. println(etat);
    }
    
    if(val >700){
      etat="trop";

    while(tropHumideCount < MAX_SMS_SENT){
     Serial.print ("\n tropHumideCount est : ");
     Serial.println(tropHumideCount);
  
     digitalWrite(13,HIGH);
    //Pour envoyer un sms sous forme de texte
       mySerial.print("AT+CMGF=1\r");    
       delay(100);
       //Numero de telephone du destinataire
       mySerial.println("AT + CMGS = \"90110401\"");
       delay(100);
       mySerial.println("Alerte le sol est trop humide: ");
       delay(100);
       mySerial.println((char)26); // 26 equivalent ASCII de ctrl+z (fin du message:CTRL-Z)
       delay(100);
       mySerial.println("c'est fait."); 
       tropHumideCount++;
      }  
      
      digitalWrite(13,LOW);
    
      Serial.print("sol est");
      Serial. println(etat);
    }
  delay(1000);
 }
  
  
    

Portrait de ADOU

Merci Manoé

j'utilise le sim900

Portrait de ADOU

merci j'ai changer le sim800 en sim900

Portrait de ADOU

j'ai deja cette library dans arduino

Portrait de Walter

Si tu mets en commentaire le code d'envois de SMS, cela fonctionne?
De façon général j'aurais tendance à te conseiller de couper ton code en fonction, voir mieux en objet.
tu as pas mal de commande AT en double, ton code gagnerait en lisibilité

Si tu as la librairie, pourquoi tu ne l'utilise pas, plutôt que de t'embêter à passer les commandes AT à la main?

Portrait de Walter

Du coup tu t'en es sortis ADOU?

Portrait de Walter

Oui je sais, c'est pourquoi je l'ai relancé, car personnellement je ne suis pas sûre d'essayer de l'aider, si il y n'a aucun retour :)