[partage]Transmetteur d'alarme téléphonique version 2.0

Bonjour,
Apres avoir cherché et encore cherché je n’ai pas ou peu trouvé de projet similaire
Du coup je me suis lancé et j’y suis arrivé malgré mes faibles voire inexistantes compétences dans ce domaine.

Voici donc mon projet fini de transmetteur d’alarme téléphonique.( fini bien que pouvant surement être améliorée. )

Matériel utilisé.
Un ARDUINO UNO
Un shield MP3 de chez SPARKFUN
Un shield GSM de chez TINYSINE

Le shield MP3 est couplé sur l'Arduino mais le shield GSM dois être séparé a cause d’incompatibilités des pins

De 1 à 5 entrée d’alarme possible.
Possibilité d’appeler plusieurs numéro de téléphone l’un après l’autre.( ici programmé a 4)

Une fois l’ arduino branché et le réseau gsm "accroché" le transmetteur est prêt à être utilisé

Shuntez une entrée et vous recevrez un appel avec un message vocal correspondant à l’entrée sélectionnée.

il ne vous restera plus qu'a créer les messages vocaux et les enregistrer sur la carte SD au format MP3.

Voici le code

/*
.................Sketch d'un transmetteur d'alarme.............................
4 commandes d'entrée déclenchent un appel téléphonique, 
lorsque la communication est établie on active le fichier mp3 correspondant
a l'entrée activée, puis un compteur est activé affin d'appeler 4 numéros différents a la suite  
dans ce sketch, toutes les pins de l'Arduino uno sont utilisée il ne reste qu'une entrée analog de libre  
qui peut être ajoutée comme entrée d'alarme supplémentairement,  comme sortie led ou alarme sonore. 
CRÉE PAR MATTH122

*/

#define DEBUG
#include <SoftwareSerial.h>
SoftwareSerial SIM900(5, 10);

///////////////////////// INTEGRATION SHIELD AUDIO///////////////
#include <SPI.h> //bus SPI
#include <SdFat.h> //SD card
#include <SdFatUtil.h> //SD card tools
#include <SFEMP3Shield.h> //shield library
SFEMP3Shield MP3player; //player
SdFat sd; //card

////////////////DECLARATION DES VARIABLES//////////////////

const int nbcall = 4 //METTRE LE NOMBRE DE NUMERO A APPELER 
const int volume = 40 // VOLUME DE LECTURE PLUS LE CHIFFRE EST HAUT MOINS LE SOND EST FORT

 const int Bouton1 = A0;  //plus de pin digital libre on utilise les analog
 const int Bouton2 = A1;   
 const int Bouton3 = A2;  
 const int Bouton4 = A3; 
  boolean etatBouton1 = 0;
  boolean etatBouton2 = 0;
  boolean etatBouton3 = 0;
  boolean etatBouton4 = 0;

int appel = 1; // le nombre sera incremente pour appeler les numeros suivant

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

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

//////////////////// ALLUMAGE SHIELD GSM ET ATTENTE CONNECTION AU RESEAU GSM ///////////////////
  SIM900power();
  while( (envoyer_Commande_AT("AT+CREG?", "+CREG: 5", 5000) || 
          envoyer_Commande_AT("AT+CREG?", "+CREG: 1,5", 5000) == 0 ); // ENVOIE DE LA COMMANDE AT TANT QUE 5 OU 1,5 N'EST PAS RECU
          Serial.println("FIN DU SETUP");
 }

////////////////////COMMANDE ALLUMAGE SHIELD GSM /////////////////////
void SIM900power()
{
 digitalWrite(A5, HIGH); 
 delay(1000);
 digitalWrite(A5, LOW);
}
///////////////LECTURE MP3 SUIVANT APPUIS BOUTON////////////////////
void PLAYMP3()
{
    if (etatBouton1 == 1)
  {
    MP3player.playTrack(1);
    Serial.println("track 1"); // LIGNE DE CONTROLE
    delay(9000); // ATTEND 9 SECONDES 
    SIM900.println("ATH");   // MET FIN A LA COMMUNICATON
    delay(500);
    Serial.println("communication terminee"); // LIGNE DE CONTROLE
    appel ++ ;  // INCREMENTE DE 1 LA VALEUR DE -APPEL- POUR PASSER AU NUMERO SUIVANT
    delay(500);
  }
    if (etatBouton2 == 1)
  {
    MP3player.playTrack(2);
    Serial.println("track 2"); 
    delay(9000);
    SIM900.println("ATH");   
    delay(9000);
    Serial.println("communication terminee"); 
    appel ++ ; 
  }
    if (etatBouton3 == 1)
  {
    MP3player.playTrack(1);
    Serial.println("track 3"); 
    delay(10000);
    SIM900.println("ATH");   
    delay(10000);
    Serial.println("communication terminee"); 
    appel ++;  
  }
    if (etatBouton4 == 1)
  {
    MP3player.playTrack(1);
    Serial.println("track 4");
    delay(10000);
    SIM900.println("ATH");
    delay(10000);
    Serial.println("communication terminee");
    appel ++ ;
  }
}


