Arduino Forum

International => Français => Topic started by: matth122 on Apr 15, 2015, 03:34 pm

Title: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 15, 2015, 03:34 pm
bonjour,

J'ai besoin pour mon projet de savoir l'ors d'un appel téléphonique avec module gsm, si le téléphone a l'autre bout à décroché
J'ai vu qu'il existait deux commande AT  une +CLCC et l'autre +CPAS.
La CPAS me semblais plus simple puisque on attend en retour la valeur 4 qui est censée  indiquer que l'autre partie à décroché.
Seulement voilà je ne trouve pas et aussi je ne comprend pas comment faire pour interpréter cette réponse affin quelle active une action  définie,
J'ai essayé tout ce que j'ai pus trouver dans divers tutos mais rien ne fonctionne, soit ça active la fonction des que le téléphone sonne, soit il se passe rien.

Sachant que je ne peut utiliser que la librairie Softwareserial, une commande comme SIM900.read()  me fait une erreurs de compilation

Ça fait une semaine que je rame et j'y arrive pas !

Merci à ceux qui pourrons m'aider j'en ai vraiment besoins

Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 15, 2015, 03:46 pm
Ton code c'est à nous de le deviner ?
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 15, 2015, 04:17 pm
le code est tout simple, pour le moment c'est juste une ébauche qui me sert de test et d'aprentissage
ou j'intègre au fur et a mesure les commandes suivant mes besoins

Code: [Select]

 
#include <SoftwareSerial.h>
SoftwareSerial SIM900(2, 3); // softwareserial port
 
void setup()
{
  SIM900.begin(19200);               
  SIM900power(); 
  delay(20000);  // temps pour se logger au reseau
}
 void SIM900power()
{
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(5000);
}

void MakeCall()
{
  SIM900.println("ATD + +33XXXXXXXX;"); // lance l'appel
  delay(100);
  SIM900.println();
  delay(30000);            // delais de 30 seconde
  SIM900.println("ATH");   // puis racroche
}
 
void loop()
{
  MakeCall(); // appel
  //SIM900power();   
  do {} while (1);
}



je cherche donc a intégrer dans ce code une demande type SIM900.println(AT +CPAS)  dont la réponse  exécutera une action, qui sera plus tard la lecture d'un MP3 via le shield sparfun
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 15, 2015, 04:51 pm
http://elecfreaks.com/store/download/datasheet/rf/SIM900/SIM900_AT%20Command%20Manual_V1.03.pdf (http://elecfreaks.com/store/download/datasheet/rf/SIM900/SIM900_AT%20Command%20Manual_V1.03.pdf)

D'après la documentation ci-dessus, lorsque tu passes ta commande d'appel (ATD + +33xxxxx), cette dernière peut répondre OK :
- soit immédiatement après la numérotation
- soit une fois que la communication est établie

Le choix entre ces 2 modes se faisant par la commande AT+COLP=<n>
- 0 : retour juste après la numérotation
- 1 : retour après que la communication soit établie

La solution la plus simple ne serait-elle pas de configurer AT+COLP=1 ?
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 15, 2015, 07:18 pm
je veux bien configurer AT+COLP=1  si je savais comment faire,

 il est surtout la mon problème.

et je ne trouve pas d'exemple de tuto ou même un cour explicatif la dessus
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: Artouste on Apr 15, 2015, 07:39 pm
je veux bien configurer AT+COLP=1  si je savais comment faire,

 il est surtout la mon problème.

et je ne trouve pas d'exemple de tuto ou même un cour explicatif la dessus
bonsoir

c'est de la commande AT basique , identique a ce que tu utilise pour numeroter (ATD+)

ça doit prendre la forme d'une ligne dans ton code apres mise en route du module sim900
du genre :
Code: [Select]
SIM900.println("AT+COLP=1"); // configure COLP à 1



Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 15, 2015, 08:10 pm
avec cette ligne "SIM900.println("AT+COLP=1"); // configure COLP à 1" , on interoge le module GSM ou on le force a 1 ?

de ce que je pense avoir un peut compris de la  commande AT

on envoie une requête:  SIM900.printnl("AT+COLP?");

