Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Module GSM2-Click
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#61 Message par venom » lun. 19 sept. 2016 21:37 lien vers la Data-Sheet : Cliquez ici

Après je ne sais paas si c'est un rapport, On a les SMS illimité, mais j'ai eu une connaissance qui c'est vu bloqué son forfait car d'après l'opérateur elle en envoyer tellement qu'ils pensaient qu'elle faisait de la revente de SMS " du deal de SMS " . Ça parait improbable mais c'est la vérité.

Après j'ai déjà eu des cartes sim hs du jour au lendemain.

Logiquement chez Orange ils vont faire un dump de la sim notamment pour le répertoire enregistré dedans.

Tu nous tiendras au courant.






@++
Mon site web
Mon discord : venom#4888

Module GSM2-Click
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#62 Message par Jérémy » mar. 20 sept. 2016 19:01 lien vers la Data-Sheet : Cliquez ici

Retour de chez orange . Impeccable SIM changée et tout roule de nouveau .

essai de la dernière version du programme. Pas un bug de trouvé ( encore ...) , c'est plutôt bon signe .

Je vais faire des tests sur la précision de l'alarme. Comme le module ce mets a jour sur l'heure du réseau normalement c'est bon .

Après quelques tests je passe à l'optimisation. ( genre faire des fonctions plus propres) nettoyer les variables etc .... Après je sais pas si y'a grand chose a optimiser en fait .

Pour la fonction ternaire , je ne suis pas encore assez à l'aise pour l'utiliser mais je prends note .
Pour l'imbrication des switch case les uns dans les autres, comme me l'a préconisé Claudius, je ne suis pas chaud non plus pour la lisibilité

Si vous voyez autre chose je suis preneur

Code : Tout sélectionner

/*
 Test du module  GSM2 click
 * Description:
   Ce programme utilise le module GSM Quectel M95 pour envoyer et recevoir des SMS
   Je controle ma carte easy PIC et envoie son état par SMS .

 *configuration:
     MCU:             PIC18F46K22 : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
     Carte:           EasyPIC7 : http://www.mikroe.com/easypic/
     Oscillateur:     HS 8.0000 MHz, 8.0000 MHz Crystal  PLL disable
     modules ext.:    gsm2 clickick : http://www.mikroe.com/click/gsm2/
                      Quectel M95 : https://www.soselectronic.hu/a_info/resource/c/quectel/M95_ATC_V1.0.pdf
     SW:              mikroC PRO for PIC : http://www.mikroe.com/mikroc/pic/
 * NOTES:
   - Le clignotement de la led rouge "NET" rapide pas de connexion , lentement Connexion
 */
#include        "timelib.h"
#define PWRKEY RE1_bit

//##############################################################################
//##################    DECLARATION VARIABLES/CONSTANTES     ###################
//##############################################################################
char SMS_a_envoyer[50]={0};
char SMS_Recu[50];
char  Composition_numero[50];
char Gdh[50];
char Numero_tel[20];  // tableau pour placer le numéro de téléphone en string format : {"+336********"}
char Val_Jours[4];
char Val_Heures[4];
char Val_Minutes[4];
char Val_Secondes[4];
char Val_Jours_restant[4];
char Val_Heures_restant[4];
char Val_Minutes_restant[4];
char Val_Secondes_restant[4];
char Val_Signal[7];

unsigned char   Jours_restant=0, Heures_restant=0, Minutes_restant=0, Secondes_restant=0, Valeur=0, Heures=0, Minutes=0, Secondes=0;
unsigned char Signal=0, temp=0, Erreur=;
unsigned char Ok=0, Buzzer=0, CMTI=0, SMS_enregistre=0, Fleche=0,reponse_a_envoyer=0;
unsigned char Demande_Lancement=0, Demande_Lancement_Reveil, Lancement=0, Fin_Chrono=0, Flag_Mah=0;

unsigned int Gdh_An, Gdh_Mois, Gdh_Jour ,Gdh_Heure ,Gdh_Minutes ,Gdh_Secondes ;
unsigned int Rev_An ,Rev_Mois ,Rev_Jour ,Rev_Heure ,Rev_Minutes ,Rev_Secondes ;
unsigned int i=0;

unsigned long Chrono=0, epoch1=0, epoch2=0, diff=0;

TimeStruct ts1, ts2 ;

// -------------------      boucle d'attente       -----------------------------
// Elle permet de mettre le module dans une position connue
void attente(){
     i= Ok = 0;
     while(Ok==0)      // Ici on envoie la commande "AT" tant que le Flag "Ok" n'est pas levé
          {
             i++;
             UART1_Write_Text("AT");
             UART1_Write(13);
             delay_ms(500);
             if (i>=25)         // Au bout de 25 tentatives on RESET
                {
                  asm reset;
                }
             else if (i>=10)   // Au bout de 10 tentatives on reset les variables
                {
                  Valeur = SMS_enregistre = Chrono = CMTI = temp = Fleche = reponse_a_envoyer = 0;
                  Demande_Lancement = Demande_Lancement_Reveil = Lancement = 0 ;
                }
           }
     i = Ok = 0;
 }
// --------------------------  EFFACE le SMS recu  -----------------------------
void RAZ_SMS_Recu(){
    for (i=0;i<=50;i++){
        SMS_Recu[i] = 0;
     }
    i = 0;
 }