////////////////SAVOIR SI LE TELEPHONE A ETE DECROCHE ////////////////
void decroche()
{
   while(envoyer_Commande_AT("AT+CLCC?", "+CLCC: 1,0,0,0,0", 5000))== 0)
      Serial.println("appel en cours");
      delay(500);
   if (envoyer_Commande_AT("AT+CLCC?", "OK", 1000) == 1)
    {
      Serial.println(" telephone decroche");
      PLAYMP3();
    }
}


////////////////////// EFFECTUER LES APPEL + COMPTAGE//////////////////
void affiche(int valeur_recue)
{
     if(valeur_recue = 1)
    {
      Serial.println("valeur 1"); // LIGNE DE CONTROLE
      Serial.println("appel en cours");
      SIM900.println("ATD + +33XXXXXXXX;"); // REMPLACER LES X PAR LE NUMERO DE TELEPHONE DU DESTINATAIRE
      delay(2000);
      decroche();
        
    }
    if(valeur_recue = 2)
    {
       Serial.println("valeur 2");
       Serial.println("appel en cours");
       SIM900.println("ATD + +33XXXXXXXX;");
       
       delay(2000);
        decroche();
    }
    if(valeur_recue = 3)
    {
        Serial.println("valeur 3");
        Serial.println("appel en cours");
        SIM900.println("ATD + +33XXXXXXXXX;");
        delay(2000);
        decroche();
    }
    if(valeur_recue = 4)
    {
        Serial.println("valeur 4");
        Serial.println("appel en cours");
        SIM900.println("ATD + +33XXXXXXXXX;");
        delay(2000);
        decroche();
        appel = 1; // REINITIALISE APPEL A 1 
    }
}
 
//////////////////////fin /////////////////////////

void loop()

{
    etatBouton1 = digitalRead(Bouton1);
    etatBouton2 = digitalRead(Bouton2);
    etatBouton3 = digitalRead(Bouton3);
    etatBouton4 = digitalRead(Bouton4);
  if(etatBouton1 == 1 || etatBouton2 == 1  || etatBouton3 == 1 || etatBouton4 == 1)
     {
    Serial.println("BOUTON APPUYE"); //LIGNE DE CONTROLE
    affiche(appel);  // EFFECTUE LE PREMIER APPEL SELON LE COMPTEUR 
    }
}  
  

//////////////////////// MISE EN MEMOIRE 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); 

  // 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;

}

Voila si ce projet peut être utile à d'autre...

Bonjour,

Après m'avoir bien servi dans sa fonction de transmetteur GSM, sur le quel j'ai ajouté un récepteur 433Mhz avec un décodeur pour être utilisé avec des détecteurs d'ouverture de porte sans fil,

Mon montage passe maintenant à la version 2 et ce voit ajouté un écran lcd 16X2 et un clavier 4X4

Je souhaitais pouvoir entrer les numéros de téléphone via un clavier et faire la sélection de deux mode de fonctionnement:
soit effectuer un appel vocal soit envoyer un sms.

C'est maintenant chose faite puisque après de longues heures de recherche et de programmation mon transmetteur GSM fonctionne comme je le souhaite. j'aurais souhaité que l'on puisse stopper les appels grâce au dtmf mais mon shield GSM ne fait pas le décodage peut être dans une prochaine version

Le fonctionnement reste le même que la version 1, avec en plus
on entre via un menu le numéro de téléphone de la, ou des personnes à prévenir en cas d'alarme,
puis on choisi le mode d'appel soit appel vocal soit envoie de SMS
pour le moment le type de message SMS est unique je n'ai pas fait de sélection en fonction de l'entrée
contrairement au mode vocal ou chaque entrée diffusent un message vocal préenregistré différent.

Pour le matériel on garde le même sauf l'arduino uno qui deviens mega 2560

Le shield mp3 sparkfun nest pas compatible avec la mega le bus spi n’étant pas au même endroit que sur la uno. Faite le câblage en conséquence.

