Arduino Uno + Shield GPRS + Carte SIM Free = ???

Non pas de data, que du texte du genre "on" "off" et retour de commande par sms.
Ne marche pas avec le 2€
Marche avec le 19.99 €
Marche avec Orange (Pro surement)

Je change le code PIN à chaque changement de carte :grin:

Pachole:
Qu'est ce que tu appelles APN ?

Ca commence mal si tu ne sais pas ce qu'est l'APN :slight_smile:

C'est le nom du point d'accès au réseau.
Normalement le shield gprs ne sais pas fonctionner sans cela.
Il y a une commande pour configurer le shield.

SMS ?
Ok, pas besoin d'APN alors, ni d'option data

barbudor:
SMS ?
Ok, pas besoin d'APN alors, ni d'option data

Je me disais aussi, ça fonctionne et j'ai rien touché à tout ça... :slight_smile:

Je me permets de poster le code qui fonctionne pour ma part :

#include <GoGprs.h>
#include <SoftwareSerial.h>
#include <RCSwitch.h>

#define PIN_CODE "0000"

SoftwareSerial mySerial(PIN_GPRS_RX, PIN_GPRS_TX);
GoGprs gsm = GoGprs(&mySerial);

RCSwitch mySwitch = RCSwitch();

void setup()
{
 Serial.begin(19200);
 gsm.begin( PIN_CODE ); 
 mySwitch.enableTransmit(10);
}   

void loop()
{
 gsm.execute();
 if(gsm.isCallReady())
 {
  if(gsm.hasSms())
  {
   String phoneNr = gsm.smsCallee();
   if(phoneNr.substring(0) == "+33612345678")
   {
    mySwitch.switchOn(4, 3);
    delay(20000);
    mySwitch.switchOff(4, 3);
   }
   if(phoneNr.substring(0) == "+33687654321")
   {
    String msg = String( "Laisse tomber Maman.");
    if( gsm.sendSms( phoneNr, msg ))
    {
     Serial.println( "Successfully replied "+msg+" to "+phoneNr );
    }
    else
    { 
     Serial.println( "Reply "+msg+" to "+phoneNr+ "did failed!" );
    } 
   }
   if(phoneNr.substring(0) == "+3311111111")
   {
    String msg = String( "Tu aimes les films d'horreur ?");
    if( gsm.sendSms( phoneNr, msg ))
    {
     Serial.println( "Successfully replied "+msg+" to "+phoneNr );
    }
    else
    { 
     Serial.println( "Reply "+msg+" to "+phoneNr+ "did failed!" );
    } 
   }
   //Serial.println(phoneNr.substring(0));
   gsm.clearSms();
  }
  else
  {
    //Serial.println("Pas de SMS");
  }
 }
delay(500);  
}

Ca reçoit un sms quelconque, si c'est le bon numéro, ça donne envoi une commande RF pour allumer une prise, si c'est ma mère ça lui répond "Laisse tomber Maman" et ça ne fait rien, si c'est un autre ça lui répond "Tu aimes les films d'horreur ?" et ça ne fait rien non plus.

Les numéros de téléphone des protagonistes ont été changés pour préserver leur identité secrète de super-héros. 8)

J'utilise un shield GPRS de Seeedstudio , un arduino UNO R3 et la librairie GoGPRS.

Merci beaucoup pour ce code de super héros mais ça ne marche toujours pas avec ma SIM de super blaireau ... :grin:

bonjour,
la carte est elle activée sur le réseau?
ca donne quoi dans un tel normal?
si tu appelles le gprs, ca donne quoi? messagerie ou ca sonne?

Oui la carte est activée sur le réseau.
Quand je remets la carte dans le téléphone, du coup, je reçoit en bloc tous les messages qui sont pas arrivés sur l'arduino.
Si j'appelle quand la carte est dans le shield, ça sonne, répondeur etc...
Mystère ]:slight_smile:

active le mode debug de gogprs
dans le fichier GoGprs.h change ceci

//#define GG_DEBUG
// Forward GPRS incomming serial data to the debug channel.
//#define GG_DEBUG_GPRS_SERIAL

en

#define GG_DEBUG
// Forward GPRS incomming serial data to the debug channel.
#define GG_DEBUG_GPRS_SERIAL

et indique dans le void setup() le centre de service Free Mobile: +33695000695

mySerial.println("AT+CSCA="+33695000695"");
delay(1000);

cela devrait te renvoyer un OK