// --------------------  Compose le numéro de téléphone  -----------------------
void Composition(){
        Composition_numero[0]=0;
        strcat(Composition_numero, "AT+CMGS=\""); // rajoute la commande d'envoi de message(CMGS) et on ouvre les guillemets
        strcat(Composition_numero, Numero_tel);   // On rajoute le nuémro de tel, Ex: "AT+CMGS=06******xx\""
        strcat(Composition_numero, "\"");         // et on ferme les guillemets
        strcat(Composition_numero, 0);
        UART1_Write_Text(Composition_numero);
        UART1_Write(13);
        delay_ms(500);
     }

//########################     INTERRUPTION     ################################
void interrupt(){

  if ((TMR0IF_bit) && (TMR0IE_bit)) {   //  TIMER 0 interruption toute les secondes
      TMR0IF_bit = 0;
      TMR0H         = 0x0B;
      TMR0L         = 0xDC;
      PORTD.B7  = ~PORTD.B7;
      Chrono--;
         if (Chrono==0)
            {
              Fin_Chrono = 1;
            }
  }

// Lecture des données dans le buffer UART par INT
  if (RCIF_bit == 1) {      // Si INT UART détecté

    temp = UART1_Read();      // On récupere et stock la donnée

    switch (Valeur){

           case 0:{
                    if (temp == 'O')         // "OK"
                        Valeur = 1;
                    else if (temp == 'C')    // "CMTI" ou "CSQ"
                         Valeur = 20;
                    else if (temp == '"')    // "N° de tel" ou "Gdh"
                         Valeur = 30;
                    else if (temp == '>')    // "Fleche"
                         Valeur = 50;
                    else if (temp == 'E')    // "ERROR"
                         Valeur = 100;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 1:{
                    if (temp == 'K')
                        Valeur = 2;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 2:{
                    if (temp == 13)
                        Valeur = 3;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 3:{
                    if (temp == 10)
                       {
                         Ok = 1;        // On a recu le mot "OK , on léve le drapeau
                         Valeur = 0;
                       }
                     else
                     Valeur 
= 0;
                    break;
                  }
           case 20:{
                    if (temp == 'M')
                        Valeur = 21;
                    else if (temp == 'S')
                        Valeur = 25;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 21:{
                    if (temp == 'T')
                        Valeur = 22;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 22:{
                    if (temp == 'I')
                       {
                          CMTI = 1;     // On a recu "CMTI", on léve le drapeau
                          Valeur = 0;
                        }
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 25:{
                    if (temp == 'Q')
                          Valeur = 26;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 26:{
                    if (temp == ':')       // On a recu "CSQ" on enregistre la valeur
                          Valeur = 27;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 27:{
                    if (temp == ' ')
                          Valeur = 28;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 28:{
                    if (temp >= '0' && temp <= '9')
                       {
                         Val_Signal[0] = '0' ;
                         Val_Signal[1] = temp ;
                       }
                    Valeur = 29;
                    break;
                  }
           case 29:{
                    if (temp >= '0' && temp <= '9')
                       {
                         Val_Signal[0] = Val_Signal[1] ;
                         Val_Signal[1] = temp ;
                       }

                    Val_Signal[2] = 0;
                    Valeur = 0;
                    break;
                  }
           case 30:{
                    if (temp == '+')                // On enregistre le numéro de téléphones
                       {
                          Numero_tel[0] = temp;
                          i = 1;
                          Valeur = 31;
                        }
                     else if (temp == '2')          // On enregistre la date
                          Valeur = 40;
                    else
                        Valeur 
= 0;
                  };break;
           case 31:{
                     if (temp >= '0' && temp <= '9')
                        {
                          Numero_tel[i] = temp;
                          i++;
                        }
                     else if (temp == '"')
                        {
                          Numero_tel[i] = 0;
                          i = 0;
                          Valeur = 0;
                        }
                      else
                        
{
                          Numero_tel[0] = 0;
                          i=0;
                          Valeur = 0;
                        }
                  };break;
           case 40:{
                    if (temp == '0')
                        Valeur = 41;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 41:{
                    if (temp == '1')
                       {
                         Gdh[0] = temp;
                         i = 1;
                         Valeur = 42;
                       }
                    else
                        Valeur 
= 0;

                    break;
                  }
           case 42:{
                     if (temp != '"')
                        {
                          Gdh[i] = temp;
                          i++;
                        }
                     else
                        
{
                          Gdh[i] = 0;
                          i = 0;
                          Valeur = 43;
                        }
                     break;
                  }
           case 43:{
                    if (temp == 13)
                        Valeur = 44;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 44:{
                    if (temp == 10)
                       {
                         i=0;
                         Valeur = 45;
                       }
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 45:{
                     if (temp != 13)
                        {
                          SMS_Recu[i] = temp;
                          i++;
                        }
                     else
                        
{
                          SMS_Recu[i] = 0;
                          i = 0;
                          Valeur = 0;
                        }
                     break;
                  }
           case 50:{
                    if (temp == ' ')
                       {
                         Fleche = 1;
                         Valeur = 0;
                       }
                     else
                       Valeur 
= 0;
                    break;
                  }
           case 100:{
                    if (temp == 'R')
                        Valeur = 101;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 101:{
                    if (temp == 'R')
                        Valeur = 102;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 102:{
                    if (temp == 'O')
                        Valeur = 103;
                    else
                        Valeur 
= 0;
                    break;
                  }
           case 103:{
                    if (temp == 'R')
                        {
                          Erreur = 1;
                          Valeur = 0;
                        }
                    else
                        Valeur 
= 0;
                    break;
                  }

           default: valeur = 0;
    }
 }
}
//##############################################################################
//############################     MAIN     ####################################
//##############################################################################
void main(){
  ANSELA = ANSELB = ANSELC = ANSELD = ANSELE = 0; // Tous les PORT en Digital

  SLRCON = 0;      // Set output slew rate on all ports at standard rate

  TRISB = 0XFF ;   // Entrée
  TRISD = 0X00 ;   // Sortie
  TRISE = 0x00 ;   // Sortie
  LATD = 0;        // Mis à zéro des sorties
  LATE = 0;        // Mis à zéro des sorties

//------------------------------------------------------------------------------
// Réglages de l'interruption
  RC1IE_bit = 1;           // INT UART activé
  PEIE_bit  = 1;           // INT péripheriques Activé
  GIE_bit   = 1;           // INT Global activé

//------------------------------------------------------------------------------
// Réglages du Timer 0 pour 1 secondes
  T0CON         = 0x84;
  TMR0H         = 0x0B;
  TMR0L         = 0xDC;
  TMR0IE_bit    = 0;       // TIMER 0 Non activé au départ

//------------------------------------------------------------------------------
//  Activation de l'alim avec la pin PWRKEY
  PWRKEY = 0;             // Mise à zéro
  delay_ms(3000);         // Maintenir à 0 pendant plus de 2S
  PWRKEY = 1;             // Allume le module

//------------------------------------------------------------------------------
  UART1_Init(4800);      // Initialisation de l'UART
  Delay_ms(100);
  Sound_Init(&PORTC, 2);  // Initialisation du Sound
  Delay_ms(100);

//------------------------------------------------------------------------------
// Parametrages du débit
  while(1){
      UART1_Write_Text("AT");   // Envoi commande "AT"
      UART1_Write(13);
      delay_ms(100);
      if ( Ok == 1)
         {
           Ok = 0;
           break;
         }
    }
    
 delay_ms
(8000); // Configuration du baud-rate , ensuite initilaistaion du module

//------------------------------------------------------------------------------
// Parametrages du module
  while(1){
      UART1_Write_Text("AT+CMGF=1");   // Reglage des messages de type "texte"
      UART1_Write(13);
      delay_ms(100);
      if ( Ok == 1)
         {
           Ok = 0;
           break;
         }
    }

  while(1){
      UART1_Write_Text("ATE0");        // Désactivation de la commande "Echo"
      UART1_Write(13);
      delay_ms(100);
      if ( Ok == 1)
         {
           Ok = 0;
           break;
         }
    }

  while(1){
      UART1_Write_Text("AT+QMGDA=\"DEL ALL\""); // Envoi la commande pour effacer tous les messages
      UART1_Write(13);
      delay_ms(100);
      if ( Ok == 1)
         {
           Ok = 0;
           break;
         }
    }

  while(1){
      UART1_Write_Text("AT");   // Envoi commande "AT"
      UART1_Write(13);
      delay_ms(100);
      if ( Ok == 1)
         {
           Ok = 0;
           break;
         }
    }
//------------------------------------------------------------------------------
// 3 Bips pour signifier l'initialisation c'est bien passéee et finie
 for (i=0;i<=2;i++){
     Sound_Play(2000, 50); // On joue un son
     delay_ms(50);
  }

= Valeur = Ok = SMS_enregistre = Signal = 0;

//##############################################################################
//####################### BOUCLE PRINCIPALE     ################################
//##############################################################################
while(1) {

   if (CMTI)         // On a recu un nouveau message
      {
         attente();
         CMTI = 0;
         UART1_Write_Text("AT+CMGL=\"REC UNREAD\"");  // On demande à le lire
         UART1_Write(13);
         while (Ok!=1);    // Je reste ici pour enregistrer toute mes infos
         Ok = 0;
         attente();
         SMS_enregistre = 1;  // Je signale que j'ai finis de l'enregistrer
      }

   if (SMS_enregistre)       // Si il y a eu un nouveau message et que je l'ai enregistré
      {
        SMS_enregistre = 0;

        //----- On efface le message ( tous les messages)
        UART1_Write_Text("AT+QMGDA=\"DEL ALL\"");
        UART1_Write(13);
        attente();

        // ----- On met à jour le Gdh au premier SMS
        if (Flag_Mah==0)
           {
              Flag_Mah = 1;
              Gdh[8]=',';
              UART1_Write_Text("AT+CCLK=\"");
              UART1_Write_Text(Gdh);
              UART1_Write_Text("\"");
              UART1_Write(13);
              attente();
           }

        //-----------------    On recoit "CHRONO"    ---------------------------
        if ( ((SMS_Recu[0]=='C')||(SMS_Recu[0]=='c')) && ((SMS_Recu[1]=='H')||(SMS_Recu[1]=='h')) && ((SMS_Recu[2]=='R')||(SMS_Recu[2]=='r')) )
           {

                   Heures =  (((SMS_Recu[8])-48)*10)+(((SMS_Recu[9])-48));
                   Val_Heures[0]= SMS_Recu[8] ;
                   Val_Heures[1]= SMS_Recu[9] ;
                   Val_Heures[2]= 0;

                   Minutes =  (((SMS_Recu[12])-48)*10)+(((SMS_Recu[13])-48));
                   Val_Minutes[0]= SMS_Recu[12] ;
                   Val_Minutes[1]= SMS_Recu[13] ;
                   Val_Minutes[2]= 0;

                   Secondes =  (((SMS_Recu[16])-48)*10)+(((SMS_Recu[17])-48)) ;
                   Val_Secondes[0]= SMS_Recu[16] ;
                   Val_Secondes[1]= SMS_Recu[17] ;
                   Val_Secondes[2]= 0;

             if (Lancement == 1)
                {
                   reponse_a_envoyer = 9;
                }
             else if ( (Heures>99) || (Minutes>59) || (Secondes>59) )
                {
                  reponse_a_envoyer = 97;
                }
             else
                
{
                  Chrono = (Heures*3600)+(Minutes*60)+Secondes ;
                  Demande_Lancement = 1;
                  reponse_a_envoyer = 1;
                }
           }
        //-----------------    On recoit "OUI"    ---------------------------
        else if ( ((SMS_Recu[0]=='O')||(SMS_Recu[0]=='o')) && ((SMS_Recu[1]=='U')||(SMS_Recu[1]=='u')) && ((SMS_Recu[2]=='I')||(SMS_Recu[2]=='i')) )
           {
              if ( (Demande_Lancement==1) || (Demande_Lancement_Reveil ==) )
                 {
                  Demande_Lancement = 0;
                  Demande_Lancement_Reveil = 0;
                  Lancement = 1;
                  reponse_a_envoyer = 2;
                 }
               else
                 
{
                   reponse_a_envoyer = 98;
                 }

           }
        //------------------    On recoit "NON"    -----------------------------
        else if ( ((SMS_Recu[0]=='N')||(SMS_Recu[0]=='n')) && ((SMS_Recu[1]=='o')||(SMS_Recu[1]=='O')) && ((SMS_Recu[2]=='N')||(SMS_Recu[2]=='n')) )
           {
              if ((Demande_Lancement==1) || (Demande_Lancement_Reveil ==))
                 {
                    Demande_Lancement = 0;
                    Demande_Lancement_Reveil = 0;
                    reponse_a_envoyer = 3;
                 }
               else
                 
{
                   reponse_a_envoyer = 98;
                 }
           }
        //-------------------    On recoit "ETAT"    ---------------------------
        else if ( ((SMS_Recu[0]=='E')||(SMS_Recu[0]=='e')) && ((SMS_Recu[1]=='T')||(SMS_Recu[1]=='t')) && ((SMS_Recu[2]=='A')||(SMS_Recu[2]=='a')) )
           {
              // On calcul le temps restant du chrono
              ByteToStr( (Chrono/86400), Val_Jours_restant);
              ByteToStr( (Chrono/3600), Val_Heures_restant);
              ByteToStr( ((Chrono%3600)/60), Val_Minutes_restant);
              ByteToStr( ((Chrono%3600)%60), Val_Secondes_restant);

              // On demande la qualite du reseau
              UART1_Write_Text("AT+CSQ");
              UART1_Write(13);
              delay_ms(100);
              attente();                   // On attend pour enregistré la valeur
              Signal =  100 - ((((Val_Signal[0]-48)*10) + ((Val_Signal[1]-48)))*2);
              ShortToStr(Signal, Val_Signal);
              
              reponse_a_envoyer 
= 4;
           }
        //-------------------    On recoit "STOP"    ---------------------------
        else if ( ((SMS_Recu[0]=='S')||(SMS_Recu[0]=='s')) && ((SMS_Recu[1]=='T')||(SMS_Recu[1]=='t')) && ((SMS_Recu[2]=='O')||(SMS_Recu[2]=='o')) )
           {
              if (Lancement)
                 {
                    Lancement = 0;        // RAZ du flag
                    TMR0IE_bit = 0;       // Arret du TIMER0
                    Chrono = 0;           // RAZ de la Valeur du Chrono
                    
                    reponse_a_envoyer 
= 5;
                 }
               else
                 
{
                   reponse_a_envoyer = 98;
                 }
           }
        //-------------------    On recoit "AIDE"    ---------------------------
        else if ( ((SMS_Recu[0]=='A')||(SMS_Recu[0]=='a')) && ((SMS_Recu[1]=='I')||(SMS_Recu[1]=='i')) && ((SMS_Recu[2]=='D')||(SMS_Recu[2]=='d')) )
           {
              reponse_a_envoyer = 6;
           }
        //-----------------    On recoit "REVEIL"    ---------------------------
        else if ( ((SMS_Recu[0]=='R')||(SMS_Recu[0]=='r')) && ((SMS_Recu[1]=='E')||(SMS_Recu[1]=='e')) && ((SMS_Recu[2]=='V')||(SMS_Recu[2]=='v')) )
           {
              // remplissage des structures
              ts1.ss = (((Gdh[15])-48)*10)+(((Gdh[16])-48));
              ts1.mn = (((Gdh[12])-48)*10)+(((Gdh[13])-48));
              ts1.hh = (((Gdh[9])-48)*10)+(((Gdh[10])-48));
              ts1.md = (((Gdh[6])-48)*10)+(((Gdh[7])-48));
              ts1.mo = (((Gdh[3])-48)*10)+(((Gdh[4])-48));
              ts1.yy = 2000 + ((((Gdh[0])-48)*10)+(((Gdh[1])-48))) ;

              ts2.ss = (((SMS_Recu[22])-48)*10)+(((SMS_Recu[23])-48)) ;
              ts2.mn = (((SMS_Recu[19])-48)*10)+(((SMS_Recu[20])-48)) ;
              ts2.hh = (((SMS_Recu[16])-48)*10)+(((SMS_Recu[17])-48)) ;
              ts2.md = (((SMS_Recu[7])-48)*10)+(((SMS_Recu[8])-48)) ;
              ts2.mo = (((SMS_Recu[10])-48)*10)+(((SMS_Recu[11])-48)) ;
              ts2.yy = 2000 + ((((SMS_Recu[13])-48)*10)+(((SMS_Recu[14])-48)))  ;

              // calcul du temps
              epoch1 =Time_dateToEpoch(&ts1) ;
              epoch2 = Time_dateToEpoch(&ts2) ;
              diff = epoch2 - epoch1 ;
              
              if 
(Lancement == 1)          // Si le Chrono est déjà lancé
                   reponse_a_envoyer = 9;
              else if ( epoch2 <= epoch1)  // Le reveil est inferieur à la date actuelle
                   reponse_a_envoyer = 10;
              else if ( diff > 604800)     // Le reveil est supérieur à une semaine
                     reponse_a_envoyer = 11;
              else
                  
{
                    Chrono = diff ;
                    Demande_Lancement_Reveil = 1;
                    attente();
                    
                    reponse_a_envoyer 
= 7;
                  }
           }
        //-----------------    On recoit "TEST"    ---------------------------
        else if ( ((SMS_Recu[0]=='T')||(SMS_Recu[0]=='t')) && ((SMS_Recu[1]=='E')||(SMS_Recu[1]=='e')) && ((SMS_Recu[2]=='S')||(SMS_Recu[2]=='s')) )
           {
              UART1_Write_Text("AT+CCLK?");
              UART1_Write(13);
              attente();
              reponse_a_envoyer = 8;
           }
        //-----------------    On recoit un mot inexistant   ---------------------------
        else
           
{
              reponse_a_envoyer = 99;
           }

        Composition();    // On compose le numéro
      }

   if (Fleche)       // Jattends pour envoyer le message
      {
        Fleche = 0;

        switch (reponse_a_envoyer){  // Suivant la question posée j'affiche la réponse adéquate

               case 1:{
                         UART1_Write_Text("Valeurs recues:\r\n");
                         UART1_Write_Text("h : ");
                         UART1_Write_Text(Val_Minutes);
                         UART1_Write_Text("m : ");
                         UART1_Write_Text(Val_Secondes);
                         UART1_Write_Text("s\r\n\r\n");
                         UART1_Write_Text("Voulez-vous le lancer ?");
                         break;
                       }
               case 2:{
                         TMR0IE_bit = 1; // On lance le chrono
                         UART1_Write_Text("Le chrono est lancé !");
                         break;
                       }
               case 3:{
                         UART1_Write_Text("Abandon de l'initialisation");
                         break;
                       }
               case 4:{
                         UART1_Write_Text("Etat du module:\r\n");
                         UART1_Write_Text("Date: ");  // On écrit la date
                         UART1_Write(Gdh[6]);
                         UART1_Write(Gdh[7]);
                         UART1_Write_Text("/");
                         UART1_Write(Gdh[3]);
                         UART1_Write(Gdh[4]);
                         UART1_Write_Text("/");
                         UART1_Write(Gdh[0]);
                         UART1_Write(Gdh[1]);
                         UART1_Write_Text("\r\n");

                         UART1_Write_Text("Heure:  ");  // On écrit l'heure
                         for (i=9;i<17;i++)
                             {
                               if ( (Gdh[i]<58) && Gdh[i]>47 )
                                  UART1_Write(Gdh[i]);
                                else
                                  UART1_Write_Text
(":");
                             }
                         UART1_Write_Text("\r\n");
                         UART1_Write_Text("Force du signal :"); // On écrit la force du signal
                         UART1_Write_Text(Val_Signal);
                         UART1_Write_Text("%\r\n");

                           if (Lancement==1)       // Le temps qu'il reste
                              {
                                UART1_Write_Text("Lancé : OUI\r\n");
                                UART1_Write_Text("Temps restant :\r\n");
                                if ( Jours_restant != 0)
                                   {
                                     UART1_Write_text(Val_Jours_restant);
                                     UART1_Write_Text("j");
                                   }
                                UART1_Write_Text(Val_Heures_restant);
                                UART1_Write_Text("h");
                                UART1_Write_Text(Val_Minutes_restant);
                                UART1_Write_Text("m");
                                UART1_Write_Text(Val_Secondes_restant);
                                UART1_Write_Text("s");
                              }
                           else
                              
{
                                UART1_Write_Text("Lancé : NON");
                              }
                         break;
                       }
               case 5:{
                         UART1_Write_Text("Arret du chrono");
                         break;
                       }
               case 6:{
                         UART1_Write_Text("Les mots clés:\r\nStop: pour arreter le chrono\r\nOui: pour lancer le chrono\r\nNon: pour annuler une demande\r\nEtat: pour connaitre les valeurs\r\nChrono Hxx Mxx Sxx: initialise le chrono\r\nReveil jj/mm/aa hh/mm/ss: mode reveil");
                         break;
                       }
               case 7:{
                         UART1_Write_Text("Réveil reglé\r\n");
                         UART1_Write_Text("le : "); // écrit la date du reveil
                         UART1_Write(SMS_Recu[13]);
                         UART1_Write(SMS_Recu[14]);
                         UART1_Write_Text("\/");
                         UART1_Write(SMS_Recu[10]);
                         UART1_Write(SMS_Recu[11]);
                         UART1_Write_Text("\/");
                         UART1_Write(SMS_Recu[7]);
                         UART1_Write(SMS_Recu[8]);
                         UART1_Write_Text("\r\n");
                         UART1_Write_Text("a  : ");  // écrit l'heure du reveil
                         for (i=16;i<24;i++)
                             {
                               UART1_Write(SMS_Recu[i]);
                             }
                             i=0;
                         UART1_Write_Text("\r\n\r\n");
                         
                         UART1_Write_Text
("Voulez-vous le lancer ?");
                         break;
                       }
               case 8:{
                         UART1_Write_Text("Test\r\n");
                         Gdh[8]=',';
                         UART1_Write_Text(Gdh);
                         break;
                       }
               case 9:{
                         UART1_Write_Text("Le Chrono est déja lancé.\r\n");
                         UART1_Write_Text("Utilisez le mot \"STOP\" pour l'arreter");
                         break;
                       }
               case 10:{
                         UART1_Write_Text("La Valeur du réveil est anterieur a l\'heure actuelle");
                         break;
                       }
               case 11:{
                         UART1_Write_Text("La date reveil est supérieur a une semaine");
                         break;
                       }
               case 96:{
                         UART1_Write_Text("Test");
                         break;
                       }
               case 97:{
                         UART1_Write_Text("Erreur, les valeurs ne sont pas correctes\r\nHeures<100\r\nMinutes<60\r\nsecondes<60");
                         break;
                       }
               case 98:{
                         UART1_Write_Text("Erreur, ce mot ne convient pas ici !");
                         break;
                       }
               case 99:{
                         UART1_Write_Text("Erreur, mot inconnu!.");
                         break;
                       }
           }

        UART1_Write(13);
        UART1_Write(10);
        UART1_Write(0x1A);  // Envoi cu CTRL+Z pour envoyer le message
        delay_ms(500);
        attente();
        RAZ_SMS_Recu();    // On efface le buffer du SMS recu
        attente();
      }

//---------------  Fin du Chrono ------------------------------
   if (( Fin_Chrono) && (Lancement) )
      {
          Fin_Chrono = 0;
          Lancement = 0;
          Chrono = 0;
          TMR0IE_bit = 0;
          for (i=0;i<=5;i++){
             Sound_Play(2000, 300); // On joue un son
             delay_ms(50);
          }
          Composition();            // Envoi u nmessage pour dire que c'est fini
          UART1_Write_Text("Le Chrono est fini");
          UART1_Write(13);
          UART1_Write(10);
          UART1_Write(0x1A);  // Envoi cu CTRL+Z pour envoyer le message
          attente();
       }

   if (Erreur)             // Si flag Erreur levé
      {
        Erreur = 0;        // RAZ du flag
        i=0;
        while(Ok==0)      // Ici on envoie la commande "AT" tant que le Flag "Ok" n'est pas levé
            {
              i++;
              UART1_Write_Text("AT");
              UART1_Write(13);
              delay_ms(1000);
              if (i==5)        // RAZ des variables et flag
                 {
                  Valeur = SMS_enregistre = Chrono = CMTI = temp = Fleche = reponse_a_envoyer = 0;
                  Demande_Lancement = Lancement = Demande_Lancement_reveil = 0 ;
                 }
              if (i>10)
                 asm reset;
            }
        i = 0;
        Ok = 0;          // RAZ flag "Ok"
      }

 }

}


@Paul : tu m'avais parlé de mettre le texte en dur je crois dans un autre post . Mais j'ai quand même pas mal de texte, crois que que ca vaille le coup ? quelle est serait les bénéfices ? vitesse , mémoire .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Module GSM2-Click
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#63 Message par paulfjujo » mer. 21 sept. 2016 08:44 lien vers la Data-Sheet : Cliquez ici

bonjour Jeremy,


tu m'avais parlé de mettre le texte en dur je crois dans un autre post . Mais j'ai quand même pas mal de texte, crois que que ca vaille le coup ? quelle est serait les bénéfices ? vitesse , mémoire .



Definir du texte directement dans le code , c'est le mettre en RAM..

Probleme latent :
c'est surtout vrai pour les "petits" MCU. , si on travaille vers les 95% de taille RAM occupée.

Tu en es où en taille RAM et ROM occupées ?


oops Je crois que j'ai cramé mon module GSM2-click Quecktel M95 ..
en le connectant décalé d'une pin vers le bas sur le support MikroBus !
+5V sur le 0V et +3,3 sur le 0V ?
suite à de multiples manip avec ma carte SIM et mon Tracker GSM/GPGRS/GPS..
utilisant cette meme carte SIM.
je ne recois plus aucun SMS sur mon Phone , par contre je peux toujours en recevoir (coté PIC) !
A moins que mes manip avec des serverudrGPS Trace m'aient bloqué quelque chose ..

+CMS ERROR: 69 .. qui ne signifie pas grand chose !

Code : Tout sélectionner


   3 EA1
=    1EA2 Now=   77;TempF25.54deg No MCP23017;BP1=1BP2=1LD1=0LD2=0;Dialog=1SOM=0STAT=1DTR=0
 Read message NON LUS 
(AT+CMGL="REC UNREAD")
+
CMTI"SM",1
+CMGL1,"REC UNREAD","+33621xxxxxx","","2016/09/19 18:36:25+08"
Help
OK

 Help demandée
 Contenu du SMS à envoyer
Cdes dispo
:
 
Data On demand
 Survey On 
(ou Off)
 
Sommeil
 Cde Led1 0n 
(ou Off)
 
MAH=15/09/29,16:45:00+04
 MCP1
=00000000

 Compose Numero 
(AT+CMGS="+3362xxxxxxx"
>  Pret pour envoi Msg txt
+CMS ERROR69
Efface tous les SMS reçus 
(AT+QMGDA="DEL INBOX")
OK
Aide toi, le ciel ou FantasPic t'aidera

Module GSM2-Click
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#64 Message par paulfjujo » mer. 21 sept. 2016 20:43 lien vers la Data-Sheet : Cliquez ici

bonsoir à tous,


@jeremy

pourrais_tu tester cette commande quectel

Code : Tout sélectionner


D
:\__PIC_MCU\_MikroE_Docus\_GSM2_Click\QCOM_V1.0.exe
Test avec QNAVIGATOR
D
:\_QNavigatorV1.5\Qnavigator.exe
 AT
+CPOL?
  Mode Debug <Exit> pour en sortir =1     Cde=AT+CPOL?
 AT+CPOL?
+
CPOL: 1,2,"20801"    //    Orange France
+CPOL: 2,2,"20802"    //    Orange France
+CPOL: 3,2,"21404"  //    Xfera Moviles           SPAIN
+CPOL: 4,2,"20610"    //    mobystar                 Belgium
+CPOL: 5,2,"22201"    //    Telecom Italia Mobile
+CPOL: 6,2,"22288"    //    WIND Italy
+CPOL: 7,2,"26803"    //    Optimus (Sonaecom)   Portugal
+CPOL: 8,2,"26201"    //    D1 (T-Mobile)    Germany
+CPOL: 9,2,"60401"    //    Maroc Telecom (Itissalat Al-Maghrib) Moroco
+CPOL: 10,2,"22801"    //    Swisscom Mobile    Switzerland
+CPOL: 11,2,"60303"    //    Wataniya Telecom (Nedjma)        Algeria
+CPOL: 12,2,"310410" // ???



Le parametre 12 me donne un code fournisseur inconnu du bataillon..
J'ai testé le module connecté sur le Clicker PIC, en mode Debug,
En principe j'utilise "orange"

Code : Tout sélectionner

AT+COPS?
+
COPS: 0,0,"Orange F"
OK
AT
+COPS=1,2,"20801"
 Mode Debug <Exit> pour en sortir =1     Cde=AT+COPS=1,2,"20801"
AT+COPS=1,2,"20801"
OK
 Mode Debug 
<Exit> pour en sortir =1     Cde=AT+COPS?
AT+COPS?
+
COPS: 1,2,"20801"
OK


L'UART1 prend alors les commandes , des recpetion d'un SMS "Debug ON"
et j'utilise alors Qnavigator de Quectel pour tester les cdes AT
La plupart des commandes reagissent bien
sauf la lecture de l'etat carte SIM ?

AT+QSIMSTAT?
Mode Debug <Exit> pour en sortir =1 Cde= ?? ??
AT+QSIMSTAT?
+CME ERROR: 100
mais celle ci est Ok
AT+QSIMVOL?
Mode Debug <Exit> pour en sortir =1 Cde=AT+QSIMVOL?
AT+QSIMVOL?
+QSIMVOL:0 Recognize 1.8V and 3.0V SIM card (Default)
OK

et envoi de SMS ..
Compose Numero (AT+CMGS="+336xxxxxxx5"
> Pret pour envoi Msg txt
+CMS ERROR: 69
Aide toi, le ciel ou FantasPic t'aidera

Module GSM2-Click
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#65 Message par Jérémy » mer. 21 sept. 2016 20:46 lien vers la Data-Sheet : Cliquez ici

Je test ca tout de suite .

Le temps de brancher ma SIM et mon cable UART/TTL/USB
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Module GSM2-Click
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#66 Message par Jérémy » mer. 21 sept. 2016 20:59 lien vers la Data-Sheet : Cliquez ici

Voici :

Sans titre.jpg


Puis :

Code : Tout sélectionner

+COPS?
                                                                       
+
COPS0
                                                                                  
OK
  
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Module GSM2-Click
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#67 Message par paulfjujo » jeu. 22 sept. 2016 18:55 lien vers la Data-Sheet : Cliquez ici

bonjour Jeremy, et à Tous,

Merci de te pencher sur mon probleme ..

Curieux , dans ta liste de "fournisseurs" il n'y en a aucun Francais ?
lien sur
Network Codes List
le code "France" commence par 208 ...

ex:
Spain 21403 France Telecom Espana, S.a (Amena)
Italy 22201 Telecom Italia Mobile



et ta cde "+COPS?" qui donne simplement 0 ?

alors que ma cde AT+COPS? donne
+COPS: 0,0,"Orange F"
OK

Je vais retester le module GSM2 en dehors du MikroBus Clicker PIC avec Qnavigator ...
car à cet instant precis ,je ne sais pas si c'est
-le module GSM2 qui est partielement HS
-ou ma carte SIM
- ou des E/S du PIC clicker

dommage qu'il n'y ait pas de detromper sur ces cartes Click...
:furieux: avec moi-meme .. La galère ..

de plus je ne peux pas tester ma carte SIM seule , je n'ai aucun autre telephone debloqué ..(libre de fournisseur)
à moins que mon Tracker GSM/GPRS/GPS puisse s'activer...
j'ai chargé pour celà " GpsGate Server" sur mon PC .. à suivre
Aide toi, le ciel ou FantasPic t'aidera

Module GSM2-Click
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#68 Message par paulfjujo » sam. 24 sept. 2016 20:50 lien vers la Data-Sheet : Cliquez ici

Impossible d'envoyer un SMS soit à partie du module QUECTEL95 soit de mon Tracker GPS
je pense que le probleme est du coté de la carte SIM
j'ai vu qu'il existait une commande pour bloquer lessorties SMS
testé sans succes ...

=> je commande une autre carte SIM pour 10 roros !
Diviser pour mieux regner !
A suivre...
Aide toi, le ciel ou FantasPic t'aidera

Module GSM2-Click
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#69 Message par paulfjujo » mer. 5 oct. 2016 20:20 lien vers la Data-Sheet : Cliquez ici

Bonsoir,


Apres avoir reçu une autre carte SIM ...
test GSM2-click .. idem
je recois des SMS ,mais ne peut en envoyer

Code : Tout sélectionner


 Compose Numero 
(AT+CMGS=AT+CMGS="+33621517346"<CR><LF>
AT+CMGS="+<CR><LF>
 Pret pour envoi Msg txt <CR><LF>
Essai envoi SMS depuis GSM2

+CMS ERROR: 69<CR><LF>
 Erreur sur envoi SMS <CR><LF>
<CR><LF>


Mon Tracker 102 ne repond pas non plus à une commande quelconque .. telle que begin123456
bien qu'il clignote à 4sec => GPRS et GPS OK

I faut dire que j'ai mené mes test en parallele , entre le GSM2-click et mon tracker GPS TK-102
(AVEC LA MEME CARTE SIM !)

J'ai testé toutes les E/S du PIC , en relation avec la carte GSM2 -> tout est OK

Au cous de mes perigrinations à ce sujet, cette phrase, issue d'u forum GPS Trace Orange m'a mis la puce à l'oreille :
Please make sure that you your SIM-card number is not registered on another platform.


J''ai donc remis ma carte SIM sur le GSM2 , acrtivé le mode debug ( par envoi SMS "Debug On")
recu par le GSM2 et aigguille alors, l'UART1 sur le GSM2 via l'UART2
comme si le GSM2 etait directement relié au terminal..
coté Terminal : usage de QNAVIGATOR (de Quectel) que je recommande vivement !
et envoi de commande famille TCPIP ... ect..
et store en profil 0.

Je sort du mode debug en envoyant "Exit" via le clavier terminal
et retombe alors sur la config PIC <-> UART2 <--> GSM2
j'envoi un SMS "Cde Led1 On"
et miracle ,il agit, allume la led et repond en envoyant le SMS "Etat Led1=1 Led2=0"
C'EST OK !

Code : Tout sélectionner


   9 EA1
=  135; EA2 Now=   74;TempF= 23.85deg ; No MCP23017;BP1=1; BP2=1; LD1=0; LD2=0;Dialog=0; SOM=0; STAT=1; DTR=0
   10 EA1
=  134; EA2 Now=   74;TempF= 23.85deg ; No MCP23017;BP1=1; BP2=1; LD1=0; LD2=0;Dialog=0; SOM=0; STAT=1; DTR=0
 Read message NON LUS 
(AT+CMGL="REC UNREAD")

+
CMTI: "SM",2
AT
+CMGL="REC UNREAD"
+CMGL: 2,"REC UNREAD","+33621517346","","2016/10/04 19:17:20+08"
Cde Led1 On
OK
 Retour d
'ordre cde Leds 
  Contenu du SMS à envoyer
Retour Led1=1 Led2=0
 Compose Numero AT+CMGS="+33621517346"
 Pret pour envoi Msg Tx 

Retour Led1=1 Led2=0

+CMGS: 56
OK
 Envoi SMS OK :
Efface tous les SMS reçus (AT+QMGDA="DEL INBOX")
AT+QMGDA="DEL INBOX"
OK

   11 EA1=  135; EA2 Now=   74;TempF= 23.85deg ; No MCP23017;BP1=1; BP2=1; LD1=1; LD2=0;Dialog=0; SOM=0; STAT=1; DTR=0
   12 EA1=  135; EA2 Now=   74;TempF= 23.85deg ; No MCP23017;BP1=1; BP2=1; LD1=1; LD2=0;Dialog=0; SOM=0; STAT=1; DTR=0




Tout est rentré dans l'ordre !

Entre temps un Ticket envoyé à MikroE, me confirmait qu'il y avait peu de chance (ou malheur)
que ma carte GSM2 soit H.S.

La morale de cette histoire serait:
- N'utilise pas la meme carte SIM pour plusieur application
- fait gaffe à 2 fois , avant d'installer un module Click sur un mikroBus ... meme sidans mon cas , cela n'a pas eu d'incidence
Modifié en dernier par paulfjujo le mer. 5 oct. 2016 20:31, modifié 1 fois.
Aide toi, le ciel ou FantasPic t'aidera

Module GSM2-Click
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#70 Message par Jérémy » mer. 5 oct. 2016 20:30 lien vers la Data-Sheet : Cliquez ici

Merci pour ce retour d'expérience fort utile !

Je n'ai pas recommencé mes tests encore ( je profite de ma petite famille) mais ça ne serait tarder ! :-D

En tout état de cause, aux dernières nouvelles le programme fonctionnait parfaitement, me restait plus qu'a l'optimiser.
J'aimerais trouvé aussi une astuce pour redémarrer si jamais il plante !
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 46 invités