Go Down

Topic: Stocker les données horaires d'une SIM900 dans des variables (Read 357 times) previous topic - next topic

Nytroxe

Bonjour,

Je suis un noob en Arduino, il faudrait que je réalise divers programmes dans le cadre de mon stage et j'aurais besoin d'aide pour un en particulier :

J'utilise une Arduino UNO avec une carte SIM900 de chez Epalsite ( http://wiki.epalsite.com/index.php?title=SIM900_Quad-Band_GPRS_shield_with_Micro_SD_card_slot ).

Mon problème est que j'aimerais pouvoir stocker dans des variables ce qui est retourné par la commande AT+CCLK.
Je suis arrivé a connecter ma SIM au réseau, a envoyer des SMS et a voir l'heure sur la liaison série, mais ici je bloque, alors que ça n'a pourtant pas l'air compliqué. Je dois louper quelque chose.
J'ai eu beau essayer divers méthodes, aucune ne donne de résultat satisfaisant. J'ai écumé internet mais je n'y arrive toujours pas  :(

Voici le dernier code que j'ai utilisé : 

Code: [Select]


#define DEBUG //  Mode debogage

#include <SoftwareSerial.h>
SoftwareSerial SIM900(2,3);
int i=0;

#define CCLK_MSG_LEN 28  // le nombre total de caractère dans le message CCLK
#define TIME_STR_LEN 18  // le nombre actuel de caractère

char timeStr[TIME_STR_LEN];
char timePreamble[] = "CCLK: \"" ;

int dateToDecimal(char * date){
 int value = ((date[0] - '0') * 10) +  (date[1] - '0');
 return value;
}

boolean getTime(){
  // Check for available bytes
 if(SIM900.available() < CCLK_MSG_LEN )
    return false;  // Pas assez de caractère pour un message complet

   if(SIM900.read() != '+')
     return false;  // Pas encore synchronisé

     for(int i=0; i < strlen(timePreamble); i++) {
       if(SIM900.read() != timePreamble[i] )
         return false; //  Fin si les données reçues ne remplissent pas le preamble
     }

     // Preamble checked.  Début des données temporelles
     for(int i=0; i < TIME_STR_LEN; i++)
       timeStr[i] = SIM900.read();
     return true; // timeString rempli avec des données valables
}


void GetSIM900()
{
  delay(2000);
 
  if(SIM900.available())
  {
    Serial.print("\n");
    delay(3000);
    while(SIM900.available())
    {
      Serial.print((char)SIM900.read()); // On vide la mémoire tampon du SIM900
    }
    Serial.print("\n");
  }
}


void setup()
{
  SIM900.begin(9600);
  Serial.begin(9600);
 
  Serial.println("configuration par defaut");
  SIM900.println("ATZ"); // Pour remettre les configuration par defaut
  GetSIM900();
 
   Serial.println("affichage du numero des erreurs");
   SIM900.println("AT+CMEE=1"); // Pour afficher le numero de l'erreur
  GetSIM900();

/*
  Serial.println("Code PIN");
  SIM900.println("AT+CPIN=1379"); // Code PIN
  GetSIM900();
*/
  delay(5000); // Connexion au réseau

  #ifdef DEBUG
  Serial.println("Operateur");
  SIM900.println("AT+COPS?"); // Opérateur
  GetSIM900();
  delay(5000);

      //SET center number server needed for free provider
  Serial.println("envoi de la commande: AT+CSCA=\"+33689004000\"");
  SIM900.print("AT+CSCA=\"+33689004000\"\r");
  GetSIM900();
  delay(5000); // Connexion au réseau

  Serial.println("Etat de la connexion au reseau :");
  Serial.println("La connexion est etablie si +CREG: 0,1");
  SIM900.println("AT+CREG?"); // Connexion au réseau
  GetSIM900();


  #endif

  Serial.println("Tentative de récupération de l'heure");
  //SIM900.println("AT+CLTS=1"); // Il semblerait que cette ligne soit optionnelle
 // GetSIM900();
  delay(1000);
  SIM900.println("AT+CCLK?");
  GetSIM900();

 
}

/*
  Serial.println("Activation du mode SMS");
  SIM900.println("AT+CMGF=1"); // Activation du mode SMS
  GetSIM900();

  Serial.println("Envoi du numero de telephone");
  SIM900.println("AT+CMGS=\"+33782764416\""); // Envoi du numéro de téléphone
  GetSIM900();

  Serial.println("Corps du message");
  SIM900.println("Bonjour"); // Corps du message
  Serial.println("CTR+Z");
  SIM900.write(0x1A); // CTR+Z
  GetSIM900();
}
*/
void loop()
{
  int years, months, dates, hours, minutes, seconds;
 if (SIM900.available())
 SIM900.println( "AT+CCLK?" );
 if(getTime() == true){
   delay(120000); //2 minutes
   years    = dateToDecimal(&timeStr[0]) ;
   months   = dateToDecimal(&timeStr[3]) ;
   dates    = dateToDecimal(&timeStr[6]) ;
   hours    = dateToDecimal(&timeStr[9]) ;
   minutes  = dateToDecimal(&timeStr[12]) ;
   seconds  = dateToDecimal(&timeStr[15]) ;}
//else Serial.println("Ada yang salah");

   Serial.print("YY/MM/DD HH:MM = ");
   Serial.print(years,DEC);
   Serial.print("/");
   Serial.print(months,DEC);
   Serial.print("/");
   Serial.print(dates,DEC);
   Serial.print("  ");
   Serial.print(hours,DEC);
   Serial.print(":");
   Serial.println(minutes,DEC);

   delay(2500);

}



Quand le programme arrive a la fin, je n'ai que des valeurs incohérentes de mes variables temporelles sur le port série.
Voilà, si quelqu'un a une idée, je suis preneur  :)


Nytroxe

S'ilvouplait, je suis sur que c'est pas très compliqué. Juste j'y arrive pas...


Henrigp

Bonjour,

J'ai un peu le même problème, mon *.ino a fonctionné un bout de temps et quand je l'ai repris "plus rien"
As-tu quelque chose si tu envoie la commande par la console ?

mon  applic :http://forum.arduino.cc/index.php?topic=252733.0

Bon courage.
Henri

Go Up