[RESOLUE] Aide sur bug de programme

OK, si tu as des problèmes, par exemple avec des caractères spéciaux comme \r, tu peux te contenter de comparer les premiers caractères du message, par exemple "OK" au lieu de "OK\r", il doit bien exister un moyen de limiter aux 2 premiers caractères...

Bon je viens de me remettre sur mon projet, et j'ai encore le même problème.

Le code et fonctionnel tel que je l'ai mis plus haut, mais quand je recommence a écrire un peu plus, j'ai a nouveaux les mêmes problèmes.

#include <SoftwareSerial.h>
#define rxPin 7
#define txPin 8

SoftwareSerial gsm(rxPin, txPin);

char Commande[32]= {0};
char Numero[32]= {0};
char Date[32]= {0};
char Message[64]= {0};
char Heure[32]= {0};

int Etape = 0;

void setup()
{
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 gsm.begin(9600);
 Serial.begin(9600);
 //sendsms();
}

void loop()
{  
  Exe();

   if(gsm.available())
  {
    int i = 0;
    char someChar[257]= {0};
    while (gsm.available() > 0)
    {
      someChar[i] = gsm.read();
      if (i<256){i++;}
      delay(3);
      }
      if(Etape == 100){Serial.println(someChar);}
      Format(someChar,i);
      Etape++;
  }
  if(Serial.available())
  {
    int i = 0;
    char someChar2[32]= {0};
    while (Serial.available() > 0)
    {
      someChar2[i] = Serial.read();
      if (i<31){i++;}
      delay(3);
      }
    gsm.println(someChar2);
    Etape = 100;
    }
}

void Format(char *MsgF,int T)
{
  int L=0;
  int c=0; 
  char Ligne[6][64] = {{0},{0}};
  char Info[7][32] = {{0},{0}};
    
  for(int i=0;i<=T;i++)
  {
    if (MsgF[i]== '\n')
    {
      L++;
      c=0;
    }
    else
    {
      Ligne[L][c]= MsgF[i];
      c++;
    }
  }
  
  L=0;
  c=0;

  for (int i=0;i<64;i++)
  {
    if (Ligne[1][i]== ',')
    {
      L++;
      c=0;
    }
    else if (Ligne[1][i]!='"')
    {
      Info[L][c]=Ligne[1][i];
      c++;
    }
  }
  
  for(int i=0; i<32;i++){Commande[i]=0;}
  for(int i=0; i<32;i++){Commande[i]=Info[0][i];}
  
  if(strcmp(Commande, "+CMGL: 1") == 0)
  { 
    for(int i=0;i<32;i++){Numero[i]=0;Date[i]=0;Heure[i]=0;}
    for(int i=0;i<64;i++){Message[i]=0;}

    for(int i=0;i<32;i++){Numero[i]= Info[2][i];Date[i]=Info[4][i];}
    for(int i=0;i<64;i++){Message[i]= Ligne[2][i];}
    for(int i=0;i<32 and Info[5][i]!='+';i++){Heure[i]=Info[5][i];}
  }
}

