arduino recevoir sms

Bonjour, je débute en arduino et j’ai fait un code qui permet d’envoyer des sms/appels téléphonique. Mon code n’est pas parfait et je vous demmande un peu d’aide pour l’améliorer :

  1. déja je voudrais remplacer Serial.read() == ’p’ par un comme Serial.read() == ’p numero_telephone’ Au lieu d’envoyer à mon arduino la lettre p pour passer un appel, je voudrais lui envoyer p + le numero de téléphone à appeler (ma fonction send_call prendra un argument numero_telephone) Meme chose avec sms avec en plus du numero le message J’ai regardé la doc normalement je devrais utiliser la fonction readstring mais arduino m’affiche une erreur comme quoi il veut un int et pas un const char *

  2. Je ne sais pas comment faire pour en récupérer un sms/apeels téléphonique par contre. Je voudrais afficher les sms que je reçois dans la fonction void Get_SMS(), la par contre j’ai trouvé 2-3 trucs sur le net mais j’ai rien compris a comment faire. si quelqu’un pouvais m’aiguiller.

#include <SoftwareSerial.h>


SoftwareSerial SIM900(7, 8);

char message=0;

void setup()
{
SIM900.begin(19200);
delay(25000);
Serial.begin(19200);
Serial.println("OK");

digitalWrite(9, HIGH);
delay(1000);
}

void Send_Call()
{
    SIM900.println("ATD 0608446677;");
    delay(100);
    SIM900.println();
    //delay(120000);
    while(Serial.read() != '1') {
        delay(100);
    }
    SIM900.println("ATH");
    delay(1000);
}

void Send_SMS()
{
    SIM900.print("AT+CMGF=1\r");
    delay(100);
    SIM900.println("AT+CMGS=\"0608446677\"");
    delay(100);
    SIM900.println("test sms");
    delay(100);
    SIM900.println((char)26);
    delay(100);
    SIM900.println();
    delay(5000);
    Serial.println("SMS sent successfully");
}

void Get_SMS()
{
    message=SIM900.read();
    Serial.print(message);
}

void Get_Call()
{

}


void loop() {

    if(Serial.read() == 'p') {
        Send_Call();
    }

    if(Serial.read() == 's') {
        Send_SMS();
    }

    Get_SMS();
    Get_Call();

}

Si vous regardez dans la très longue discussion AQUABOUN'S /// GESTION D'AQUARIUM RECIFAL il y a un moment où on a exploré l’envoie et réception de sms et analyse du contenu

Vous devriez y trouver des idées

merci, je me suis inspiré du topic.
Mais hélas je n'arrive pas à recevoir mes sms.
Aurais-je fait une erreur quelque part ?

#include <SoftwareSerial.h>


SoftwareSerial SIM900(7, 8);

char message=0;

void setup()
{
SIM900.begin(19200);
delay(25000);
Serial.begin(19200);
Serial.println("OK");

digitalWrite(9, HIGH);
delay(1000);
}

void Send_Call()
{
  SIM900.println("ATD 0608446677;");
  delay(100);
  SIM900.println();
  //delay(120000);
  while(Serial.read() != '1') {
    delay(100);
  }
  SIM900.println("ATH");
  delay(1000);
}

void Send_SMS()
{
  SIM900.print("AT+CMGF=1\r");
  delay(100);
  SIM900.println("AT+CMGS=\"0608446677\"");
  delay(100);
  SIM900.println("test sms");
  delay(100);
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(5000);
  Serial.println("SMS sent successfully");
}

String readSIM900()
{
    String buffer;

    while (SIM900.available())
    {
      char c = SIM900.read();
      buffer.concat(c);
      delay(10);
    }
    return buffer;
}

void Get_SMS()
{
    String buffer = readSIM900();

    if (buffer.startsWith("\r\n+CMT: "))
    {
        Serial.println("*** RECEIVED SMS ***");
        
        // Remove first 51 characters
        buffer.remove(0, 51);
        int len = buffer.length();
        // Remove \r\n from tail
        buffer.remove(len - 2, 2);
        
        Serial.println(buffer);
        
        Serial.println("*** END SMS ***");
    }
}

void Get_Call()
{

}


void loop() {

  if(Serial.read() == 'p') {
    Send_Call();
  }

  if(Serial.read() == 's') {
    Send_SMS();
  }
  

    delay(100);
  
  Get_SMS();
  Get_Call();

}

votre code n'a rien à voir avec ce qui est dans le fil de discussion...

c'est bon j'ai trouvé pour les sms

#include <SoftwareSerial.h>


SoftwareSerial SIM900(7, 8);

char message=0;

