[resolu] problème sur projet transmetteur.

Bonjour,

j’ai un projet sur lequel je travail depuis un moment et qui me pose problème,

Mon projet est un transmetteur gsm avec message vocal (du type mp3) diffusé au moment du décrochage du téléphone et commandé par un contact sec, chaque contact active un message différent.

ça fonctionne mais

  1. le setup et exécuté plusieurs fois comme si l’arduino se resetait tout seul apres avoir raccroché.
  2. “l’ecoute” du decroché du telephone fonctionne mais pas tout le temps.
  3. il arrive que le programme se bloque et je ne peux plus rien faire d’autre qu’un reset .

voici le sketch

#define DEBUG
#include <SoftwareSerial.h>

///////////////////////// integration biblioteque carte audio///////////////
#include <SPI.h> //bus SPI
#include <SdFat.h> //SD card
#include <SdFatUtil.h> //SD card tools
#include <SFEMP3Shield.h> //shield library

SoftwareSerial SIM900(2, 3);

SFEMP3Shield MP3player; //player
SdFat sd; //card
const int nbTracks = 2; //METTRE LE NOMBRE DE FICHIER INCLU DANS LA SDCARD
const int volume = 60;// VOLUME DE LECTURE 

////////////////declaration des variables //////////////

const int Bouton1 = 5;
boolean etatBouton1 = 0; // valeur de l'état bouton
const int Bouton2 = 12;
boolean etatBouton2 = 0;


//int Bouton3 = 11;
//int Bouton4 = 10;

void setup() {
  Serial.begin(19200);
  delay(300);
  SIM900.begin(19200);
  delay(300);
    Serial.println("DEBUTS DU SETUP");

  pinMode(Bouton1, INPUT);
  pinMode(Bouton2, INPUT);
  //  pinMode(Bouton3, INPUT);
  //  pinMode(Bouton4, INPUT);

  ///////////////SETUP PLAYER/////////////
  sd.begin(SD_SEL, SPI_HALF_SPEED); //start card
  MP3player.begin(); //start player
  MP3player.setVolume(volume, volume);

  ///////////////ALLUMAGE DU MODULE GSM//////////////////
  //SIM900power();
    Serial.println("FIN DU SETUP");
 }
/*
////////////////////COMMANDE ALLUMAGE SHIELD GSM /////////////////////
void SIM900power() // desactivé pour le moment 
{
 digitalWrite(8, HIGH); //attention pin 8 correspond au reset du shield mp3
 delay(1000);
 digitalWrite(8, LOW);
}
*/
void PLAYMP3()
{
    if (etatBouton1 == 1)
  {
    MP3player.playTrack(1);
    Serial.println("track 1 is playing"); // LIGNE DE CONTROLE
    delay(10000);
    SIM900.println("ATH");   // raccroche
    Serial.println("communication terminee"); // LIGNE DE CONTROLE
  }
   else if (etatBouton2 == 1)
  {
    MP3player.playTrack(2);
    Serial.println("track 2 is playing");
    delay(10000);
    SIM900.println("ATH");
    Serial.println("communication terminee");
  }
 /*
  else if (etatBouton3 == 1)
  {
    MP3player.playTrack(3);
    Serial.println("track 3 is playing");
    delay(10000);
    SIM900.println("ATH");
    Serial.println("communication terminee");
  }

  else if (etatBouton4 == 1)
  {
    MP3player.playTrack(4);
    Serial.println("track 4 is playing");
    delay(10000);
    SIM900.println("ATH");
    Serial.println("communication terminee");
  }

  
  */
  }

////////////////////   savoir si le tel est decrcoche /////////////

void decroche()
{

  if (connexion_Reseau(25000))
  {
    Serial.println("Telephone decroche : OK !");
    PLAYMP3();
  }
  else
  {
    Serial.println("Telephone pas decroche : ERREUR !");
     SIM900.println("ATH"); // racroche
  }
}
//////////////////lancer lappel ////////////////
void callsomeone()
{
  Serial.println("appel en cours");
  SIM900.println("ATD + +33XXXXXXXX;");
  delay(2000);
  decroche();
}

////////////////fin /////////////////


void loop()

{
  etatBouton1 = digitalRead(Bouton1);
  etatBouton2 = digitalRead(Bouton2);
  // etatBouton3 = digitalRead(Bouton3);
  // etatBouton4 = digitalRead(Bouton4);
  if((etatBouton1 == 1)  || (etatBouton2 == 1 )) // || etatBouton3 == 1 || etatBouton4 == 1) // ligne definitive
     {
    Serial.println("BOUTON APPUYE"); //ligne de test
    callsomeone();
     }
}

