Géolocalisation par Arduino : module Sim900 et shield GPS
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Géolocalisation par Arduino : module Sim900 et shield GPS



  1. #1
    matmats

    Géolocalisation par Arduino : module Sim900 et shield GPS


    ------

    Bonjour,
    J'ai comme projet de faire fonctionner un programme avec un module sim900 ainsi qu'un module GPS.
    Le principe est simple : il suffit de localiser un emplacement à l'aide du module GPS et par la suite envoyer les données de localisation par SMS.

    J'ai donc commandé un Shield GPS : http://www.designersystems.co.uk/GPM.S_info.htm
    Et un module GSM : https://www.itead.cc/sim900-sim900a-...em-module.html
    J'ai aussi acheté une carte SIM à 2 € chez Free.


    Je me suis donc lancé, j'ai fait quelques soudures et tout branché : RX/TX, TX/RX pour le module GSM.j'ai donc attaqué les programmes.
    Voici mon programme qui fonctionne à merveille pour le GPS :

    Code:
    /*====================================================
    Systeme DS-GPM Shield Arduino 
    Utilisé avec une carte Arduino UNO
    
    ------------------------------------------------------
    cablage :
    L'interface DS-GPM.S transmet les données via le bus I2C 
    (Broche ANALOG 4 [SDA] & Broche ANALOG 5 [SCL]) 
    Le terminal série est paramétré à 9600 baud
     
    ====================================================== */
    
    #include <Wire.h>
    
    #define GPM 0x68  	                              // GPM I2C Address
    
    byte Address;                                         // variable
    byte Data;                                            // variable
    
    byte Data_10, Data_9, Data_8, Data_7, Data_6, Data_5, Data_4, Data_3, Data_2, Data_1;
    int Latitude_1, Longitude_1;
    long Latitude_2, Longitude_2;
    float Latitude_C, Longitude_C; 
    
    
    void setup()
    {
    
      Wire.begin();                                       // Start I2C comms
      Serial.begin(9600);                                 // serial port: 9600 baud
    
    
    
    
    
                        delay(6000);                                        // attendre 6 sec
    
    }
    
    void loop()
    {
      Serial.println(" ");
      Serial.print("Date : ");
      Get_Date();
    
      Serial.print("Heure : ");
      Get_Heure();
    
      delay(500);                                        // attendre
    
      Serial.print("Satellites en vue : ");
      Get_Satellites_vus();
    
     
    
      Serial.print("Vitesse : ");
      Get_Vitesse();
    
      Serial.println(" ");
      delay(500);                                        // attendre
    
      
      Serial.print("Latitude calcul : ");
      GetLatitude_Calcul();
      Serial.println(Latitude_C,6);
    
    
    
      Serial.println(" ");
      
    
      
      Serial.print("Longitude calcul : "); 
      GetLongitude_Calcul();
      Serial.println(Longitude_C,6);
     
    
    
    
    
     delay(5000);                                     // attendre
      Serial.println(" ");
        Serial.println(" ");
          Serial.println(" ");
            Serial.println(" ");
    }
    
    
    /*---------------------------------------------------------
     Sous programme 'GetDouble'
     ------------------------------------------------------------ */
    int GetDouble()
    {				      // Get double register value from GPM
      int Value = 0; 
      byte H_Byte = 0;
      byte L_Byte = 0;
    
      Wire.beginTransmission(GPM);
      Wire.write(Address);				      // Send register start address
      Wire.endTransmission();
    
      Wire.requestFrom(GPM, 2);			      // Request double register
      while(Wire.available() < 2);			      // Wait for double byte
      H_Byte = Wire.read();                            // Store one
      L_Byte = Wire.read();                            // Store two
    
      Value = (H_Byte * 10) + L_Byte;                     // Adjust for one byte
    
        return(Value);	                          
    }
    
    /*---------------------------------------------------------
     Sous programme 'GetSingle'
     ------------------------------------------------------------ */
    int GetSingle()
    {				      // Get single register value from GPM
      int Value = 0; 
    
      Wire.beginTransmission(GPM);
      Wire.write(Address);				      // Send register start address
      Wire.endTransmission();
    
      Wire.requestFrom(GPM, 1);			      // Request register
      while(Wire.available() < 1);			      // Wait for single byte
      Value = Wire.read();                             // and store
    
      return(Value);	                          
    }
    
    
    /*---------------------------------------------------------
     Sous programme 'Get_Date'
     ------------------------------------------------------------ */
    byte Get_Date()
    {
      Address = 6;                                        // Adresse Registre JOUR
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Serial.print("/");
      Address = 8;                                        // Adresse Registre MOIS
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Serial.print("/");
      Address = 10;                                       // Adresse Registre ANNEE (Milliers et Centaines)
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Address = 12;                                       // Adresse Registre ANNEE (Dizaines et Unités)
      Data = GetDouble();                                 // Read registers from GPM
      Serial.println(Data, DEC);                          // Affichage sur terminal série PC
    } 
    
    /*---------------------------------------------------------
     Sous programme 'Get_Heure'
     ------------------------------------------------------------ */
    byte Get_Heure()
    {
      Address = 0;                                        // Adresse Registre Heures
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Serial.print(":");
      Address = 2;                                        // Adresse Registre Minutes
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Serial.print(":");
      Address = 4;                                        // Adresse Registre Secondes
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.println(Data, DEC);                          // Affichage sur terminal série PC
    }
    
    /*---------------------------------------------------------
     Sous programme 'Get_Satellites_vus'
     ------------------------------------------------------------ */
    byte Get_Satellites_vus()
    {
      Address = 35;           //58 version1 / 35 Version2 // Adresse de Pointage satellites en vue
      Data = GetSingle();                                 // Lecture du registre depuis GPM
      Serial.println(Data, DEC);                          // Affichage sur terminal série PC
    }
    
    
    /*---------------------------------------------------------
     Sous programme 'Get_Vitesse'
     ------------------------------------------------------------ */
    int Get_Vitesse()
    {
      Address = 52;                                       // Point to Speed 1 register
      Data = GetDouble();                                 // Read registers from GPM
      Serial.print(Data, DEC);                            // and print to PC
      Address = 54;                                       // Point to Speed 2 register
      Data = GetSingle();                                 // Read registers from GPM
      Serial.print(Data, DEC);                            // and print to PC
      Serial.print(".");
      Address = 55;                                       // Point to Speed 3 register
      Data = GetSingle();                                 // Read registers from GPM
      Serial.println(Data, DEC);                          // and print to PC
    }
    
    
    /*---------------------------------------------------------
     Sous programme 'GetLatitude_Calcul'
     ------------------------------------------------------------ */
    double GetLatitude_Calcul()
    {
      Address = 14;                                       // Registre Latitude Dizaines de degrés
      Data_8 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 15;                                       // Registre Latitude Dizaines de degrés
      Data_7 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 16;                                       // Registre Latitude Dizaines de minutes
      Data_6 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 17;                                       // Registre Latitude Unités de minutes
      Data_5 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 18;                                       // Registre Latitude dixièmes de minutes
      Data_4 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 19;                                       // Registre Latitude centièmes de minutes
      Data_3 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 20;                                       // Registre Latitude millièmes de minutes
      Data_2 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 21;                                       // Registre Latitude dix-millièmes de minutes
      Data_1 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
    
      Latitude_1=(Data_8*10+Data_7);  
      Latitude_2=(Data_6*1E5+Data_5*1E4+Data_4*1E3+Data_3*1E2+Data_2*1E1+Data_1);
      Latitude_2=(Latitude_2/60);
        Latitude_C = (Latitude_1+(Latitude_2*1E-4));        // Calcu complet latitude
      return (Latitude_C);
    }
    
    
    
    /*---------------------------------------------------------
     Sous programme 'GetLongitude_Calcul'
     ------------------------------------------------------------ */
    double GetLongitude_Calcul()
    {
      Address = 23;                                       // Registre Longitude Centaines de degrés
      Data_9 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 24;                                       // Registre Longitude Dizaines de degrés
      Data_8 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 25;                                       // Registre Longitude Unités de degrés
      Data_7 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 26;                                       // Registre Longitude Dizaines de minutes
      Data_6 = GetSingle();                               /// Lire le registre du GPM (1 octet)
    
      Address = 27;                                       // Registre Longitude Unités de minutes
      Data_5 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 28;                                       // Registre Longitude dixièmes de minutes
      Data_4 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 29;                                       // Registre Longitude centièmes de minutes
      Data_3 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 30;                                       // Registre Longitude millièmes de minutes
      Data_2 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 31;                                       // Registre Longitude dix-millièmes de minutes
      Data_1 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Longitude_1=(Data_9*1E2+Data_8*10+Data_7);  
      Longitude_2=(Data_6*1E5+Data_5*1E4+Data_4*1E3+Data_3*1E2+Data_2*1E1+Data_1);
      Longitude_2=(Longitude_2/60);
    
        Longitude_C = (Longitude_1+(Longitude_2*1E-4));      // Calcu complet longitude
      return (Longitude_C);
    }
    Ce programme me donne les coordonnées GPS la date etc… :
    Nom : arduino GPS.png