on attend la reponse    la je sèche

on traite la reponse :    if(SiM900.printnl(AT+COLP?", " 1", 1000)) == 1 ) {
                                  digitalwrite( led13, high) } // exemple

je suis sur le bon chemin ou j'ai tout faux ?




Title: Re: Comment lire la réponse d'une commande AT ?
Post by: Artouste on Apr 15, 2015, 08:16 pm
avec cette ligne "SIM900.println("AT+COLP=1"); // configure COLP à 1" , on interoge le module GSM ou on le force a 1 ?

...

je suis sur le bon chemin ou j'ai tout faux ?

Sous toutes reserves (je me base sur la doc,) je n'ai pas de SIM900
tu force la config COLP à 1 , sans te préoccuper de son etat precedent
il est inutile de connaitre l'etat anterieur dans la mesure où tu veux imposer COLP à 1
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 15, 2015, 08:21 pm
si je force a 1 le COLP j'obtiendrais quand même l'information de savoir si une personne a décroche le téléphone  ?
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: Artouste on Apr 15, 2015, 08:38 pm
Je me suis basé sur la reponse de bigben99 de 16H51 --->relire :smiley-cool:
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 15, 2015, 09:16 pm
Je n'ai pas de module SIM900, donc je me base uniquement sur la doc également, mais toi qui a un module, tu pourrais peut-être tester ? et ensuite nous donner le résultat ?
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 15, 2015, 10:10 pm
Si vous me fournissez des sketch je veux bien tester tout ce que vous voulez !
Mais la ligne AT+colp=1 je la met pas juste comme ça dans le sketch et  il lui faut un retour pour exécuter une action par exemple mettre a 1 la sortie 13 ça permet de visualiser si le téléphone a été décroché
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 15, 2015, 10:27 pm
pour le sketch je ne pourrais pas te l'écrire, je n'ai aucun moyen de vérifier un minimum ce que je ferais.

Mais si tu fais :
Code: [Select]

SIM900.println("AT+COLP=1");
SIM900.println("ATD + +33xxx");


Si je comprends bien la documentation, tu devrais avoir un OK en retour de ton ATD uniquement lorsque ton correspondant aura décroché.
Mais encore une fois, ce n'est que du théorique, il faut que tu testes.
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 16, 2015, 10:34 pm
Comme je m'y attendais mettre seulement SIM900.println("AT+COLP=1"); na absolument aucun effet.

j'essaie différent code trouvé ici et la mais sans vraiment comprendre ce que je fais,
bref j'arrive a rien
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 17, 2015, 06:48 am
Tu reçois toujours le retour "OK" immédiatement ?
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 17, 2015, 07:20 am
Non en fait je reçois rien du tout si je rajoute la ligne seule
Il faut rajouter des bout de code pour écouter la réponse et l'afficher
J'ai trouve quelques informations mais quand je met le code ça m'affiche ok sans même avoir composer le numéro !
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 17, 2015, 08:02 am
Si tu reçois des informations mais tu ne les lis pas, ça n'est pas tout à fait la même chose.

Peux-tu donner ton code complet avec la partie lecture de la réponse à la commande ?
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: infobarquee on Apr 17, 2015, 08:40 am
bonjour,
je crois qu'il faudrait que tu prenne la doc du sim900 et surtout des commandes AT.
tu auras tout dedans.
pour certaines commandes, la réponse est simplement OK, donc que veux tu de plus?

et surtout le code que tu rentre
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 17, 2015, 09:09 am
Avec les éléments fournis et mon intuition, je pense qu'il ne traite pas les réponses.
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 17, 2015, 12:38 pm
Le code est celui qui est sur la page 1 j'y ajoute la ligne COLP
La doc des commandes AT je lai lue mais je ne sais pas comment écrire le code pour interpréter la réponse du shield !
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: Artouste on Apr 17, 2015, 12:49 pm
Le code est celui qui est sur la page 1 j'y ajoute la ligne COLP
La doc des commandes AT je lai lue mais je ne sais pas comment écrire le code pour interpréter la réponse du shield !
bonjour
attention à une chose :
c'est normal que tu recoive un "OK" immediatement apres AT+COLP=1 , cela signifie simplement  que cette commande à été prise en compte.
ce qu'il faut que tu fasse c'est de verifier seulement apres la commande numertotion que tu recoive un "OK"
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 17, 2015, 01:22 pm
Ok donc j'avais vu juste.

C'est bien d'envoyer des commandes AT à ton module via ton port série, mais peut-être faudrait-il lire les réponses que t'envoie ton module ?

un petit tour sur la documentation de Serial.read() devrait t'aider.
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 17, 2015, 03:34 pm
C'est pas plutôt SIM900.read()?
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: bigben99 on Apr 17, 2015, 03:47 pm
Serial.read() c'est la méthode générique pour lire sur un port série... SIM900 c'est le nom que tu as donné à ta liaison série mais quelqu'un d'autre pourrait nommer sa liaison autrement.

Donc dans ton cas, c'est bien SIM900.read()
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 17, 2015, 04:50 pm
Ok je ferais des recherches sur serial.read et j'adapterais après.
 un bon weekend de recherche et d'apprentissage a l'horizon
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 19, 2015, 02:27 pm
Bonjour ,

Alors voila ou j'en suis
le code
Code: [Select]

#define DEBUG
#include <SoftwareSerial.h>
SoftwareSerial SIM900(2, 3); // configure software serial port


 void setup()
{
  Serial.begin(9600);
  Serial.println("debut du setup");
  SIM900.begin(2400);               
 // SIM900power(); 
  delay(30000);  // give time to log on to network.
  Serial.println("fin du timer");
 
   }

 
void SIM900power()
// software equivalent of pressing the GSM shield "power" button
{
  digitalWrite(8, HIGH);
  delay(1000);
  digitalWrite(8, LOW);
  delay(5000);
}
 
void callSomeone()
{   
   SIM900.println("AT+COLP=1"); // active colp
   SIM900.println("AT+COLP?"); // interroge le colp
   GetSIM900();
   Serial.println("debut appel");
   
   SIM900.println("ATD + +33XXXXXXXX;");
   delay(1000);
   SIM900.println();
   
  delay(20000);            // attente de 20 seconde...
  SIM900.println("ATH");   // raccroche

}
 
void loop()
{
  callSomeone(); // appel
 // SIM900power();   // power off GSM

do {} while (1); // do nothing
 }
 
 void GetSIM900()
{
  delay(2000);
 
  if(SIM900.available())
  {
    Serial.print("\n");
    delay(3000);
    while(SIM900.available())
    {
      Serial.print((char)SIM900.read()); // On vide la mémoire tampon du SIM900
    }
    Serial.print("\n");
  }
}


j'ai ajouté des notes pour savoir l'avancement du programme

et voila la lecture sur le moniteur serie

Code: [Select]

debut du setup
fin du timer

AT+COLP=1
AT+COLP?

OK

debut appel

ATD + +33XXXXXXXX;

+COLP: "++33XXXXXXXX",145,"",0,"" 

OK




sur la ligne +COLP: "++33XXXXXXXX",145,"",0,""   ne devrais-je pas avoir 1 quand je décroche ?
Title: Re: Comment lire la réponse d'une commande AT ?
Post by: matth122 on Apr 19, 2015, 10:43 pm
bon en fait le shield gsm semble envoyer les commandes sans qu'on lui demande
car avec le simple code
Code: [Select]

 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  mySerial.begin(2400);
 
  mySerial.println("ATD + +33XXXXXXXXX;");
  delay(1000);
   }

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}



j'obtiens ces informations dans le moniteur serie

Code: [Select]


+CLCC: 1,0,3,0,0,"++33XXXXXXXX",145,""  // appel lancé


+COLP: "++33XXXXXXXXX",145,"",0,""     // interogation du colp

+CLCC: 1,0,0,0,0,"++33XXXXXXXX",145,""  // valeur de retour au decroché du telephone appelé

OK


+CLCC: 1,0,6,0,0,"++33XXXXXXXX",145,""  //retour après avoir raccroché

NO CARRIER



maintenant je dois trouver comment interpréter la réponse pour lancer une action définie