void Exe()
{
  switch(Etape)
  {
    case 0:
    //Serial.println("Attente");
    delay(500);
    break;

    case 1:
    if(strcmp(Commande, "+CMTI: SM") == 0){Serial.println("Message Recue");gsm.print("AT+CMGL= \"ALL\"\r");delay(100);}
    else {Serial.println("Erreur 1");Etape = 0;}
    break;

    case 2:
    if(strcmp(Commande, "+CMGL: 1") == 0)
    {
      Serial.print("Message =");Serial.println(Message);
      Serial.print("Numero =");Serial.println(Numero);
      Serial.print("Date =");Serial.println(Date);
      Serial.print("Heure =");Serial.println(Heure);
      delay(100);
    }
    else {Serial.println("Erreur Lecture MSG");}
    
    gsm.print("AT+CMGD=1\r");
    delay(100);
    break;

    case 3:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Message Supprimé OK");Etape = 4;}    
    else {Serial.println("Erreur Suppression MSG");Etape = 0;}
    delay(100);
    break;
    
    case 4:
    if(strcmp(Message, "LED:ON\r") == 0){Serial.println("Demande Allumage Led)"); Etape= 0;}
    else if(strcmp(Message, "LED:OFF\r") == 0){Serial.println("Demande Arret Led)"); Etape= 0;}
    else if(strcmp(Message, "Porte\r") == 0){Serial.println("Demande Ouverture Porte"); Etape= 410;}
    else {Serial.println("Aucune commande connue");Etape = 0;}
    delay(100);
    break;

    case 410:
    if(strcmp(Numero, "+336XXXXXXXX") == 0){Serial.println("Commande Autorise, telephone de Jeremy"); Etape= 411;}
    else {Serial.println("Utilisateur inconnue");Etape = 0;}
    delay(100);
    break;

    case 411:
    Serial.println("Porte Ouverte OK");
    Etape= 412;
    delay(100);
    break;

    case 412:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Sms Envoye");} else {Serial.println("Erreur envoie sms");}Etape = 0;
    Etape= 0;
    delay(100);
    break;

    case 100:
    Serial.println("Commande Manu");
    delay(100);
    break;

    case 101:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Commande Manu OK");Etape = 0;} else {Serial.println("Erreur");}Etape = 0;
    break;

    case 104:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Commande Manu OK");Etape = 0;} else {Serial.println("Erreur");}Etape = 0;
    break;
  }
}
/*
void sendsms()
{    
    gsm.print("AT+CMGS=\"");
    gsm.print("+336XXXXXXXX");
    gsm.print("\"\r");
    delay(100);
    gsm.print("Test");
    gsm.print("\r");
    gsm.print(char(26));
    delay(100);
    gsm.println();
}*/

Tu as remis deux numéros de téléphone en clair...

Le problème c'est toujours que ça bloque à l'étape 410 ?

Ton code est bizarre : tu a mis des delay assez longs dans Exe, fonction appelée dès le début de la loop. Après Exe, tu vérifies si un message arrive, mais ces delay risquent de te faire rater l'arrivée des messages ?

Dans Format, tu sépares les lignes du message reçu mais tu ne traites que le contenu de la ligne numéro 1 (qui est au passage la seconde du tableau).

Je pense que tu devrais revenir à un code plus simple, mettre des Serial.println pour en suivre l'exécution et voir si les variables contiennent bien ce que tu penses, puis augmenter la complexité au fur et à mesure.

lesept:
Le problème c'est toujours que ça bloque à l'étape 410 ?

Non je passe pas le test de l'étape 1. Cette fois c'est la variable commande qui est erronée. C'est ma fonction Format encore une fois.

lesept:
Ton code est bizarre : tu a mis des delay assez longs dans Exe, fonction appelée dès le début de la loop. Après Exe, tu vérifies si un message arrive, mais ces delay risquent de te faire rater l'arrivée des messages ?

Non c'est pas un probléme. J'ai testé avec un delay de 10 sec. Le message ce met dans le buffer et attend que le delay soit terminée pour executer le code.

lesept:
Je pense que tu devrais revenir à un code plus simple, mettre des Serial.println pour en suivre l'exécution et voir si les variables contiennent bien ce que tu penses, puis augmenter la complexité au fur et à mesure.

C'est exactement ce que je fait. Mon code avec uniquement ma fonction format() et des Serial.println pour vérifier que j'ai bien tout récupérer fonctionne parfaitement. Du coup je passe a l'étape d'aprés puis ça fonctionne plus. Tu me demande de changer les String par des char, sa fonctionne correctement, je passe a l'étape suivante, et a nouveau, ça fonctionne plus.

En gros ce code la marche parfaitement lors de reception de sms:

#include <SoftwareSerial.h>
#define rxPin 7
#define txPin 8

SoftwareSerial gsm(rxPin, txPin);

char Commande[32]= {0};
char Numero[32]= {0};
char Date[32]= {0};
char Message[64]= {0};
char Heure[32]= {0};

int Etape = 0;

void setup()
{
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 gsm.begin(9600);
 Serial.begin(9600);
}