Affichages : 763
Taille : 11,0 Ko
    Pour le programme du module GPS sim900 c'est plus compliqué.
    j'ai recherché plusieurs programmes sur Internet mais beaucoup ne fonctionnait pas jusqu'à ce que je tombe sur ce tuto : http://www.upsilonaudio.com/sim900-e...carte-arduino/
    Le programme marche à merveille j'arrive à envoyer des SMS cependant je le trouve très compliqué j'en ai donc cherché un plus simple mais tout ce que j'ai trouvé ne marche pas.

    Maintenant mon but est de « fusionner » les deux programmes : ce que j'ai essayé de faire mais sans succès. Je ne sais pas comment m'y prendre sachant que je n'ai jamais essayer de fusionner de programmes.
    Voici comment j'ai essayé de faire (tout bêtement) :

    (voir le code a la page suivante)

    Si quelqu'un peut me venir en aide pour « fusionner » les programmes ce serait super car je suis dans une impasse… de plus fusionner ces programmes n'est que le début après il faut que je trouve un moyen pour pouvoir copier / coller les réponses de mon GPS dans le texte de message…

    Mon deuxième but est de le compléter en ajoutant une fonction qui est de définir une zone où le module sera (avec les dixaines centaines et millièmes de degrés), lorsque le module sors de cette zone la carte Arduino envoie un SMS au téléphone puis lorsque j'enverrai un SMS du type "localisationposition" depuis mon téléphone j'aimerais que la carte Arduino me renvoie la localisation du module. ( ce qui me semble assez compliqué , je ne sais pas si je vais arriver au bout..)

    En attendant impatiemment vos réponses !

    Mat

    -----

  2. #2
    matmats

    Re : Géolocalisation par Arduino : module Sim900 et shield GPS

    Code:
    // VAR GPS
    #include <Wire.h>
    #define GPM 0x68                                  // GPM I2C Address
    byte Address;                                         // Global variable
    byte Data;                                            // Global variable
    byte Data_10, Data_9, Data_8, Data_7, Data_6, Data_5, Data_4, Data_3, Data_2, Data_1;
    int Latitude_1, Longitude_1;
    long Latitude_2, Longitude_2;
    float Latitude_C, Longitude_C; 
    
    //VAR SMS
    int8_t answer;
    int onModulePin= 2; // port DTR (ou PWR) du module SIM900.
    char aux_string[30];
    char phone_number[]="+3365**********"; //numéro tel
    
    
    void setup()
    {
    
    // -*-*-*-*-*-*-*-*-*-*-*-*  SETUP PARTIE SMS  -*-*-*-*-*-*-*-*-*-*-*-
    {
        pinMode(onModulePin, OUTPUT);
        Serial.begin(115200);
        Serial.begin(115200);    
        Serial.println("");
        Serial.println("***localisation GPS+GSM***");
        Serial.println("");
        Serial.println("Initialisation ...");
        
        
       power_on(); // Cette commande active la carte SIM.
        delay(5000);
    
        
        Serial.println("Attente allumage du module....");
    
            while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) ||                     //Attente allumage du module
                   sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 );               //Attente allumage du module
    
        Serial.println("activation mode SMS ...");  // Activation du mode texte pour les SMS.
        sendATcommand("AT+CMGF=1", "OK", 1000);
        sendATcommand("AT+CSMP=17,167,0,240", "OK", 1000); // Flaash SMS
        Serial.println("Envoi du SMS...");
        
        sprintf(aux_string,"AT+CMGS=\"%s\"", phone_number);  // Envoi du numéro de téléphone au module GSM.
        answer = sendATcommand(aux_string, ">", 2000);
        if (answer == 1)
        
        {
            Serial.println("bonjour!!!!"); // message a envoyer
            Serial.write(0x1A);
            answer = sendATcommand("", "OK", 20000);
            if (answer == 1)
            {
                Serial.println("Message envoye !");    
            }
            else
            {
                Serial.print("Erreur envoi SMS !");
            }
        }
        else
        {
           // Serial.print("Erreur !");
           // Serial.println(answer, DEC);
        }
    
    }
    
    // -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*  SETUP PARTIE GPS  -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    {
    
      Wire.begin();                                       // Start I2C comms
      Serial.begin(9600);                                 // Start PC serial port @ 9600 baud
      delay(6000);                                        // Wait 3 seconds for DS-GPM.S to initialise
    
    }
    }
    
    
    
    //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    
    
    void loop()
    {
      // *-*-*-*-*-*-*-*-*-*-*-*-*  LOOP PARTIE GPS  -*-*-*-*-*-*-*-*-*-*-*-*-
      {
      Serial.println(" ");
      Serial.print("Date : ");
      Get_Date();
    
      Serial.print("Heure : ");
      Get_Heure();
    
      delay(500);                                        // wait
    
      Serial.print("Satellites en vue : ");
      Get_Satellites_vus();
    
     
    
      Serial.print("Vitesse : ");
      Get_Vitesse();
    
      Serial.println(" ");
      delay(500);                                        // Wait
    
      
      Serial.print("Latitude calcul : ");
      GetLatitude_Calcul();
      Serial.println(Latitude_C,6);
    
    
    
      Serial.println(" ");
      
    
      
      Serial.print("Longitude calcul : "); 
      GetLongitude_Calcul();
      Serial.println(Longitude_C,6);
     
    
    
    
    
     delay(5000);
      Serial.println(" ");
        Serial.println(" ");
          Serial.println(" ");
            Serial.println(" ");
    }
    
    
    /*---------------------------------------------------------
     Sous programme 'GetDouble'
     ------------------------------------------------------------ */
    int GetDouble()
    {              // Get double register value from GPM
      int Value = 0; 
      byte H_Byte = 0;
      byte L_Byte = 0;
    
      Wire.beginTransmission(GPM);
      Wire.write(Address);              // Send register start address
      Wire.endTransmission();
    
      Wire.requestFrom(GPM, 2);           // Request double register
      while(Wire.available() < 2);            // Wait for double byte
      H_Byte = Wire.read();                            // Store one
      L_Byte = Wire.read();                            // Store two
    
      Value = (H_Byte * 10) + L_Byte;                     // Adjust for one byte
    
        return(Value);                            
    }
    
    /*---------------------------------------------------------
     Sous programme 'GetSingle'
     ------------------------------------------------------------ */
    int GetSingle()
    {             // Get single register value from GPM
      int Value = 0; 
    
      Wire.beginTransmission(GPM);
      Wire.write(Address);              // Send register start address
      Wire.endTransmission();
    
      Wire.requestFrom(GPM, 1);           // Request register
      while(Wire.available() < 1);            // Wait for single byte
      Value = Wire.read();                             // and store
    
      return(Value);                            
    }
    
    
    /*---------------------------------------------------------
     Sous programme 'Get_Date'
     ------------------------------------------------------------ */
    byte Get_Date()
    {
      Address = 6;                                        // Adresse Registre JOUR
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Serial.print("/");
      Address = 8;                                        // Adresse Registre MOIS
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Serial.print("/");
      Address = 10;                                       // Adresse Registre ANNEE (Milliers et Centaines)
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Address = 12;                                       // Adresse Registre ANNEE (Dizaines et Unités)
      Data = GetDouble();                                 // Read registers from GPM
      Serial.println(Data, DEC);                          // Affichage sur terminal série PC
    } 
    
    /*---------------------------------------------------------
     Sous programme 'Get_Heure'
     ------------------------------------------------------------ */
    byte Get_Heure()
    {
      Address = 0;                                        // Adresse Registre Heures
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Serial.print(":");
      Address = 2;                                        // Adresse Registre Minutes
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.print(Data, DEC);                            // Affichage sur terminal série PC
      Serial.print(":");
      Address = 4;                                        // Adresse Registre Secondes
      Data = GetDouble();                                 // Lecture du registre depuis GPM
      Serial.println(Data, DEC);                          // Affichage sur terminal série PC
    }
    
    /*---------------------------------------------------------
     Sous programme 'Get_Satellites_vus'
     ------------------------------------------------------------ */
    byte Get_Satellites_vus()
    {
      Address = 35;           //58 version1 / 35 Version2 // Adresse de Pointage satellites en vue
      Data = GetSingle();                                 // Lecture du registre depuis GPM
      Serial.println(Data, DEC);                          // Affichage sur terminal série PC
    }
    
    
    /*---------------------------------------------------------
     Sous programme 'Get_Vitesse'
     ------------------------------------------------------------ */
    int Get_Vitesse()
    {
      Address = 52;                                       // Point to Speed 1 register
      Data = GetDouble();                                 // Read registers from GPM
      Serial.print(Data, DEC);                            // and print to PC
      Address = 54;                                       // Point to Speed 2 register
      Data = GetSingle();                                 // Read registers from GPM
      Serial.print(Data, DEC);                            // and print to PC
      Serial.print(".");
      Address = 55;                                       // Point to Speed 3 register
      Data = GetSingle();                                 // Read registers from GPM
      Serial.println(Data, DEC);                          // and print to PC
    }
    
    
    /*---------------------------------------------------------
     Sous programme 'GetLatitude_Calcul'
     ------------------------------------------------------------ */
    double GetLatitude_Calcul()
    {
      Address = 14;                                       // Registre Latitude Dizaines de degrés
      Data_8 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 15;                                       // Registre Latitude Dizaines de degrés
      Data_7 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 16;                                       // Registre Latitude Dizaines de minutes
      Data_6 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 17;                                       // Registre Latitude Unités de minutes
      Data_5 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 18;                                       // Registre Latitude dixièmes de minutes
      Data_4 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 19;                                       // Registre Latitude centièmes de minutes
      Data_3 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 20;                                       // Registre Latitude millièmes de minutes
      Data_2 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 21;                                       // Registre Latitude dix-millièmes de minutes
      Data_1 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
    
      Latitude_1=(Data_8*10+Data_7);  
      Latitude_2=(Data_6*1E5+Data_5*1E4+Data_4*1E3+Data_3*1E2+Data_2*1E1+Data_1);
      Latitude_2=(Latitude_2/60);
        Latitude_C = (Latitude_1+(Latitude_2*1E-4));
      return (Latitude_C);
    }
    /*---------------------------------------------------------
     Sous programme 'GetLongitude_Calcul'
     ------------------------------------------------------------ */
    double GetLongitude_Calcul()
    {
      Address = 23;                                       // Registre Longitude Centaines de degrés
      Data_9 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 24;                                       // Registre Longitude Dizaines de degrés
      Data_8 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 25;                                       // Registre Longitude Unités de degrés
      Data_7 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 26;                                       // Registre Longitude Dizaines de minutes
      Data_6 = GetSingle();                               /// Lire le registre du GPM (1 octet)
    
      Address = 27;                                       // Registre Longitude Unités de minutes
      Data_5 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 28;                                       // Registre Longitude dixièmes de minutes
      Data_4 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 29;                                       // Registre Longitude centièmes de minutes
      Data_3 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 30;                                       // Registre Longitude millièmes de minutes
      Data_2 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Address = 31;                                       // Registre Longitude dix-millièmes de minutes
      Data_1 = GetSingle();                               // Lire le registre du GPM (1 octet)
    
      Longitude_1=(Data_9*1E2+Data_8*10+Data_7);  
      Longitude_2=(Data_6*1E5+Data_5*1E4+Data_4*1E3+Data_3*1E2+Data_2*1E1+Data_1);
      Longitude_2=(Longitude_2/60);
    
        Longitude_C = (Longitude_1+(Longitude_2*1E-4));
      return (Longitude_C);
    }
    }
    // -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*  PARTIE SMS  -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    
    // Définition des différentes fonctions.
    //le programme SMS n'est pas dans la partie voidloop
    void power_on(){
    
        uint8_t answer=0;
        
        // Cette commande vérifie si le module GSM est en marche.
        answer = sendATcommand("AT", "OK", 2000);
        if (answer == 0)
        {
            // Mise en marche du module GSM
            digitalWrite(onModulePin,HIGH);
            delay(3000);
            digitalWrite(onModulePin,LOW);
        
            // Envoie d'une commande AT toutes les deux secondes et attente d'une réponse.
            while(answer == 0){
                answer = sendATcommand("AT", "OK", 2000);    
            }
        }
        
    }
    
    // Cette fonction permet d'envoyer des commandes AT au module GSM.
    int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){
    
        uint8_t x=0,  answer=0;
        char response[100];
        unsigned long previous;
    
        // Initialisation de la chaine de caractère (string).
        memset(response, '\0', 100);
        
        delay(100);
        
        // Initialisation du tampon d'entrée (input buffer).
        while( Serial.available() > 0) Serial.read();
        
        // Envoi des commandes AT
        Serial.println(ATcommand);
    
    
        x = 0;
        previous = millis();
    
        // Cette boucle attend la réponse du module GSM.
        
        do{
    // Cette commande vérifie s'il y a des données disponibles dans le tampon.
    //Ces données sont comparées avec la réponse attendue.
            if(Serial.available() != 0){    
                response[x] = Serial.read();
                x++;
                // Comparaison des données
                if (strstr(response, expected_answer) != NULL)    
                {
                    answer = 1;
                }
            }
        // Attente d'une réponse.
        }while((answer == 0) && ((millis() - previous) < timeout));    
    
       // Serial.println(response); //Cette ligne permet de debuguer le programme en cas de problème !
       return answer;
    }

Discussions similaires

  1. [Programmation] Arduino & SIM900
    Par Sandrolin dans le forum Électronique
    Réponses: 1
    Dernier message: 28/11/2016, 11h00
  2. [Programmation] Arduino....LOL Shield.
    Par balisto56 dans le forum Électronique
    Réponses: 9
    Dernier message: 06/05/2016, 17h40
  3. Programmation shield LCD sous arduino
    Par c4madmig dans le forum Électronique
    Réponses: 4
    Dernier message: 03/11/2015, 19h39
  4. Ethernet Shield arduino
    Par lm321 dans le forum Électronique
    Réponses: 1
    Dernier message: 24/11/2014, 08h20
  5. Moteur pas a pas avec arduino et shield
    Par nicocco033 dans le forum Électronique
    Réponses: 1
    Dernier message: 16/07/2014, 11h49