Accueil » Actualité » HeatControl – Controle de Thermostat de chauffage par SMS avec Arduino

HeatControl – Controle de Thermostat de chauffage par SMS avec Arduino

INTRODUCTION

Voici un petit projet qui se propose de vous aider à contrôler la température sur votre lieu de vacances à distance à l’aide d’un simple GSM et de quelques SMS.
Vous avez une « maison de campagne » et vous voudriez qu’il y fasse agréablement chaud quand vous arrivez.
Malheureusement, il n’y a personne pour appuyer sur le bouton on/off du thermostat à votre place… sauf avec le projet que nous vous proposons.
Pour appuyer sur le bouton on/off à votre place, il suffit de raccorder le contact d’un relais un parallèle avec le bouton et l’activer pendant une seconde ou deux (cela « active » le contact électrique sur le thermostat à votre place).
L’idéal serait aussi de savoir quel température il fait pour savoir si seulement cela vaut la peine… il s’il vaut mieux l’activer tout de suite plutôt que courant de l’après midi.
Ce projet vous propose également de recevoir, sur demande, un SMS avec la température qu’il fait dans la pièce.

Pour ce projet, nous avons utilisés:

Vous pouvez finaliser ce montage sur:

LIBRAIRIE GOGPRS

Ce projet utilise la librairie GoGprs pour faciliter l’utilisation du shield GPRS… le code devient alors relativement simple et facile à comprendre.
La librairie GoGprs est disponible sur GitHub, voir ce lien pour plus d’informations.

UNE VIDÉO

Rien ne vaut une petite vidéo explicative :-)

LE MONTAGE

Voici le plan du montage réalisé.

Montage du projet HeatControl de MCHobby

LE CODE

Et le code qui fait fonctionne le montage.

// Code de test pour le GPRS/GSM Shield vendu par MCHobby
//
// Controle d'un chauffage à distance par SMS.
//
// Le but est de controler la temperature dans une endroit distant (maison de vacance).
// Permet eventuellement d'envoyer un ordre de mise en route au thermostat en cliquant 
//    sur le bouton (par l'intermédiaire d'un relais).
//
// Le controle se fait à l'aide des messages SMS suivant:
//   temp : retourne la température
//   push : active le relais pendant 2 secondes
//   on   : active le relais    (autre cas d'utilisation)
//   off  : désactive le relais (autre cas d'utilisation)
//
// Des messages de debugging sont envoyés sur le Serial Monitor d'Arduino IDE!
// Une Led orange est utilisée pour savoir si le Shield GPRS/GSM est enregistré sur le reseau mobile.
//
// Testé et fonctionnel avec 
//    GSM/GPRS Shield             --> http://mchobby.be/PrestaShop/product.php?id_product=63
//    Mini kit relais 250v        --> http://mchobby.be/PrestaShop/product.php?id_product=150
//    TMP 36 (temperature sensor) --> http://mchobby.be/PrestaShop/product.php?id_product=59
//    
// Soutenez le mouvement Open-Source, Open-Harware et Open-Translate en 
//   achetant votre exemplaire sur le WebShop de MCHobby (www.mchobby.be)
//
// Montage:
//   Voir aussi http://mchobby.be/wiki/index.php?title=GoGprs_HeatControl
//
//   Sortie Analogique du TMP36 --> Arduino Pin A0        ( entrée )
//   Commande du relais         --> Arduino Pin Digital 4 ( sortie )
//   Led orange                 --> Arduino Pin Digital 3 ( sortie ), avec Resistance de 330 ohms. 

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

#define PIN_CODE "7663" // SIM CARD PinCode

int ledPin = 3;
int relayPin = 4;
int tempSensorPin = 0;

// Serial connection to GPRS shield
SoftwareSerial mySerial(PIN_GPRS_RX, PIN_GPRS_TX);
GoGprs gsm = GoGprs(&mySerial);

void setup() {
  // Another serial connexion to Arduino IDE
  // for showing usefull messages
  Serial.begin(19200);

  // Initializing Input/Output
  pinMode( ledPin, OUTPUT );
  pinMode( relayPin, OUTPUT );
  pinMode( tempSensorPin, INPUT );

  digitalWrite( relayPin, LOW );
  digitalWrite( ledPin, LOW );

  // initiate GPRS Shield communication 
  gsm.begin( PIN_CODE ); 
}   

void loop() {
  gsm.execute();

  /* Receive SMS and Forward it to Serial Monitor */
  if( gsm.isCallReady() ) {
    digitalWrite( ledPin, HIGH );

    if( gsm.hasSms() ){
      String smsText = gsm.smsText();
      String smsCallee = gsm.smsCallee(); 
      Serial.println( smsText );
      Serial.println( smsCallee );
      gsm.clearSms(); // reset the reception of the last SMS

      // Delegate the treatment of request to SubRoutine
      // Déléguer le traitement à une sous fonction
      processSMS( smsText, smsCallee );
    }
    else {
      // A small light off to inform user than software is running
      // On eteind la LED un très bref moment pour indiquer que le soft fonctionne
      digitalWrite( ledPin, LOW );
      delay( 100 );
      digitalWrite( ledPin, HIGH );
    }

  }
  else {
    // LED is off when having no isCallReady (just small light on to say "hey its working")
    // La LED est éteinte si pas enregistré sur le réseau mobile. On l'allume use fraction de seconde pour
    //   indiquer que le programme fonctionne. 
    digitalWrite( ledPin, HIGH );
    delay( 100 );
    digitalWrite( ledPin, LOW );
  }

  delay(500);  
}