void loop()
{  
  Exe();

   if(gsm.available())
  {
    int i = 0;
    char someChar[257] = {0};
    while (gsm.available() > 0)
    {
      someChar[i] = gsm.read();
      if (i<256){i++;}
      delay(3);
      }
      if(Etape == 100){Serial.println(someChar);}
      Format(someChar,i);
      Etape++;
  }
  if(Serial.available())
  {
    int i = 0;
    char someChar2[32] = {0};
    while (Serial.available() > 0)
    {
      someChar2[i] = Serial.read();
      if (i<31){i++;}
      delay(3);
      }
    gsm.println(someChar2);
    Etape = 100;
    }
}

void Format(char *MsgF,int T)
{
  int L=0;
  int c=0; 
  char Ligne[6][64] = {{0},{0}};
  char Info[7][32] = {{0},{0}};
    
  for(int i=0;i<=T;i++)
  {
    if (MsgF[i]== '\n')
    {
      L++;
      c=0;
    }
    else
    {
      Ligne[L][c]= MsgF[i];
      c++;
    }
  }
  
  L=0;
  c=0;

  for (int i=0;i<64;i++)
  {
    if (Ligne[1][i]== ',')
    {
      L++;
      c=0;
    }
    else if (Ligne[1][i]!='"')
    {
      Info[L][c]=Ligne[1][i];
      c++;
    }
  }
  
  for(int i=0; i<32;i++){Commande[i]=0;}
  for(int i=0; i<32;i++){Commande[i]=Info[0][i];}
  
  if(strcmp(Commande, "+CMGL: 1") == 0)
  { 
    for(int i=0;i<32;i++){Numero[i]=0;Date[i]=0;Heure[i]=0;}
    for(int i=0;i<64;i++){Message[i]=0;}

    for(int i=0;i<32;i++){Numero[i]= Info[2][i];Date[i]=Info[4][i];}
    for(int i=0;i<64;i++){Message[i]= Ligne[2][i];}
    for(int i=0;i<32 and Info[5][i]!='+';i++){Heure[i]=Info[5][i];}
  }
}

void Exe()
{
  switch(Etape)
  {
    case 0:
    //Serial.println("Attente");
    delay(500);
    break;

    case 1:
    if(strcmp(Commande, "+CMTI: SM") == 0){Serial.println("Message Recue");gsm.print("AT+CMGL= \"ALL\"\r");delay(100);}
    else {Serial.println("Erreur 1");Etape = 0;}
    break;

    case 2:
    if(strcmp(Commande, "+CMGL: 1") == 0)
    {
      Serial.print("Message =");Serial.println(Message);
      Serial.print("Numero =");Serial.println(Numero);
      Serial.print("Date =");Serial.println(Date);
      Serial.print("Heure =");Serial.println(Heure);
      delay(100);
    }
    else {Serial.println("Erreur Lecture MSG");}
    
    gsm.print("AT+CMGD=1\r");
    delay(100);
    break;

    case 3:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Message Supprimé OK");Etape = 4;}    
    else {Serial.println("Erreur Suppression MSG");Etape = 0;}
    delay(100);
    break;
    
    case 4:
    if(strcmp(Message, "LED:ON\r") == 0){Serial.println("Demande Allumage Led)"); Etape= 0;}
    else if(strcmp(Message, "LED:OFF\r") == 0){Serial.println("Demande Arret Led)"); Etape= 0;}
    else if(strcmp(Message, "Porte\r") == 0){Serial.println("Demande Ouverture Porte"); Etape= 410;}
    else {Serial.println("Aucune commande connue");Etape = 0;}
    delay(100);
    break;

    case 410:
    if(strcmp(Numero, "+33XXXXXXXX") == 0){Serial.println("Commande Autorise, telephone de Jeremy"); Etape= 411;}
    else {Serial.println("Utilisateur inconnue");Etape = 0;}
    delay(100);
    break;

    case 411:
    Serial.println("Porte Ouverte OK");
    Etape= 412;
    delay(100);
    break;

    case 412:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Sms Envoye");} else {Serial.println("Erreur envoie sms");}Etape = 0;
    Etape= 0;
    delay(100);
    break;

    case 100:
    Serial.println("Commande Manu");
    delay(100);
    break;

    case 101:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Commande Manu OK");Etape = 0;} else {Serial.println("Erreur");}Etape = 0;
    break;

    case 104:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Commande Manu OK");Etape = 0;} else {Serial.println("Erreur");}Etape = 0;
    break;
  }
}

