Go Down

Topic: [partage]Transmetteur d'alarme téléphonique version 2.0 (Read 851 times) previous topic - next topic

matth122

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


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 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...
 

matth122

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.




moacc95

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.

matth122

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.

moacc95

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)?

matth122

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

moacc95

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.

matth122

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 .

moacc95

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).

matth122

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"  ... ;-)

Go Up