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:- Un Arduino Uno
- Un GSM/GPRS Shield
- Un senseur de température TMP36
- Une Led orange voir mini kit assortiment de LEDs
- Un mini kit relais ou mini kit relais 250v suivant le cas d'application.
- Un breabboard demi taille
- Du fils de prototypage extra-souple
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.
Possible d'avoir votre aide pour un système presque pareille ?
RépondreSupprimerUne description un peu plus précise serait la bien venue (ainsi qu'une description du matériel utilisé)
SupprimerBonjour, si j'ai bien compris, le montage : transistor + led sert de commutateur pour le relais de commande du chauffage?
RépondreSupprimerOui, c'est exactement cela :-)
Supprimercomment 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
SupprimerQue devrions-nous faire si nous voulons faire la même chose mais contrôler la pompe à eau avec un sms
RépondreSupprimer