Et celui la n'arrive plus a décoder une réception de sms :

#include <SoftwareSerial.h>
#define rxPin 7
#define txPin 8

SoftwareSerial gsm(rxPin, txPin);

char Commande[32]= {0};
char Numero[32]= {0};
char Date[32]= {0};
char Message[64]= {0};
char Heure[32]= {0};

int Etape = 0;

void setup()
{
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 gsm.begin(9600);
 Serial.begin(9600);
 sendsms();
}

void loop()
{  
  Exe();

   if(gsm.available())
  {
    int i = 0;
    char someChar[257] = {0};
    while (gsm.available() > 0)
    {
      someChar[i] = gsm.read();
      if (i<256){i++;}
      delay(3);
      }
      if(Etape == 100){Serial.println(someChar);}
      Format(someChar,i);
      Etape++;
  }
  if(Serial.available())
  {
    int i = 0;
    char someChar2[32] = {0};
    while (Serial.available() > 0)
    {
      someChar2[i] = Serial.read();
      if (i<31){i++;}
      delay(3);
      }
    gsm.println(someChar2);
    Etape = 100;
    }
}

void Format(char *MsgF,int T)
{
  int L=0;
  int c=0; 
  char Ligne[6][64] = {{0},{0}};
  char Info[7][32] = {{0},{0}};
    
  for(int i=0;i<=T;i++)
  {
    if (MsgF[i]== '\n')
    {
      L++;
      c=0;
    }
    else
    {
      Ligne[L][c]= MsgF[i];
      c++;
    }
  }
  
  L=0;
  c=0;

  for (int i=0;i<64;i++)
  {
    if (Ligne[1][i]== ',')
    {
      L++;
      c=0;
    }
    else if (Ligne[1][i]!='"')
    {
      Info[L][c]=Ligne[1][i];
      c++;
    }
  }
  
  for(int i=0; i<32;i++){Commande[i]=0;}
  for(int i=0; i<32;i++){Commande[i]=Info[0][i];}
  
  if(strcmp(Commande, "+CMGL: 1") == 0)
  { 
    for(int i=0;i<32;i++){Numero[i]=0;Date[i]=0;Heure[i]=0;}
    for(int i=0;i<64;i++){Message[i]=0;}

    for(int i=0;i<32;i++){Numero[i]= Info[2][i];Date[i]=Info[4][i];}
    for(int i=0;i<64;i++){Message[i]= Ligne[2][i];}
    for(int i=0;i<32 and Info[5][i]!='+';i++){Heure[i]=Info[5][i];}
  }
}

void Exe()
{
  switch(Etape)
  {
    case 0:
    //Serial.println("Attente");
    delay(500);
    break;

    case 1:
    if(strcmp(Commande, "+CMTI: SM") == 0){Serial.println("Message Recue");gsm.print("AT+CMGL= \"ALL\"\r");delay(100);}
    else {Serial.println("Erreur 1");Etape = 0;}
    break;

    case 2:
    if(strcmp(Commande, "+CMGL: 1") == 0)
    {
      Serial.print("Message =");Serial.println(Message);
      Serial.print("Numero =");Serial.println(Numero);
      Serial.print("Date =");Serial.println(Date);
      Serial.print("Heure =");Serial.println(Heure);
      delay(100);
    }
    else {Serial.println("Erreur Lecture MSG");}
    
    gsm.print("AT+CMGD=1\r");
    delay(100);
    break;

    case 3:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Message Supprimé OK");Etape = 4;}    
    else {Serial.println("Erreur Suppression MSG");Etape = 0;}
    delay(100);
    break;
    
    case 4:
    if(strcmp(Message, "LED:ON\r") == 0){Serial.println("Demande Allumage Led)"); Etape= 0;}
    else if(strcmp(Message, "LED:OFF\r") == 0){Serial.println("Demande Arret Led)"); Etape= 0;}
    else if(strcmp(Message, "Porte\r") == 0){Serial.println("Demande Ouverture Porte"); Etape= 410;}
    else {Serial.println("Aucune commande connue");Etape = 0;}
    delay(100);
    break;

    case 410:
    if(strcmp(Numero, "+336xxxxxxxx") == 0){Serial.println("Commande Autorise, telephone de Jeremy"); Etape= 411;}
    else {Serial.println("Utilisateur inconnue");Etape = 0;}
    delay(100);
    break;

    case 411:
    Serial.println("Porte Ouverte OK");
    Etape= 412;
    delay(100);
    break;

    case 412:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Sms Envoye");} else {Serial.println("Erreur envoie sms");}Etape = 0;
    Etape= 0;
    delay(100);
    break;

    case 100:
    Serial.println("Commande Manu");
    delay(100);
    break;

    case 101:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Commande Manu OK");Etape = 0;} else {Serial.println("Erreur");}Etape = 0;
    break;

    case 104:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Commande Manu OK");Etape = 0;} else {Serial.println("Erreur");}Etape = 0;
    break;
  }
}