Ça marche pas non plus ! :0 =(

Pachole:
Ça marche pas non plus ! :0 =(

ca aide pas beaucoup.
que dit le DEBUG? fait un copier coller.

tant qu'a faire donne le type de carte gprs et ton code, ca sera plus simple.

Dans mon code de base, je n'utilise pas GoGprs.
Pour le debug, j'ai pris le code de DrWax, avec tes recommandations mais dans ma console, rien ne s'inscrit.

#include <GoGprs.h>
#include <SoftwareSerial.h>
int ledPIN = 13;

#define PIN_CODE "1706"

SoftwareSerial mySerial(7, 8 );
GoGprs gsm = GoGprs(&mySerial);

void setup()
{
Serial.begin(19200);
gsm.begin( PIN_CODE );
mySerial.println("AT+CSCA="+33695000695"");
delay(1000);
pinMode(ledPIN, OUTPUT);
}

void loop()
{
gsm.execute();
if(gsm.isCallReady())
{
if(gsm.hasSms())
{
String phoneNr = gsm.smsCallee();
if(phoneNr.substring(0) == "+33615******")
{
digitalWrite(ledPIN, HIGH);
delay(10000);
digitalWrite(ledPIN, LOW);
}
if(phoneNr.substring(0) == "+33687******")
{
String msg = String( "Laisse tomber Maman.");
if( gsm.sendSms( phoneNr, msg ))
{
Serial.println( "Successfully replied "+msg+" to "+phoneNr );
}
else
{
Serial.println( "Reply "+msg+" to "+phoneNr+ "did failed!" );
}
}
if(phoneNr.substring(0) == "+3311111111")
{
String msg = String( "Tu aimes les films d'horreur ?");
if( gsm.sendSms( phoneNr, msg ))
{
Serial.println( "Successfully replied "+msg+" to "+phoneNr );
}
else
{
Serial.println( "Reply "+msg+" to "+phoneNr+ "did failed!" );
}
}
//Serial.println(phoneNr.substring(0));
gsm.clearSms();
}
else
{
//Serial.println("Pas de SMS");
}
}
delay(500);
}

normal

void setup()
{
Serial.begin(19200);
gsm.begin( PIN_CODE );
mySerial.println("AT+CSCA="+33695000695"");
delay(1000);
pinMode(ledPIN, OUTPUT);
}

mets ceci pour voir

void setup()
{
Serial.begin(19200);
mySerial.println("ATZ");
delay(1000);
mySerial.println("AT+CSCA="+33695000695"");
delay(1000);
gsm.begin( PIN_CODE );

pinMode(ledPIN, OUTPUT);
}

tu n'aurais pas des cavaliers sur le shield?
quelle carte gprs?

Si tu reçois tous les SMS quand tu remets la carte dans le téléphone c'est que la carte n'est pas reconnue sur le réseau dans le module GPRS
Je ne vois que 2 raisons possibles :

  • PIN
  • faux contact qui fait que le module GPRS ne voit pas ta carte SIM

@infobarquee:
c'est seeedstudio v1.4

@barbudor:
je pense plutôt à un problème comme ça mais quand j'appelle le numéro, ça sonne donc logiquement le PIN est bon (et puis je le vérifie :stuck_out_tongue: )
quand au mauvais contact... j'ai beau regarder, nettoyer, comparer avec une autre SIM, je vois pas.

Je me vois mal appeler Free et dire "allo ? ça marche pas dans mon shield GPRS" ]:smiley:

barbudor:
Si tu reçois tous les SMS quand tu remets la carte dans le téléphone c'est que la carte n'est pas reconnue sur le réseau dans le module GPRS
Je ne vois que 2 raisons possibles :

  • PIN
  • faux contact qui fait que le module GPRS ne voit pas ta carte SIM

autre solution le changement de 64 à 128 n'a pas été fait dans softwareserial, mais ca devrait le faire avec les autres.

mets ceci après le ATZ, ca te diras si la carte est insérée ou non

mySerial.println("AT+CSMINS=?");
delay(1000);
mySerial.println("AT+CSMINS=<");
delay(1000);

mySerial.println("AT+CSMINS=?");
delay(1000);
mySerial.println("AT+CSMINS=<");
delay(1000);

Rien d'affiché, ok pour le 128 dans SoftwareSerial

la led du shield clignote comment?
rapide ou lent toutes les 3s?

mets ton code avec les modifs, juste un truc, tu a relancé l'ide après avoir décommenté le DEBUG

#include <SoftwareSerial.h> //Librairie utilisée pour communiquer avec le shield GSM/GPRS
#include <OneWire.h> // Librairie pour la sonde

SoftwareSerial mySerial(7, 8);
#define RELAY_PIN 4
String msg = String("");
int SmsContentFlag = 0;
int DS18B20_Pin = 10;
OneWire ds(DS18B20_Pin);

String SIM_PIN_CODE = String( "1706" );
String TEL_NUM = String( "615******" );

void setup()
{
Serial.begin(19200);
Serial.println("");
Serial.println("Debut initialisation");
mySerial.begin(19200);
delay(100);
mySerial.println("ATZ");
delay(1000);
mySerial.println("AT+CSMINS=?");
delay(1000);
mySerial.println("AT+CSMINS=<");
delay(1000);
mySerial.println("AT+CSCA="+33695000695"");
delay(1000);
mySerial.println("AT"); // Envoi d'une commande pour configuration du debit automatique
delay(1000);
Serial.println("Liaison serie GSM etablie.");
mySerial.println("AT+IPR=19200"); // Mise en mémoire du débit
delay(1000);
Serial.println("Debit etabli sur le module GSM.");
mySerial.print("AT+CPIN="); // Envoi du code PIN retourne ERREUR si il est déjà présent (ce qui n'est pas grave...)
mySerial.println( SIM_PIN_CODE );
delay(1000);
Serial.println("Code PIN OK.");
mySerial.println("AT+CMGF=1"); // GSM en mode texte
Serial.println("Fin initialisation GPRS");
Serial.println("
");
pinMode(RELAY_PIN, OUTPUT);
Serial.println("Fin initialisation RELAY");
Serial.println("*****************************");
}

void loop()
{
char SerialInByte;

if(Serial.available())
{
mySerial.print((unsigned char)Serial.read());
}
else if(mySerial.available())
{
char SerialInByte;
SerialInByte = (unsigned char)mySerial.read();
// Si le message se termine par un alors traiter le message
if( SerialInByte == 13 )

{
// Stocke le caractère dans le buffer de message
ProcessGprsMsg();
}
if( SerialInByte == 10 ){ }
else

{
// Stocke le caractère dans la mémoire tampon réservé au message
msg += String(SerialInByte);
}
}
float temperature = getTemp();
Serial.println(temperature);

if (temperature < 1)
{
ProcessSMSFroid();
Serial.println("Relai fermé");
digitalWrite(RELAY_PIN, HIGH); //A verifier
}
}
float getTemp(){
//returns the temperature from one DS18B20 in DEG Celsius

byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

for (int i = 0; i < 9; i++) { // we need 9 bytes
data = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
//FONCTION QUI ENVOIE UN SMS EN CAS DE FROID DANS L'APPARTEMENT
void ProcessSMSFroid ()
{

  • Serial.print("Envoi SMS Froid");*
  • mySerial.println("AT+CMGF=1"); //On passe les messages en mode text*
  • delay(100);*
    _ mySerial.print( "AT+CMGS="+33615******"" ); // Envoi du numero de telephone à joindre_
  • delay(100);*
  • mySerial.println("Temperature inferieure a 1 degre"); // Contenu du message*
  • delay(100);*
  • mySerial.println((char)26); // Envoi le code ASCII de Ctrl+z pour signaler la fin du message et l'envoi*
  • delay(100);*
  • mySerial.println();*
  • return;*
    }

// FONCTION QUI TRAITE LE SMS
void ProcessSms( String sms )
{
// Envoi le SMS sur le port console
Serial.print( "Traitement du SMS [" );
Serial.print( sms );
Serial.println( "]" );

// En fonction de l'ordre on effectue la commande vers la VERA simuler par l'envoi d'un SMS, permet aussi de tester la fonction d'envoi SMS
if( sms.indexOf("on") >= 0 )

  • {*
  • Serial.println( "Envoi repinse : chauffage allume" );*
  • //envoi du SMS de réponse*
  • mySerial.println("AT+CMGF=1"); //On passe les messages en mode text*
  • delay(100);*
  • mySerial.print( "AT+CMGS="+33" ); // Envoi du numero de telephone à joindre*
  • mySerial.print( TEL_NUM );*
  • mySerial.println(""");*
  • delay(100);*
  • mySerial.println("Chauffage allume"); // Contenu du message*
  • delay(100);*
  • mySerial.println((char)26); // Envoi le code ASCII de Ctrl+z pour signaler la fin du message et l'envoi*
  • delay(100);*
  • mySerial.println();*
  • digitalWrite(RELAY_PIN, HIGH);*
  • return;*
  • }*

if( sms.indexOf("off") >= 0 )

  • {*
  • Serial.println( "Envoi reponse : chauffage eteint" );*
  • //envoi du SMS de réponse*
  • mySerial.println("AT+CMGF=1"); //On passe les messages en mode text*
  • delay(100);*
  • mySerial.print( "AT+CMGS="+33" ); // Envoi du numero de telephone à joindre*
  • mySerial.print( TEL_NUM );*
  • mySerial.println(""");*
  • delay(100);*
  • mySerial.println("Lumiere eteinte"); // Contenu du message*
  • delay(100);*
  • mySerial.println((char)26); // Envoi le code ASCII de Ctrl+z pour signaler la fin du message et l'envoi*
  • delay(100);*
  • mySerial.println();*
  • digitalWrite(RELAY_PIN, LOW);*
  • return;*
  • }*

if( sms.indexOf("temp") >= 0 )

  • {*

  • float temperature = getTemp();*

  • Serial.println( "Envoi reponse : temperature" );*

  • //envoi du SMS de réponse*

  • mySerial.println("AT+CMGF=1"); //On passe les messages en mode text*

  • delay(100);*

  • mySerial.print( "AT+CMGS="+33" ); // Envoi du numero de telephone à joindre*

  • mySerial.print( TEL_NUM );*

  • mySerial.println(""");*

  • delay(100);*

  • mySerial.print("Temperature interieure de "); // Contenu du message*

  • mySerial.print( temperature );*

  • mySerial.println(" degres");*

  • delay(100);*

  • mySerial.println((char)26); // Envoi le code ASCII de Ctrl+z pour signaler la fin du message et l'envoi*

  • delay(100);*

  • mySerial.println();*

  • return;*

  • }*

  • else*

  • {*

  • Serial.println( "Envoi reponse : Commande inconnue" );*

  • //envoi du SMS de réponse*

  • mySerial.println("AT+CMGF=1"); //On passe les messages en mode text*

  • delay(100);*

  • mySerial.print( "AT+CMGS="+33" ); // Envoi du numero de telephone à joindre*

  • mySerial.print( TEL_NUM );*

  • mySerial.println(""");*

  • delay(100);*

  • mySerial.println("Commande inconnue"); // Contenu du message*

  • delay(100);*

  • mySerial.println((char)26); // Envoi le code ASCII de Ctrl+z pour signaler la fin du message et l'envoi*

  • delay(100);*

  • mySerial.println();*

  • return;*

  • } *
    }

// FONCTION QUI DEMANDE AU SHIELD GPRS D'UTILISER LE MODE TEXT POUR LES MESSAGES
//*******************************************************************************************
void GprsTextModeSMS()
{
mySerial.println( "AT+CMGF=1" );
}
// FONCTION QUI LIT LA POSITION DU SMS
void GprsReadSmsStore( String SmsStorePos )
{
mySerial.print( "AT+CMGR=" );
mySerial.println( SmsStorePos );
}
// FONCTION QUI EFFACE LE CONTENU DE LA MEMOIRE TAMPON DES MESSAGES DU GPRS SHIELD
void ClearGprsMsg()
{
msg = "";
}

void ProcessGprsMsg()
{
// Le shield GPRS signale que sa connexion réseau mobile est établie
if( msg.indexOf( "Call Ready" ) >= 0 )

  • {*
    _ Serial.println( "*** Le Shield GPRS est enregistre sur le reseau mobile ***" );_
  • // On passe les SMS en mode texte*
  • }*

// Message non sollicité quand un SMS arrive
if( msg.indexOf( "+CMTI" ) >= 0 )

  • {*
    _ Serial.println( "*** SMS recu ***" );_
  • // Rechercher la position de la virgule dans le message complet (+CMTI: "SM",6)*
  • int iPos = msg.indexOf( "," );*
  • String SmsStorePos = msg.substring( iPos+1 );*
  • // Demande de lecture du SMS*
  • GprsReadSmsStore( SmsStorePos );*
  • // On efface le sms de la mémoire du module gsm pour ne pas le surcharger*
  • mySerial.print( "AT+CMGD=" );*
  • mySerial.println( SmsStorePos );*
  • }*

// Lecture du stockage SMS via l'UART (résultat de la requete GprsReadSmsStore)
if( msg.indexOf( "+CMGR:" ) >= 0 )

  • {*
  • // Le prochain message contiendra le contenu du SMS*
  • SmsContentFlag = 1;*
  • // Les ligne suivantes sont essentielle pour ne pas effacer le flag!*
  • ClearGprsMsg();*
  • return;*
  • }*
    // le message +CMGR précédent indiquait que le message suivant du Shield GPRS contient le corps du SMS
    if( SmsContentFlag == 1 )
  • {*
    _ Serial.println( "*** DEBUT DU SMS ***" );_
  • Serial.println( msg );*
    _ Serial.println( "*** FIN DU SMS ***" );_
  • ProcessSms( msg );*
  • }*
    // Toujours mettre le flag à 0
    ClearGprsMsg();
    SmsContentFlag = 0;
    }
    [/quote]
    Celui là je l'ai pas encore testé.
    Sinon, je redémarre à chaque nouveau code/modif

La diode clignote toutes les 3sec mais ne réagit pas quand j'appelle (ça réagit quand il y a la carte sim orange)