Attention cependant les numéros ne sont pas enregistré dans l'eeprom donc en cas de coupure électrique tout s'efface.

Edit:
ça fait longtemps que je suis pas revenu ici
je me suis en peut remis su le programme et voila

j'ajoute de la version 2.1

pas de nouveauté un simple remaniement du menu ..

note-1 : l'affichage correspond a mon clavier qui possède des flèches, haut, bas et droite, gauche.
adaptez le programme en fonction de vos besoin
note-2: j'ai désactivé l’initialisation de la carte mp3 et la demande de connections gsm pour pouvoir utiliser le programme avec seulement le clavier et l'afficheur lcd .

Si mon programme vous a été utile et si vous l'avez modifié peut être pourriez vous le partager ici. Merci

transmetteur_GSM_V2.ino (24.4 KB)

transmetteur_GSM_V2.1.ino (28.2 KB)

Bonjour,
je trouve votre projet excellent et je pense que je vais le réaliser pour permettre un report en cas d'alarme intrusion. Il ne me reste plus qu'à trouver un moyen de l'alimenter à partir d'une alimentation secourue et ça devrait rouler.
L'idée de rajouter un clavier pour permettre à l'utilisateur de modifier les numéro ou autre est pas mal quel type d'écran et de clavier avez-vous choisi ? Un écran tactile pourrait être une idée intéressante mais il faut voir le coût et la conso.

J'ai utilise un simple écran lcd 16 x2
Quand au clavier j'en ai récupéré un sur une ancienne centrale de contrôle d'accès mais un simple clavier 16 touches peut faire l'affaire c'est programmé en tant que tel.
Pour mettre un écran tactile ça doit être faisable mais je me suis pas penche dessus, par contre il faut refaire tout le code sur la partie ecran\clavier.

Bonsoir,
j'ai 2 questions
Est-Ce possible d'utiliser un autre shield que celui de Spatkfun pour la lecture MP3 ?

j'ai un Shield qui prend en charge le DTMF, si j'ai bien compris, peut-on si on le souhaite, interagir avec l'arduino dans le but d'interrompre les appels ou encore de faire une mise en/hors service (par exemple)?

Oui c'est possible de mettre un autre shield que sparkfun, il faudra enlever dans le code tout ce qui le concerne et le remplacer par les codes du nouveau shield.
Dans mon projet j'avais l'intention de faire le decodage dtmf pour interrompre les appels lors de la réception. Si je suis le premier a recevoir un appel et que je peux intervenir pas besoin au transmetteur d 'appeller les autres numéros. Mais mon shield n'étant pas compatible avec le décodage j'ai laisse tombé. Pour le décodage il faut que le transmetteur appel on lui envoie l'information en appuyant sur une touche et on programme la réception pour une action voulu (ici on veux interrompre l'appel) pour mettre en\hors service il faut appelez le transmetteur c'est, je pense faisable, mais j'en vois pas l'intérêt
Il y a toujours la possibilité d'agir avec le transmetteur en lui envoyant des sms et il réagira en fonction du texte envoyé.

Et comment avez-vous fais pourl'alimentation? (Surtout en cas de coupure )
J'ai pensé à prendre une alimentation 12v secourue avec un régulateur mais je me demande s'il n'y a pas plus simple.

Pour l'alimentation pour le moment j'ai encore rien fait a l'heure actuel je tourne toujours sur la version 1, j'ai juste mis un simple bloc alime 9v ( je men sert pour le boulot pour surveiller une porte)
La version 2 est en stand by pour le moment j'ai plus trop de temps (j'attends les vacances),
Je compte pour l'alimenter mettre une petite alime secourue sur batterie avec sortie régulée 5v pour tout alimenter .

Bonjour,
J'attends de recevoir le matériel et je vous dirai quand j'aurai tout mis en fonction. Par contre la version 1 du code comporte quelques erreurs de parenthèses/point-virgule (sans doute des copier/coller).

Oui je sais pour les erreurs j'ai pas trop eu le temps de corriger, du coup , ca fait un peut réfléchir contrairement à un programme "clé en main" ... :wink:

Bonjour,
Je me pose des questions depuis un petit moment mais je ne trouve pas de réponse très convaincante :

  • quelle est la différence entre le mode PDU et texte pour les SMS ? a quoi les différencie-t-on ? je sais qu'un est en ASCII et que l'autre est vieux...

