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

#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