//Description:
//  Traitment du contenu du message SMS
//
void processSMS( String smsText, String smsCallee ){

  // Intruction: temp
  if( smsText.indexOf( "temp" )>=0 ) {
    // Lecture de la temperature
    float temp = readTemp();
    // Covertir Float en String
    char tmpChar[10];
    dtostrf(temp,2,2,tmpChar);
    // Preparer le message de réponse
    String smsResp = String( "Temperature=" ) + String( tmpChar );

    Serial.println( smsResp );
    if( gsm.sendSms( smsCallee, smsResp ) ){
      Serial.println( F("Reponse Envoye (send)") );
      signalSmsSend(); 
    }
    else     
      Serial.println( F("OUPS!") );

    return; // arreter le traitment de la fonction
  }

  // Intruction: push
  if( smsText.indexOf( "push" )>=0 ) {
    digitalWrite( relayPin, HIGH );
    delay( 2000 );
    digitalWrite( relayPin, LOW );
    if( gsm.sendSms( smsCallee, "push execute" ) ){
      Serial.println( F("Reponse Envoye (send)") );
      signalSmsSend(); 
    }
    else     
      Serial.println( F("OUPS!") );

    return;     
  }

  // Intruction: on
  if( smsText.indexOf( "on" )>=0 ) {
    digitalWrite( relayPin, HIGH );
    if( gsm.sendSms( smsCallee, "on execute" ) ){
      Serial.println( F("Reponse Envoye (send)") );
      signalSmsSend(); 
    }
    else     
      Serial.println( F("OUPS!") );

    return;     
  }

  // Intruction: off
  if( smsText.indexOf( "off" )>=0 ) {
    digitalWrite( relayPin, LOW );
    if( gsm.sendSms( smsCallee, "off execute" ) ){
      Serial.println( F("Reponse Envoye (send)") );
      signalSmsSend(); 
    }
    else     
      Serial.println( F("OUPS!") );

    return;     
  }  

  // Si on arrive ici, c'est que le message recu n'est pas décodé
  Serial.print( F("Ne sait que faire avec: " ));
  Serial.print( smsText );
  signalSmsError();
}

//Description:
//  Petite routine sympa qui fait clignoter la LED plusieurs fois de suite pour indiquer
//  le départ d'un SMS message.
//
void signalSmsSend(){
  for( int i = 0; i<10; i++ ){
    digitalWrite( ledPin, LOW );
    delay( 100 );
    digitalWrite( ledPin, HIGH );
    delay( 100 );
  }
}

//Description:
//  Petite routine sympa qui fait clignoter la LED Rapide-Rapide, lent, lent, lent, lent, Rapide-Rapide
//  Pour signaler une erreurs
//
void signalSmsError(){
    // Rapide - Rapide
    digitalWrite( ledPin, LOW );
    delay( 100 );
    digitalWrite( ledPin, HIGH );
    delay( 100 );
    digitalWrite( ledPin, LOW );
    delay( 100 );
    digitalWrite( ledPin, HIGH );
    delay( 100 );
    digitalWrite( ledPin, LOW );
    // lent-lent
    delay( 100 );
    digitalWrite( ledPin, HIGH );
    delay( 500 );
    digitalWrite( ledPin, LOW );
    delay( 500 );
    digitalWrite( ledPin, HIGH );
    delay( 500 );
    digitalWrite( ledPin, LOW );
    delay( 500 );
    digitalWrite( ledPin, HIGH );
    delay( 500 );
    digitalWrite( ledPin, LOW );
    delay( 500 );
    digitalWrite( ledPin, HIGH );
    delay( 500 );
    digitalWrite( ledPin, LOW );
    delay( 100 );
    // Rapide - Rapide
    digitalWrite( ledPin, LOW );
    delay( 100 );
    digitalWrite( ledPin, HIGH );
    delay( 100 );
    digitalWrite( ledPin, LOW );
    delay( 100 );
    digitalWrite( ledPin, HIGH );
    delay( 100 );
    digitalWrite( ledPin, LOW );    

}

//Description:
//  Lecture de la température sur la pin A0
//
//Returns:
//  La température en degré Celcius.
//
float readTemp(){
 // Lecture de la valeur sur l'entrée analogique
 // Retourne une valeur entre 0->1024 pour 0->5v
 // Attention: Jeter la première lecture pour éviter les effects capacitifs
 int valeur = analogRead(tempSensorPin);
 delay( 20 );
 valeur = analogRead(tempSensorPin);

 // Converti la lecture en tension
 float tension = valeur * 5.0;
 tension /= 1024.0; 

 // Convertir la tension (mv) en temperature
 float temperature = ((tension * 1000) - 500) / 10;

 return temperature;
}
Ou acheter
Tout le matériel proposé est disponible chez MC Hobby.
N’hésitez pas à consulter la section « matériel » de cet article, elle contient des liens vers les différents produits mis en oeuvre.

 

source : arduino & raspberry Notepad

A propos de Ma Domotique

Comptable de métier, j'ai décidé d'exercer ma passion qu'est la domotique. Je tiens ce blog après mon travail ou sur mon temps libre. J'essaie d'apprendre aux autres, mais j'en apprend aussi beaucoup de vous. Pour moi, la domotique ne doit pas être quelque chose de complexe, mais quelque chose d'accessible à tous. Cela doit nous permettre de faciliter la vie au quotidien, de nous permettre de passer plus de temps en famille et en sécurité tout en prenant soin aussi de notre planète, sans gaspillage inutile.
  • Arnaud De Radiguès

    Qui pourrait m’indiquer comment se procurer une carte SIM « désimlockée » Quel opérateur en Belgique ? Quelle formule ? Merci

%d blogueurs aiment cette page :