Différences entre versions de « GoGprs HeatControl »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 109 : Ligne 109 :
  
 
// Wiring:
 
// Wiring:
 +
//  see http://mchobby.be/wiki/index.php?title=GoGprs_HeatControl
 +
//
 
//  Analog Output of TMP36 --> Arduino Pin A0
 
//  Analog Output of TMP36 --> Arduino Pin A0
 
//  Relais input control  --> Arduino Pin D4
 
//  Relais input control  --> Arduino Pin D4
Ligne 114 : Ligne 116 :
 
//
 
//
 
// Montage:
 
// Montage:
 +
//  Voir aussi http://mchobby.be/wiki/index.php?title=GoGprs_HeatControl
 +
//
 
//  Sortie Analogique du TMP36 --> Arduino Pin A0        ( entrée )
 
//  Sortie Analogique du TMP36 --> Arduino Pin A0        ( entrée )
 
//  Commande du relais        --> Arduino Pin Digital 4 ( sortie )
 
//  Commande du relais        --> Arduino Pin Digital 4 ( sortie )

Version du 4 novembre 2012 à 18:41

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.

GoGprs-HeatControl-img.jpg

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 :-)

{{#Widget:Iframe |url=http://www.youtube.com/embed/n3qU7XLMHho |width=420 |height=315 |border=0 }}

Le montage

Voici le plan du montage réalisé.

GoGprs-HeatControl-Montage.jpg

Ce montage utilise un Mini Kit relai 250v déjà décrit ici.

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)
//
// ----------------------------------------------------------------------
// Test code for the GPRS/GSM Shield sold by MCHobby
//
// Controlling the boiler at remote location by using SMS.
//
// The aim is to control the temperature at remote location (ex: at holiday house).
// It also allows to control the boiler by using a relais (mimicing the button pressure).
// 
// The controle is done by using the following SMS messages:
//  temp : return the temperature
//  push : Activate the relay for 2 secondes.
//  on   : Activate the relay (for other purpose)
//  off  : Unactivate the relay (for other purpose)
// 
// Debugging messages are send to the Serial Monitor of Arduino IDE.
// A Orange LED is used to indicates when the GPRS/GSM shield is registered on mobile network
//
// Tested and works great with
//    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
//
// Pick one up today at the MC Hobby webshop and help support open-source,
// open-hardware & open-translate! -Dominique
//
//Written by Dominique Meurisse for MCHobby. 
//BSD license, check the license.txt for more information

// Wiring:
//   see http://mchobby.be/wiki/index.php?title=GoGprs_HeatControl
//
//   Analog Output of TMP36 --> Arduino Pin A0
//   Relais input control   --> Arduino Pin D4
//   Yellow LED             --> Arduino Pin D3 (by using a 330 ohms resistor)
//
// 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", elle contient des liens vers les différents produits mis en oeuvre.

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.