[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é 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é 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


code: [select]

/*
.................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 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 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 @ 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 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 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 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 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.





Arduino Forum > International > Français > Réalisations et Projets Finis (Moderators: jfs, Snootlab) > [partage]Transmetteur d'alarme téléphonique version 2.0


arduino

Comments