#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