void sendsms()
{    
    gsm.print("AT+CMGS=\"");
    gsm.print("+336xxxxxxxx");
    gsm.print("\"\r");
    delay(100);  
    gsm.print("Test \r");
    gsm.print(char(26));
    delay(100);
    gsm.println();
    }

Il n'y a aucune différence sur la partie réception du sms mais l'un fonctionne l'autre pas du tout.

ps: obligée de faire 2 post a cause du nombre limite de caractère.

Et quelle est la différence entre les deux codes ?

L'ajout de la fonction sendsms(), rien d'autre

void sendsms()
{    
    gsm.print("AT+CMGS=\"");
    gsm.print("+336xxxxxxxx");
    gsm.print("\"\r");
    delay(100);  
    gsm.print("Test \r");
    gsm.print(char(26));
    delay(100);
    gsm.println();
    }

Si je résume : lorsque l'appel de sensdsms (dans le setup) est commenté, le programme fonctionne correctement, lorsqu'il est décommenté, le programme plante à l'étape 1 ?

L'étape 1 c'est ça ?

    case 1:
    if(strcmp(Commande, "+CMTI: SM") == 0){Serial.println("Message Recue");gsm.print("AT+CMGL= \"ALL\"\r");delay(100);}
    else {Serial.println("Erreur 1");Etape = 0;}
    break;

Tu dis que la variable Commande n'est plus bonne. Je suppose que tu peux l'afficher sur la console : que vaut-elle quand elle est correcte et quand le code plante ? Est-ce que l'erreur est reproductible (même valeur de Commande à chaque fois) ?

Pour moi, ce n'est pas facile, car je n'ai aucune idée du contenu des variables (Commande, Ligne, somechar, somechar2, etc)

Quand je reçois un sms elle doit être = "+CMTI: SM" et quand sa plante elle est vide.

lesept:
Pour moi, ce n'est pas facile, car je n'ai aucune idée du contenu des variables (Commande, Ligne, somechar, somechar2, etc)

Je comprend, si tu veux plus d'info on peu lancer une session Team Viewer si sa peu aider.

Non pas possible ici.

Peux tu poster le contenu complet de la console dans un cas qui fonctionne plus dans un cas qui ne fonctionne pas. Ça me permettra de comprendre ce qui se passe un peu mieux qu'en lisant le code.

moi quand même quand je lis dans le même message "j'utilise String"et "ça plante au bout d'un moment', je m edis qu'il y a peut-être un dépassement de ram.

essayes de coller ça :

//from http://jeelabs.org/2011/05/22/atmega-memory-use/
int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

dans ton code et de faire de temps en temps serial.println(freeRam());

bricofoy:
moi quand même quand je dans le même message "j'utilise String"et "ça plante au bout d'un moment', je m edis qu'il y a peut-être un dépassement de ram.

essayes de coller ça :

//from http://jeelabs.org/2011/05/22/atmega-memory-use/

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}



dans ton code et de faire de temps en temps `serial.println(freeRam());`

Ça n'a pas fonctionné :confused:

J'ai remarqué que c’était la com "Serial" qui me faisait planter mon programme, sans comprendre pourquoi. Si vous avez des idées sur ce problème, ça m’intéresse. J'ai donc tout simplement supprimé la com "Serial" pour garder uniquement la Software serial du module GSM.

Je n'ai plus de remonté d'info sur mon ordi, mais pour mon projet final j'en est pas l’intérêt.

Voila mon code final:

#include <SoftwareSerial.h>

#define rxPin 7
#define txPin 8
#define Relais_1 4
#define Relais_2 5
#define Capteur 11
#define StartGSM 9

SoftwareSerial gsm(rxPin, txPin);

char Commande[32]= {0};
char Numero[32]= {0};
char Date[32]= {0};
char Message[64]= {0};
char Heure[32]= {0};
char Num[2][13] = {"+336xxxxxxxx","+336xxxxxxxx"};
char MSG[6][16] = {"Module ON","OK","Led Allume","Led Eteinte","Porte Ouverte","Porte Ferme"};

int Etape = 0;
int IndexMSG = 0;

boolean EtatPorte = false;
boolean LastEtatPorte = false;

void setup()
{
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 pinMode(Capteur, INPUT_PULLUP);
 pinMode(Relais_1, OUTPUT);
 pinMode(Relais_2, OUTPUT);
 digitalWrite(Relais_1, LOW);
 digitalWrite(Relais_2, LOW);
 pinMode(StartGSM, OUTPUT);
 digitalWrite(StartGSM, HIGH);
 delay(1000);
 digitalWrite(StartGSM, LOW);
 delay(10000);
 gsm.begin(9600);
 delay(500);
 gsm.print("AT+CMGF=1\r");
 delay(100);
 sendsms(Num[0],MSG[IndexMSG]);
}

void loop()
{
   EtatPorte = digitalRead(Capteur);
   
   Exe();
   
   if(gsm.available())
  {
    int i = 0;
    char someChar[257] = {0};
    while (gsm.available() > 0)
    {
      someChar[i] = gsm.read();
      if (i<256){i++;}
      delay(3);
      }
      Format(someChar,i);
      Etape++;
  }
}

void Format(char *MsgF,int T)
{
  int L=0;
  int c=0; 
  char Ligne[6][64] = {{0},{0}};
  char Info[7][32] = {{0},{0}};
    
  for(int i=0;i<=T;i++)
  {
    if (MsgF[i]== '\n')
    {
      L++;
      c=0;
    }
    else
    {
      Ligne[L][c]= MsgF[i];
      c++;
    }
  }
  
  L=0;
  c=0;

  for (int i=0;i<64;i++)
  {
    if (Ligne[1][i]== ',')
    {
      L++;
      c=0;
    }
    else if (Ligne[1][i]!='"')
    {
      Info[L][c]=Ligne[1][i];
      c++;
    }
  }
  
  for(int i=0; i<32;i++){Commande[i]=0;}
  for(int i=0; i<32;i++){Commande[i]=Info[0][i];}
  
  if(strcmp(Commande, "+CMGL: 1") == 0)
  { 
    for(int i=0;i<32;i++){Numero[i]=0;Date[i]=0;Heure[i]=0;}
    for(int i=0;i<64;i++){Message[i]=0;}

    for(int i=0;i<32;i++){Numero[i]= Info[2][i];Date[i]=Info[4][i];}
    for(int i=0;i<64;i++){Message[i]= Ligne[2][i];}
    for(int i=0;i<32 and Info[5][i]!='+';i++){Heure[i]=Info[5][i];}
  }
}