void setup()
{
SIM900.begin(19200);
delay(25000);
Serial.begin(19200);
Serial.println("OK");

digitalWrite(9, HIGH);
delay(1000);
}

void Send_Call()
{
  SIM900.println("ATD 0608446677;");
  delay(100);
  SIM900.println();
  //delay(120000);
  while(Serial.read() != '1') {
    delay(100);
  }
  SIM900.println("ATH");
  delay(1000);
}

void Send_SMS()
{
  SIM900.print("AT+CMGF=1\r");
  delay(100);
  SIM900.println("AT+CMGS=\"0608446677\"");
  delay(100);
  SIM900.println("test sms");
  delay(100);
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(5000);
  Serial.println("SMS sent successfully");
}

String readSIM900A()
{
    String buffer;

    while (SIM900.available())
    {
        char c = SIM900.read();
        buffer.concat(c);
        delay(10);
    }

    return buffer;
}

void Get_SMS()
{
  SIM900.println("AT+CNMI=2,2,0,0,0"); 
  delay(1000);
}

void Get_Call()
{

}

void loop() {
  if (Serial.available()>0) {

    if(Serial.read() == 'p') {
      Send_Call();
    }
  
    if(Serial.read() == 's') {
      Send_SMS();
    }
    
   Get_SMS();
   Get_Call();

  }

 if (SIM900.available()>0)
   Serial.write(SIM900.read());

}

reste plus qu'a trouve pour les appels vocaux
c'est plus compliqué car comme l'ai compris dans les commande at faut d'abord lancer l'alarm avec AT+CALA avant d'&accepter l'appel (je n'arrive pas à trouvé la command AT pour accepter l'appel)

quand vous avez un appel il va vous dire RING

ATA\r\n pour recevoir un call et ATH pour raccrocher

AT+CLIP=1\r\n pour voir le N° de l'appelant

--> lire la doc des commandes AT

Je me suis mal exprimé, oui il m'affiche bien "ring" dans la console mais ma question c'est comment accepter l'appel au moment ou il y'a le ring ?

voila ma fonction get_call qui est appeler dans le loop :

void Get_Call() {
  SIM900.println("ATA"); //prendre l'appel
  SIM900.print("AT+CLIP=1\r\n");
  
  while(Serial.read() != '1') { // si j'envioie 1 je termine l'apelle
    delay(100);
  }

  SIM900.println("ATH");*/
}

la ou je bloque c'est que je voudrais que get_call() soit appeler quand y'a le ring, la actuellement il execute ma fonctiion a chaque itération de la boucle loop et donc mon programme s’arrête à ma boucle while. Je voudrais executer ma boucle while et la commande ath qui suit uniquement si j'ai un appel.

Comment on fait pour décrocher le téléphone ?

Depuis mon smarthpone je lance l'apelle et sa sonne.
Sur mon arduino j'ai le message ring qui s'affiche mais rien ne passe, je n'arrive pas à accepter l’appelle.

