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.

Matériel

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.

Aidez-nous à produire du contenu libre et open-source en achetant vos produits chez MCHobby.

6 commentaires:

  1. Possible d'avoir votre aide pour un système presque pareille ?

    RépondreSupprimer
    Réponses
    1. Une description un peu plus précise serait la bien venue (ainsi qu'une description du matériel utilisé)

      Supprimer
  2. Bonjour, si j'ai bien compris, le montage : transistor + led sert de commutateur pour le relais de commande du chauffage?

    RépondreSupprimer
    Réponses
    1. comment en peut réaliser un montage d'une résistance chauffante sur isis ? Et quelle type en peut l'utiliser si en veut une température au maximum 30 degré celcius a ton à vie? De plus en veut juste une petite résistance chauffante pour une petit alimentation.avec arduino

      Supprimer
  3. Que devrions-nous faire si nous voulons faire la même chose mais contrôler la pompe à eau avec un sms

    RépondreSupprimer