Ensuite peut-on utiliser les mode appel et SMS en même temps avec le SIM900 ?
(les appels pour prévenir d'une alarme, les SMS pour envoyer un ordre au module).

Merci par avance.

Je n'ai aucune idée de ce qu'es le mode PDU, je ne vais pas pouvoir t'aider la dessus.
Quand tu dis "mode appel et sms en même temps" veux tu entendre par la que pendant que le module appel et, est donc en communication, tu lui envoie un sms ?
Si c'est le cas j'ignore si le sim900 peut le gérer mais l'arduino j'en doute, (a confirmer par un expert de la chose en tout cas ....)

je me suis mal exprimé, en faite ce que je veux c'est envoyer un SMS pour donner des ordres à l'arduino, c'est le seul cas ou je veux utiliser les SMS. Les appels ne me serviront que pour signaler une alarme et l'acquitter. Après si j'ai posé la question pour les modes "texte" et "PDU" c'est parce que j'ai vu qu'on peut passer le SIM900 en mode texte pour facilité l'utilisation des SMS.

Edit : Une petite chose (encore...) pourquoi avoir mis "SoftwareSerial SIM900(5, 10);" qui définie l'utilisation du port 5 et 10 (si j'ai bien compris) alors que par défaut, des ports sont déjà prédéfini ?
Pour ma part j'utilise ce shield (http://sandboxelectronics.com/?product=dtmf-enabled-sim900-gprsgsm-shield) est-ce-que j'ai possibilité de forcé l'allumage du shield (sans passer par le bouton power tout en gardant le fonctionnement des leds ? j'ai vu que pour allumer il faut mettre D8 sur "on" mais je me demande s'il n'y a pas de commande prédéfinie.
Merci pour ton aide.

bonsoir,

Envoyer un sms et faire réagir l'arduino en fonction du texte reçu, il existe plein de tuto qui expliquent comment faire ça devrais pas être trop compliqué.

j'ai mis les ports 5 et 10 (sur la version 1) car c'etait les deux dernier port de disponibles le shield mp3 étant gourmand en ports ,
j'aurais pus attribuer les 0 et 1 mais je voulais garder la main sur la connexion USB, c'est a toi de choisir en fonction des ports de disponible.
pour allumer ton shield tu peux utiliser la broche D8 (le shield mp3 de sparkfun utilise la Broche 8 donc faut en prendre une autre sur l'arduino) il faut la mettre sur on quelque secondes et la remettre sur off

ceci le fait dans mon programme

void SIM900power()
{
digitalWrite(A5, HIGH); // ici la sortie A5 active le shield gsm
delay(1000);
digitalWrite(A5, LOW);
}

chez moi par contre si le shield est déjà allumé et qu'on fait un reset par exemple ça l’éteins il faudrait mettre une condition d’exécution du void SIM900power que si le shield est éteins

pour ce qui est de ton shield gsm il est marqué qu'il fait DTMF mais ils ne disent pas que c'est en réception (ou alors j'ai mal compris) en tout cas s'il décode le dtmf il m’intéresse

de rien pour l'aide n'hésite pas si tu a besoin d'une explication sur le programme ou autre .

Merci pour ta réponse, je vais tester le DTMF et je te dirai. Pour le moment je n'ai rien reçu j'attends...

Est-ce que c'est possible ou risqué de superposer les 2 shields sur l'arduino ?

Si tu veux mettre les deux shield (mp3 et gsm ) sur l'arduino il n'y a aucun risque, mais ça risque de pas fonctionner car ils utilisent les même pin pour des fonctions différentes.
Vérifie dans les datasheets les broches utilisee par le shield mp3 et celle du gsm
Il me semble que tu peux si tu utilise en rx et tx les broches 0 et 1 mais le gsm ayant besoin de la broche 8 pour être allumé (broche utilisée par le shield mp3) tu peux couper la broche du gsm et tu soude un fil pour le mettre ailleur, et tu devra retirer le shield gsm a chaque fois que tu branche l'arduino sur le pc (les pins 0 et 1 servant a la communication usb )

ok merci, il vaut mieux que je sépare un des shield alors.

Bonjour , est il possible de nous envoyer les connexions des deux shields avec l'arduino?
mercii

amel01:
Bonjour , est il possible de nous envoyer les connexions des deux shields avec l'arduino?
mercii

Ça dépend de quel version du programme, ce n'est pas le même arduino ... Et les branchement
ne sont pas les mêmes

En lisant le fil de la discutions et en regardant le programme tu dravrais trouver facilement les branchements pour faire fonctionner le tout.

Après si tu as des soucis expose ton problème et j'essayerais de t'aider