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

;
#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 <CR> 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 <<
| 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;
}
Celui là je l'ai pas encore testé.