/////////////////////////// ÉTAT DE CONNECTION DU TELEPHONE/////////////////////////////////////
uint8_t connexion_Reseau(unsigned int timeout)
{
  uint8_t  answer = 0;
  unsigned long previous;
  previous = millis();

  while ((answer == 0) && ((millis() - previous) < timeout))
  {
    if ((envoyer_Commande_AT("AT+CLCC?", "+CLCC: 1,0,0,0,0", 500)) == 1 )
    {
      answer = 1;
    }
  }

  return answer;
}

// ENVOYER UNE COMMANDE AT
uint8_t envoyer_Commande_AT(char* commande_AT, char* reponse_Esperee, unsigned int timeout)
{

  uint8_t x = 0,  answer = 0;
  char reponse[100];
  unsigned long previous;

  // Initialisation de la chaine de caractère (string).
  memset(reponse, '\0', 100);

  delay(100);

  // Initialisation du tampon d'entrée (input buffer).
  while ( SIM900.available() > 0)
  {
    SIM900.read();
  }
  // Envoi de la commande AT.
  // SIM900.println(commande_AT); ligne retiré marche sans

  // Réponse du SIM900.
  // Cette boucle vérifie s'il y a des données disponibles dans le tampon.
  // Ces données sont comparées avec la réponse attendue.

  x = 0;
  previous = millis();

  do
  {
    if (SIM900.available() != 0)
    {
      reponse[x] = SIM900.read();
      x++;
      // Comparaison des données
      if (strstr(reponse, reponse_Esperee) != NULL)
      {
        answer = 1;
      }
    }
  } while ((answer == 0) && ((millis() - previous) < timeout));
  
   #ifdef DEBUG
    Serial.println(reponse);
    #endif
  return answer;

}

et voici le moniteur serie

DEBUTS DU SETUP
FIN DU SETUP
BOUTON APPUYE
appel en cours

+CLCC: 1,0,3,0,0,"++33XXXXXXXXX",145,""


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

+CLCC: 1,0,0,0,0
Telephone decroche : OK !
track 1 is playing
communication terminee

DEBUTS DU SETUP           <------- le setup recommence ici 
FIN DU SETUP

materiel utilisé :
arduino uno
shield mp3 sparkfun
shield gsm tinysine

le shield gsm est deporté, seul le shield mp3 est pluggé sur l’arduino pour cause d’incompatibilités des pin entre le gsm et le mp3.

Je vois pas comment ça peut marcher, dans ta fonction pour envoyer les commande AT elle n'est justement pas envoyée ...

tu parle de cette ligne la ?

// Envoi de la commande AT.
// SIM900.println(commande_AT); ligne retiré marche sans

je l’ai essayé avec et sans, et ça fonctionne je pense que le module SIM900 gère de lui même l’envoie de la commande at ou du moins la réception

si je code ça

#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’ai ça en retours sans avoir rien demandé

+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

matth122:
tu parle de cette ligne la ?

// Envoi de la commande AT.
// SIM900.println(commande_AT); ligne retiré marche sans

je l’ai essayé avec et sans, et ça fonctionne je pense que le module SIM900 gère de lui même l’envoie de la commande at ou du moins la réception

Y’a un souci alors : impossible que cette fonction fonctionne, l’ordre ne part tout simplement pas. Y’a pas de magie, si tu te mets pas au volant de la voiture elle est pas prête d’avancer …

Et pourtant ça fonctionne !! Comme je lais dis plus haut le module gsm dois gèrer lui même l’envoie de la commande

Sinon J’ai remis la ligne et fait des essais (beaucoup d’essais ) ça semble plus stable au niveau détection mais c’est pas encore parfait, du coup je vais la laisser
Étant débutant en programmation Il est possible aussi que la fonction soit pas programmée au top, n’ayant pas vraiment compris comment la faire j’ai pioché, ici et la, et adapté à mes besoins

j'ai remanié une partie du programme et ça fonctionne assez bien hormis se problème d'auto-reset.

en fait si je retire la carte MP3 le programme se déroule exactement comme il se doit ,
mais des que j'utilise le shield MP3 j'ai des auto-reset aléatoire

voici le shield utilisé.

https://learn.sparkfun.com/tutorials/mp3-player-shield-hookup

une idée de quoi ça pourrais venir ?