Cet article se base sur l’article précédent (Envoyer des SMS avec un module GSM A6), je vous recommande de le lire avant afin de comprendre d’où on part ici.
Dans l’article précédent, nous avons réussi a envoyer des SMS à l’aide d’un module FTDI. Nous allons maintenant voir comment faire la même chose avec un microcontrôleur (ESP8266 dans mon cas mais ça devrait fonctionner avec n’importe quel Arduino).
Ce qu’il faut:
La même chose que pour l’article précédent, plus un microcontrôleur, moi j’ai utilisé un module Wemos D1 :
Je les achète directement chez le fabricant (https://wiki.wemos.cc/products:d1:d1_mini), le temps de livraison est assez long (plusieurs semaines, a un mois pour arriver en France…) mais au moins on l’a au moins chère et je n’ai jamais été déçu en terme de qualité. Pour ceux qui ne connaissent pas, ils sont top! Ils embarquent un microcontrôleur programmable, une antenne wifi, 9 entrèes numériques, une entrée analogique, un convertisseur 5V en 3,3V et 4M de mémoire. C’est largement suffisant pour faire des objets connectés, même relativement complexes.
Le câblage
J’ai fait un effort ce coup-ci 😉 et j’ai fait le schéma sous fritzing :

J’ai ajouté un fil entre la borne D0 du Wemos D1 mini et le RST du module qui nous permettra de le redémarrer quand on serra prêt a communiquer avec lui. Sinon il s’agit juste de l’alimenter, et de raccorder D1 et D2 respectivement aux bornes UTX et URX du module.
A cette étape, j’ai préféré faire un câblage un peu plus permanent, ça permet d’éviter les problèmes de fils cavaliers ect… Mais vous pouvez tout aussi bien tout faire sur votre breadbord. J’ai donc utilisé un perfboard et soudé le tout ensemble :



Côté code:
Initialisation
Pour dialoguer avec notre module GSM, nous allons utiliser la communication série à travers la librairie standard SoftwareSerial:
#include <SoftwareSerial.h> #define RX_PIN D1 // Fil vert #define TX_PIN D2 // Fil orange #define RESET_PIN D0 // Fil jaune SoftwareSerial a6Serial(RX_PIN, TX_PIN); void setup() { Serial.begin(9600); a6Serial.begin(115200); //le baudrate par défaut de l'A6 est 115200 delay(500); } void loop() {}
Ensuite nous pouvons redémarrer notre module A6. Cette étape n’est probablement pas nécessaire mais permet de s’assurer de l’état du A6 au démarrage.
void resetModule() { digitalWrite(RESET_PIN, HIGH); delay(200); digitalWrite(RESET_PIN, LOW); } void setup() { Serial.begin(9600); a6Serial.begin(115200); //le baudrate par défaut de l'A6 est 115200 delay(500); pinMode(RESET_PIN, OUTPUT); //Pour redémarrer le A6, ça nous permettra de mieux controller l'état du module resetModule(); //On redemarre le module }
Pour finir l’initialisation, il faut attendre que le module soit prêt et connecté au réseau, puis le passer en mode SMS :
void waitUntilReady() { Serial.println("En attente du réseau"); unsigned long startTime = millis(); while(state == "initing" || state == "sms_mode") { if (a6Serial.available()) { String recievedA6 = a6Serial.readString(); Serial.println(recievedA6); if(state == "initing" && recievedA6.indexOf("+CREG: 5") >= 0) { Serial.println("Mode sms"); state = "sms_mode"; delay(2000); a6Serial.println("AT+CMGF=1"); } else if(state == "sms_mode" && recievedA6.indexOf("OK") >= 0) { state = "ready"; Serial.println("Tout est prêt!"); } } yield(); // redonne la main à l'esp8266 temporairement pour qu'il maintienne la connetion au wifi } }
Envoyer un sms
Comme vu dans l’article précédent, l’envoi d’un sms se fait en envoyant la commande AT
AT+CMGS="+336XXXXXXXX"
suivi du message, puis Ctrl-Z pour envoyer :
void sendSms(String number, String message) { if(state == "ready") { Serial.println("Sending \"" + message + "\" to " + number); a6Serial.print("AT+CMGS=\""); a6Serial.print(number); a6Serial.write(0x22); a6Serial.write(0x0D); // Retour chariot en hexadecimal a6Serial.write(0x0A); // Nouvelle ligne en hexadecimal delay(2000); a6Serial.print(message); delay(500); a6Serial.println(char(26));// Control-Z en hexadecimal } }
Pour l’exemple j’envoi un SMS en envoyant la commande sendSms à l’Esp8266 par l’objet Serial :
#define PHONE_NUMBER "+336XXXXXXXX" #define MESSAGE "Whoop whoop" void loop() { if(Serial.available()) { String received = Serial.readString(); received.trim(); if(state == "ready") { if(received == "sendSms") { sendSms(PHONE_NUMBER , MESSAGE ); } } } }
Ce qui donne :

Le code complet :
#include <Arduino.h> #include <SoftwareSerial.h> #define RX_PIN D1 // Fil jaune #define TX_PIN D2 // Fil orange #define RESET_PIN D0 // Fil jaune #define PHONE_NUMBER "+336XXXXXXXXX" #define MESSAGE "Whoop whoop" SoftwareSerial a6Serial(RX_PIN, TX_PIN); String state = "initing"; void resetModule() { digitalWrite(RESET_PIN, HIGH); delay(200); digitalWrite(RESET_PIN, LOW); } void waitUntilReady() { Serial.println("En attente du réseau"); while(state == "initing" || state == "sms_mode") { if (a6Serial.available()) { String recievedA6 = a6Serial.readString(); Serial.println(recievedA6); if(state == "initing" && recievedA6.indexOf("+CREG: 5") >= 0) { Serial.println("Mode sms"); state = "sms_mode"; delay(2000); a6Serial.println("AT+CMGF=1"); } else if(state == "sms_mode" && recievedA6.indexOf("OK") >= 0) { state = "ready"; Serial.println("Tout est prêt!"); } } yield(); } } void sendSms(String number, String message) { if(state == "ready") { Serial.println("Sending \"" + message + "\" to " + number); a6Serial.print("AT+CMGS=\""); a6Serial.print(number); a6Serial.write(0x22); a6Serial.write(0x0D); // Retour chariot en hexadecimal a6Serial.write(0x0A); // Nouvelle ligne en hexadecimal delay(2000); a6Serial.print(message); delay(500); a6Serial.println(char(26));// Control-Z en hexadecimal } } void setup() { Serial.begin(9600); a6Serial.begin(115200); //le baudrate par défaut de l'A6 est 115200 delay(500); pinMode(RESET_PIN, OUTPUT); //Pour redémarrer le A6, ça nous permettra de mieux controller l'état du module resetModule(); //On redemarre le module waitUntilReady(); // On attend d'être connecté au réseau GSM } void loop() { if(Serial.available()) { String received = Serial.readString(); received.trim(); if(state == "ready") { if(received == "sendSms") { sendSms(PHONE_NUMBER, MESSAGE); } } } if (a6Serial.available()) { String recievedA6 = a6Serial.readString(); Serial.println("[A6] " + recievedA6); } }
Conclusion
Nous voila avec un petit module qui nous permet d’envoyer des sms, il ne reste plus qu’à en faire un objet connecté (enfin, encore plus connecté!)
Bertrand says:
Hello,
Merci pour ce tuto, très instructif.
Une question cependant: pourquoi alimentes-tu l’ensemble pas un module USB indépendant plutôt qu’avec le port USB de ton ESP8266 ?
Bonne journée,
Bertrand.
David Twigger says:
Hello! Merci pour ta question!
C’est vrai j’aurais pu… J’avoue que j’ai été un peu fainéant et que je n’ai pas vérifié si la broche 5V est relié directement au 5V du port USB sur les Wemos ou si ça passe par quelque chose comme un régulateur de tension avant et ça me permettait d’éviter d’avoir 2A qui traversent directement l’esp8266. La vérité c’est que j’avais le petit module micro USB sous la main et j’ai n’ai pas réfléchi plus que ça à la question 😉 Mais je regarderais ça dès que j’ai un peu de temps!
David Twigger says:
Re!
Alors si je lis bien le schéma du wemos D1 mini (ici), il y a un fusible et une diode entre les 5v du micro USB et la broche 5V, du coup j’imagine que le fusible risque de sauter si tu tires 2A dessus… Par contre avec mon approche on perd la protection du fusible et de la diode! Attention donc…