void Exe()
{
  switch(Etape)
  {
    case 0:
    if(EtatPorte == true and LastEtatPorte == false){sendsms(Num[0],MSG[4]);}
    if(EtatPorte == false and LastEtatPorte == true){sendsms(Num[0],MSG[5]);}
    LastEtatPorte = EtatPorte;
    delay(500);
    break;

    case 1:
    if(strcmp(Commande, "+CMTI: SM") == 0){gsm.print("AT+CMGL= \"ALL\"\r");delay(100);}
    else {Etape = 0;}
    break;

    case 2:
    gsm.print("AT+CMGD=1\r");
    delay(100);
    break;

    case 3:
    if(strcmp(Commande, "OK\r") == 0) {Etape = 4;}    
    else {Etape = 0;}
    delay(100);
    break;
    
    case 4:
    if(strcmp(Message, "LED:ON\r") == 0){digitalWrite(Relais_1, HIGH);IndexMSG = 2;Etape= 5;}
    else if(strcmp(Message, "LED:OFF\r") == 0){digitalWrite(Relais_1, LOW);IndexMSG = 3;Etape= 5;}
    else if(strcmp(Message, "Porte\r") == 0){IndexMSG = 1;Etape= 410;}
    else if(strcmp(Message, "Porte:Mot_de_passe\r") == 0){IndexMSG = 1;Etape= 411;}
    else if(strcmp(Message, "Info\r") == 0){if(EtatPorte == false){IndexMSG = 5;} else {IndexMSG = 4;}Etape= 5;}
    else {IndexMSG = -1;Etape = 5;}
    delay(100);
    break;

    case 5:
    if (IndexMSG == -1 ){sendsms(Numero, Message);} else {sendsms(Numero, MSG[IndexMSG]);}
    delay(100);
    Etape = 0;
    break;

    case 410:
    if(strcmp(Numero, Num[0]) == 0 or strcmp(Numero, Num[1]) == 0){Etape= 411;}
    else {Etape = 0;}
    delay(100);
    break;

    case 411:
    digitalWrite(Relais_2, HIGH);
    Etape= 412;
    delay(300);
    break;

    case 412:
    if(strcmp(Commande, "OK\r") == 0) {digitalWrite(Relais_2, LOW);Etape = 5;} else {Etape = 0;}    
    delay(100);
    break;
  }
}

void sendsms(char *SMSNUM,char *SMSTEXT)
{    
    gsm.print("AT+CMGS=\"");
    gsm.print(SMSNUM);
    gsm.print("\"\r");
    delay(100);
    gsm.print(SMSTEXT);
    gsm.print(char(26));
    delay(100);
    gsm.println();
    }

Encore merci pour tous ceux qui ont essayé de m'aider et plus particulièrement "lesept " qui a passé un bon moment sur le problème :slight_smile:

Jeremk:
Ça n'a pas fonctionné :confused:

?? pourtant je m'en sers souvent, j'ai jamais eu de soucis ??

bricofoy:
?? pourtant je m'en sers souvent, j'ai jamais eu de soucis ??

Bah là pour le coup ça m'a créé plus de problèmes qu'autre chose, mais merci quand même :wink:

bah ça ne fait qu'une soustraction, ça ne devrait pas poser de soucis...ça ne t'affichait pas de valeurs ?

Sans même appeler ta fonction mon programme c'est mis a exécuter en boucle ma fonction sendsms(), j'ai donc essayer de l'appeler plusieurs fois au tout début du programme (des le setup() ) mais pareil ma fonction sendsms() s'exécuté en boucle.

Sa ma bien value environ 50 reception de sms dans la minute :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :sweat_smile:

hu ! pourtant ça ne devrait avoir aucun rapport. Tu l'avais collée où ?

bricofoy:
hu ! pourtant ça ne devrait avoir aucun rapport. Tu l'avais collée où ?

C'est exactement ce type de problème que j'ai depuis le début, j'écrie puis d'un coup un truc qui n'a rien à voir et qui marchait très bien déconne complètement.

Sinon je l'avais collé complètement a la fin de mon code

Jeremk:
C'est exactement ce type de problème que j'ai depuis le début, j'écrie puis d'un coup un truc qui n'a rien à voir et qui marchait très bien déconne complètement.

Sinon je l'avais collé complètement a la fin de mon code

Oui mais justement, c'est exactement le symptôme qui fait penser à un dépassement de la ram disponible...

d'autant plus que :

J'ai remarqué que c'était la com "Serial" qui me faisait planter mon programme, sans comprendre pourquoi. Si vous avez des idées sur ce problème, ça m'intéresse. J'ai donc tout simplement supprimé la com "Serial" pour garder uniquement la Software serial du module GSM.

Or justement Serial utiilise des interruptions, et les soucis de ram sont souvent révélés lors de l'utilisation d'une interruption... De plus en n'utilisant plus Serial, tu économises aussi un peu de RAM

tu peut peut-être envoyer le résultat de freeRam() par SMS ? tu risques d'être surpris de la valeur... (en dessous de 50 ça commence à sentir le roussi...)

Là ça a fini par "tomber en marche", mais avec l'utilisation de Strings j'ai bien peur qu'au bout d'un moment, ça ne reparte en vrille aléatoirement