Projet de domotique utilisant SIM800L, Arduino et des boutons poussoirs
Introduction
La domotique, ou l’automatisation intelligente des tâches domestiques, a révolutionné notre façon de gérer les appareils et systèmes de notre maison. Dans cet article, nous allons explorer un projet passionnant de domotique qui utilise le module GSM SIM800L, l’Arduino et des boutons poussoirs pour contrôler à distance les appareils domestiques. Ce système ingénieux est basé sur l’utilisation des tonalités DTMF (Dual Tone Multiple Frequency) pour fournir une interface conviviale et pratique.
Les commandes DTMF
-
SIM800L V1 Module GSM GPRS90,00 DH
-
Produit en promotionLM2596 DC-DC alimentation ajustable IN3-40V OUT1.5-35V /3ALe prix initial était : 35,00 DH.30,00 DHLe prix actuel est : 30,00 DH.
-
Arduino Uno R3 avec câble USB120,00 DH
Les commandes DTMF (Dual Tone Multiple Frequency) sont utilisées pour contrôler à distance les appareils domestiques en envoyant des tonalités spécifiques via des appels téléphoniques. Voici un aperçu des commandes DTMF prises en charge par le système :
- Chiffres de 0 à 9 : Les touches numériques du clavier téléphonique sont utilisées pour activer ou désactiver les appareils correspondants. Par exemple, en envoyant le ton DTMF du chiffre “1”, l’utilisateur peut allumer ou éteindre un appareil spécifique associé à cette commande.
- Caractères alphabétiques : En plus des chiffres, les commandes DTMF prennent également en charge les caractères alphabétiques de A à D. Ces caractères sont souvent utilisés pour des fonctions spéciales ou des scénarios personnalisés. Par exemple, l’utilisateur peut utiliser la touche “A” pour déclencher une séquence d’allumage automatique de certains appareils.
- Caractères spéciaux : Les commandes DTMF incluent également des caractères spéciaux tels que l’astérisque (*) et le dièse (#). Ces caractères sont utiles pour indiquer des fonctions spéciales ou des séquences spécifiques. Par exemple, l’utilisateur peut utiliser le caractère “#” pour activer le mode veille de tous les appareils.
- Durée des tonalités DTMF : Dans le projet, la durée des tonalités DTMF peut être réglée à l’aide de la commande AT+VTD. Cette commande permet de spécifier la durée en unités de 100 millisecondes, assurant une transmission précise des commandes DTMF.
Grâce à ces commandes DTMF, les utilisateurs peuvent interagir facilement avec le système de domotique à distance, sans avoir besoin d’une interface complexe. En utilisant simplement leur téléphone mobile, ils peuvent contrôler efficacement les appareils domestiques et créer un environnement domestique intelligent et pratique.
La combinaison de la communication GSM et des commandes DTMF offre une solution polyvalente et pratique pour la gestion des appareils domestiques à distance.
Composants utilisés dans le projet de la domotique
- Arduino Uno : L’Arduino Uno est utilisé pour gérer diverses tâches de contrôle et de communication.
- Module GSM SIM800L : Ce module permet la communication via les réseaux GSM (Global System for Mobile Communications). Il est essentiel pour envoyer et recevoir des SMS, ce qui nous permettra de contrôler à distance notre système domotique.
- Boutons poussoirs : Nous utilisons quatre boutons poussoirs pour permettre aux utilisateurs d’activer et de désactiver à la fois les appareils électriques localement et à distance via les signaux DTMF.
- Module de relais à 4 canaux : Ce module de relais permet de contrôler différents circuits électriques en utilisant des signaux de faible puissance provenant de l’Arduino. Chaque canal du module de relais est indépendant et peut commuter un circuit électrique séparé.
- Convertisseur abaisseur LM2596 : Pour alimenter le module GSM SIM800L, qui nécessite une tension de 3,7 à 4,2 volts, nous utilisons un convertisseur abaisseur LM2596 pour réguler la tension de 9 volts à la tension requise.
Schéma de câblage
Branchement du module GSM SIM800L, LM2596 et Arduino
- Connectez l’entrée d’alimentation du module GSM SIM800L à la sortie du LM2596 : Le module GSM SIM800L nécessite une tension d’alimentation de 3.7V. Vous pouvez régler la sortie du LM2596 pour fournir cette tension en utilisant le potentiomètre intégré au LM2596. Connectez la broche d’entrée VCC du module GSM à la sortie du LM2596.
- Connectez la broche GND du module GSM à la broche GND du LM2596 : Assurez-vous d’avoir une connexion commune pour la mise à la terre entre le module GSM et le LM2596.
- Connectez le GND du module GSM au GND de l’Arduino Uno.
- Connectez le VCC du module GSM au 5V de l’Arduino Uno.
- Connectez le RXD du module GSM au TXD (Pin 3) de l’Arduino Uno.
- Connectez le TXD du module GSM au RXD (Pin 2) de l’Arduino Uno.
- Assurez-vous également de connecter une antenne au connecteur correspondant du module GSM pour améliorer la réception
Branchement du module de relais à 4 canaux
- Connectez le VCC du module de relais au 5V de l’Arduino Uno.
- Connectez le GND du module de relais au GND de l’Arduino Uno.
- Reliez les broches IN1, IN2, IN3 et IN4 du module de relais aux broches numériques de l’Arduino Uno (par exemple, IN1 à la broche 11, IN2 à la broche numérique 10, IN3 à la broche 9 et IN4 à la broche 8).
Branchement des 4 lamps
Pour chaque lampe, vous allez connecter le câblage comme suit :
- Connectez le fil de la lampe (le fil de phase) à la borne commune (C) du relais correspondant.
- Connectez le fil neutre de la lampe directement à la source d’alimentation neutre
Branchement des boutons poussoirs
- Connectez une extrémité de chaque bouton poussoir à une broche numérique de l’Arduino Uno.
- Connectez l’autre extrémité de chaque bouton poussoir à la broche GND de l’Arduino Uno (assurez-vous de les utiliser en mode INPUT_PULLUP).
Code
#include <SoftwareSerial.h> #include "Adafruit_FONA.h" #define FONA_RX 2 #define FONA_TX 3 #define FONA_RST 4 const String PHONE = "+91xxxxxxxxxx"; String smsStatus, senderNumber, receivedDate, msg, buff; boolean isReply = false; String dtmf_cmd; boolean is_call = false; #define FONA_RI_INTERRUPT 0 SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX); Adafruit_FONA fona = Adafruit_FONA(FONA_RST); #define button1_pin 4 #define button2_pin 5 #define button3_pin 6 #define button4_pin 7 #define relay1_pin 8 #define relay2_pin 9 #define relay3_pin 10 #define relay4_pin 11 boolean relay1_state = 1; boolean relay2_state = 1; boolean relay3_state = 1; boolean relay4_state = 1; void setup() { pinMode(button1_pin, INPUT); pinMode(button2_pin, INPUT); pinMode(button3_pin, INPUT); pinMode(button4_pin, INPUT); pinMode(relay1_pin, OUTPUT); pinMode(relay2_pin, OUTPUT); pinMode(relay3_pin, OUTPUT); pinMode(relay4_pin, OUTPUT); digitalWrite(relay1_pin, relay1_state); digitalWrite(relay2_pin, relay2_state); digitalWrite(relay3_pin, relay3_state); digitalWrite(relay4_pin, relay4_state); Serial.begin(115200); fonaSS.begin(9600); if (!fona.begin(fonaSS)) { Serial.println(F("Couldn't find FONA")); while (1) ; } Serial.println(F("FONA is OK")); fona.println("AT"); delay(500); fona.print("AT+CSMP=17,167,0,0\r"); fona.println("AT+DDET=1"); delay(500); smsStatus = ""; senderNumber = ""; receivedDate = ""; msg = ""; } void loop() { while (fona.available()) { buff = fona.readString(); handle_sim800_response(); } while (Serial.available()) { fona.println(Serial.readString()); } // listen_iir(); listen_push_buttons(); } void handle_sim800_response() { Serial.println(buff); if (is_call == true) { if (int index = buff.indexOf("+DTMF:") > -1) { index = buff.indexOf(":"); dtmf_cmd = buff.substring(index + 1, buff.length()); dtmf_cmd.trim(); Serial.println("dtmf_cmd: " + dtmf_cmd); if (dtmf_cmd == "1") control_relay(1); else if (dtmf_cmd == "2") control_relay(2); else if (dtmf_cmd == "3") control_relay(3); else if (dtmf_cmd == "4") control_relay(4); } if (buff.indexOf("NO CARRIER") > -1) { fona.println("ATH"); is_call = false; } } else if (buff.indexOf("RING") > -1) { delay(2000); fona.println("ATA"); is_call = true; } else if (buff.indexOf("+CMTI") > -1) { unsigned int index = buff.indexOf(","); String temp = buff.substring(index + 1, buff.length()); temp = "AT+CMGR=" + temp + "\r"; fona.println(temp); } else if (buff.indexOf("+CMGR") > -1) { extractSms(); if (msg == "1") control_relay(1); else if (msg == "2") control_relay(2); else if (msg == "3") control_relay(3); else if (msg == "4") control_relay(4); else if (msg.indexOf(".status") > -1) send_relay_status(msg.substring(0, 1)); else if (msg.indexOf("del all") > -1) delete_all_sms(); } } void extractSms() { unsigned int len, index; index = buff.indexOf("\r"); buff.remove(0, index + 2); buff.trim(); index = buff.indexOf(":"); buff.substring(0, index); buff.remove(0, index + 2); index = buff.indexOf(","); smsStatus = buff.substring(1, index - 1); buff.remove(0, index + 2); senderNumber = buff.substring(0, 13); buff.remove(0, 19); receivedDate = buff.substring(0, 20); buff.remove(0, buff.indexOf("\r")); buff.trim(); index = buff.indexOf("\n\r"); buff = buff.substring(0, index); buff.trim(); msg = buff; buff = ""; msg.toLowerCase(); } void listen_push_buttons() { if (digitalRead(button1_pin) == LOW) { delay(200); control_relay(1); } else if (digitalRead(button2_pin) == LOW) { delay(200); control_relay(2); } else if (digitalRead(button3_pin) == LOW) { delay(200); control_relay(3); } else if (digitalRead(button4_pin) == LOW) { delay(200); control_relay(4); } } void control_relay(int relay) { if (relay == 1) { relay1_state = !relay1_state; digitalWrite(relay1_pin, relay1_state); Serial.print("RelayState = "); Serial.println(relay1_state); delay(50); } else if (relay == 2) { relay2_state = !relay2_state; digitalWrite(relay2_pin, relay2_state); delay(50); } else if (relay == 3) { relay3_state = !relay3_state; digitalWrite(relay3_pin, relay3_state); delay(50); } else if (relay == 4) { relay4_state = !relay4_state; digitalWrite(relay4_pin, relay4_state); delay(50); } } void send_relay_status(String relay) { Serial.println("Relay Number: " + relay); //(relay1_state):"ON"?"OFF" String sms_text = ""; if (relay == "1") { sms_text = (relay1_state) ? "OFF" : "ON"; sms_text = "Relay 1 is " + sms_text; } else if (relay == "2") { sms_text = (relay2_state) ? "OFF" : "ON"; sms_text = "Relay 2 is " + sms_text; } else if (relay == "3") { sms_text = (relay3_state) ? "OFF" : "ON"; sms_text = "Relay 3 is " + sms_text; } else if (relay == "4") { sms_text = (relay4_state) ? "OFF" : "ON"; sms_text = "Relay 4 is " + sms_text; } Reply(sms_text); } void delete_all_sms() { fona.println("AT+CMGD=1,4"); delay(5000); while (fona.available()) { String response = fona.readString(); if (response.indexOf("OK") > -1) { Reply("All sms are deleted"); } else { Reply(response); } } } void Reply(String text) { Serial.println(text); fona.print("AT+CMGF=1\r"); delay(1000); fona.print("AT+CSMP=17,167,0,0\r"); fona.print("AT+CMGS=\"" + PHONE + "\"\r"); delay(1000); fona.print(text); delay(100); fona.write(0x1A); //sim800.println((char)26); delay(1000); Serial.println("SMS Sent Successfully."); msg = ""; }
Explication du code
Le code commence par définir les broches utilisées pour les connexions avec le module GSM SIM800L, les boutons poussoirs et les relais. Il définit également les variables pour le numéro de téléphone destinataire des SMS et d’autres variables pour gérer les états des relais.
Dans la fonction setup
, les broches sont configurées en entrée ou en sortie selon les besoins. Le module SIM800L est initialisé et configuré pour recevoir des commandes DTMF et des SMS. La fonction handle_sim800_response
gère les réponses du module GSM, traite les commandes DTMF reçues pendant un appel téléphonique et lit les SMS reçus pour contrôler les relais.
Dans la fonction listen_push_buttons
, le code écoute en permanence l’état des boutons poussoirs. Si l’un des boutons est enfoncé, la fonction control_relay
est appelée pour activer ou désactiver le relais correspondant.
La fonction control_relay
est utilisée pour basculer l’état du relais en fonction du numéro de relais fourni en argument. L’état du relais est stocké dans des variables booléennes (relay1_state
, relay2_state
, etc.) et la fonction met à jour l’état du relais en fonction de son état actuel.
La fonction extractSms
est utilisée pour extraire le contenu des SMS reçus, notamment le numéro de téléphone de l’expéditeur et le texte du SMS. En fonction du contenu du SMS, le projet réagit en contrôlant les relais ou en envoyant des réponses pour obtenir l’état des relais.
Les fonctions send_relay_status
et delete_all_sms
sont utilisées respectivement pour envoyer des réponses par SMS avec l’état actuel des relais et pour supprimer tous les SMS du module GSM.
Video descriptive
Lien outilles
- Pour découvrir plus de tutoriel, vous pouvez consulter notre bloc : https://www.moussasoft.com/tutoriels-electroniques
- Téléchargement de l’Arduino IDE : https://www.arduino.cc/en/software
- GitHub Arduino Repository : https://github.com/arduino/Arduino/
- Bibliothèque SoftwareSerial : https://github.com/PaulStoffregen/SoftwareSerial