void Get_Call() {

  char incoming_char=0;
  incoming_char=SIM900.read();
    if (incoming_char=='R') {
      SIM900.println("ATA");
      SIM900.println("ATA\r");

      SIM900.write("ATA");
      delay(5000000);
      SIM900.println("ATH");

    }

SIM900.write("ATA"); N’envoie pas le CRLF pour exécuter la commande...

J'ai rajouter le retour à la ligne avec \n\r mais je n'ai aucun changement.

void Get_Call() {

  char incoming_char=0;
  incoming_char=SIM900.read();
    if (incoming_char=='R') {
      SIM900.println("ATA\r\n");
      SIM900.write("ATA\r\n");
      
      delay(5000000);
      SIM900.println("ATH");

    }

Postez tout le code - on ne sait pas ce que vous faites

Vous ne lisez qu’un ‘R’ au lieu de RING c’est un peu léger à mon avis..

J'ai modifier le code pour prendre en compte le ring complet et pas juste le 'R'

voici le code complet :

#include <SoftwareSerial.h>

SoftwareSerial SIM900(7, 8);
char message=0;

void setup() {
  SIM900.begin(19200);
  delay(25000);
  Serial.begin(19200);
  Serial.println("OK");
  digitalWrite(9, HIGH);
  delay(1000);
}

void Send_Call() {
  SIM900.println("ATD 0608446677;");
  delay(100);
  SIM900.println();
  while(Serial.read() != '1') {
    delay(100);
  }
  SIM900.println("ATH");
  delay(1000);
}

void Send_SMS() {
  SIM900.print("AT+CMGF=1\r");
  delay(100);
  SIM900.println("AT+CMGS=\"0608446677\"");
  delay(100);
  SIM900.println("test sms");
  delay(100);
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(5000);
  Serial.println("SMS sent successfully");
}

void Get_SMS() {
  SIM900.println("AT+CNMI=2,2,0,0,0"); 
  delay(1000);
}

void Get_Call() {

  char incoming_char=0;
  incoming_char=SIM900.read();
    if (incoming_char=='R') {
      incoming_char=SIM900.read();
      if (incoming_char=='I') {
        incoming_char=SIM900.read();
        if (incoming_char=='N') {
          incoming_char=SIM900.read();
          if (incoming_char=='G') {
            SIM900.println("ATA\r\n");
            SIM900.write("ATA\r\n");
            
            delay(5000000);
            SIM900.println("ATH");
          }
        }
      }
    }
}

void loop() {
  if (Serial.available()>0) {
    if(Serial.read() == 'p') {
      Send_Call();
    }
    if(Serial.read() == 's') {
      Send_SMS();
    }
  }
  

 if (SIM900.available()>0)
   Get_SMS();
   Get_Call();
   Serial.write(SIM900.read());
}

Comment êtes vous sûr que les caractères sont dispo à la lecture ?

Il faut écouter des messages entiers puis ensuite analyser ce que le module vous a dit (au moins une analyse par ligne)

"Il faut écouter des messages entiers puis ensuite analyser ce que le module vous a dit (au moins une analyse par ligne)"

comment sa ?

mais de toute manière ce n'est pas le probleme.
meme sans ma condition if, je n'arrive pas a accepter l'appel.

void Get_Call() {

  char incoming_char=0;
  SIM900.println("ATA\r\n");
  SIM900.write("ATA\r\n");
  
  delay(5000000);
  SIM900.println("ATH");
}

J'arrive à accepter et a raccrocher un appel.

Mais il me manque en faite la condition pour détecter un appel.

#include <SoftwareSerial.h>

SoftwareSerial SIM900(7, 8);
char message=0;

void setup() {
  SIM900.begin(19200);
  delay(25000);
  Serial.begin(19200);
  Serial.println("OK");
  digitalWrite(9, HIGH);
  delay(1000);
}

void Send_Call() {
  SIM900.println("ATD 0608446677;");
  delay(100);
  SIM900.println();
  while(Serial.read() != '1') {
    delay(100);
  }
  SIM900.println("ATH");
  delay(1000);
}

void Send_SMS() {
  SIM900.print("AT+CMGF=1\r");
  delay(100);
  SIM900.println("AT+CMGS=\"0608446677\"");
  delay(100);
  SIM900.println("test sms");
  delay(100);
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(5000);
  Serial.println("SMS sent successfully");
}

void Get_SMS() {
  SIM900.println("AT+CNMI=2,2,0,0,0"); 
  delay(1000);
}

void Get_Call() {

    Serial.println("Phone");
    SIM900.println("ATA\r\n");

    while(Serial.read() != 'i') {
      delay(1000);
    }
    SIM900.println("ATH");
}

void loop() {
  if (Serial.available()>0) {
    if(Serial.read() == 'p') {
      Send_Call();
    }
    if(Serial.read() == 's') {
      Send_SMS();
    }
  }
  

 if (SIM900.available()>0)
   Get_SMS();
   Get_Call();
}

Apres avoir téléverser mon code à l'arduino, je lance mon appel et la mon programme décroche bien.

Moi je voudrais mettre une condition if dans ma fonction get_call.
Je voudrais quelque chose dans ce style =>"si quelqu'un m'appelle" alors execute la fonction get call
Je ne sais pas quoi mettre pour avoir cette condition, quelqu'un le saurais t'il ?

je vous l'ai dit plus haut: vous devez écouter ce que vous dit votre GSM. Quand vous recevez RING alors vous savez que vous avez un appel et vous décrochez

cf le références de posts précédents sur comment écouter le port Série du GSM et prendre des décisions

Bonjour,
ayant eu le même problème, voici les solutions que j'ai trouvé :

1- bien définir le mode de réception des sms : GPRS.println("AT+CNMI=2,1,0,0,0"); qui permet de recevoir des sms stockés (+CMTI) en mémoire et non GPRS.println("AT+CNMI=2,2,0,0,0");

2-le nombre de sms stockés est limités, il faut donc les supprimer après réception. j'en suis là, et j'ai un peu de mal à les supprimer après réception... GPRS.println("AT+CMGD=ALL,4"); ou GPRS.println("AT+CMGD=1,3"); ou GPRS.println("AT+CMGL="ALL",0 "); mais rien ne marche...
amicalement,
Vincent