Le tout assemblé et branché

Envoyer des SMS avec un ESP8266 et un module A6

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 :

Wemos D1 mini

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 :

Schéma de câblage
Schéma de câblage

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 :

Perfboard - vue de dessus
Perfboard – vue de dessus
Perfboard - vue de dessous
Perfboard – vue de dessous (avec soudures déguelasses…)
Le tout assemblé et branché
Le tout assemblé et branché

Côté code:

Initialisation

Pour dialoguer avec notre module GSM, nous allons utiliser la communication série à travers la librairie standard SoftwareSerial:

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

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 :

Résultat de l'envoi d'un SMS
Résultat de l’envoi d’un SMS

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é!)