Passer au contenu principal

Communication SMS (envoi/réception)

Documentations

📁Code

Fonctionnement du module

Le module SIM communique à l’aide du protocole série avec notre Arduino.
https://fr.wikipedia.org/wiki/Transmission_s%C3%A9rie

Ce protocole est très usité dans les modules GSM (SIM), GPS (Ublox) et WiFi (ESP8266).

Il n’est pas le plus rapide (pour cela on passerait plutôt par le protocole SPI) mais n’utilise que deux broches (RX/TX) et peut fonctionner sur un ordinateur (avec un adaptateur FTDI).
https://www.aliexpress.com/item/32634246159.html

Voici une explication du code que j’ai crée (FONASMS), la gestion du module SIM est un peu complexe, c’est normal si tout n’est pas clair.
Le code n’est pas très bien optimisé, mais dans l’état il devrait fonctionner correctement.

Je tiens quand même à préciser que j’ai eu quelques soucis avec le module (déconnexion aléatoire corrigé par la reconnexion automatique, redémarrage...).
J’ai donc essayé au maximum dans le code de vérifier son état et de le reconnecter lorsque c’est nécessaire.

Je vais commencer par la partie la plus utile.

Le code est segmenté en 4 parties:

FONASMS.ino : Chaque étape de la connexion est listé ici
commands.h : C’est ici que l’on peut créer des actions quand un SMS est reçu
configuration.h : Configuration du module SIM et du numéro à envoyer un SMS lorsque le module est activé.
smsManager.h : c’est ici que la connexion, l’envoi des SMS et leur réception est gérée.

FONASMS.ino

La connexion est faite en 4 étapes.

Allumage du module

SMS_poweron();

Comme précisé ici: https://lastminuteengineers.com/sim900-gsm-shield-arduino-tutorial/

Il est possible d’allumer le module depuis l’Arduino, pour cela il faut souder le jumper R13.
Il est alors possible d’allumer le module avec la broche 9.
C’est un peu complexe à gérer sachant qu’il faut simuler l’appui sur le bouton pendant 2 secondes et qu’on ne peut donc pas savoir si on allume ou on éteint le module.

image-1629361365126.png

Connexion au module

Une fois le module allumé, on se connecte dessus, puis on lui demande d’afficher les SMS quand ils sont reçus.

Cette commande est répétée jusqu’à ce que le module soit véritablement connecté.

gsm_ok = SMS_connect();

 

Vérification de la connexion réseau

On vérifie si le module est correctement connecté, en lui envoyant une commande qui va vérifier si le module est bien enregistré sur le réseau.

registration_ok = SMS_Registration();

Envoi d’un SMS

On finit en envoyant un SMS au numéro défini dans configuration.h, afin de s’assurer que la connexion est bien fonctionnelle.
SMS_Send(FONA_CALLER, “Connected”)

Commands.h

C’est ici que tout se passe.
Dans la fonction commands, on reçoit le message et le numéro de l’appelant.
A partir de là on peut créer des actions selon les messages

Afin de montrer comment tout cela marche, j’ai fait diverses exemples basé sur un relai.

relay1on : Allume le relai 1 / envoi un SMS de réponse
relay1off : Eteint le relai 1 / envoi un SMS de réponse
ping : Répond pong
relay1state : Envoi l’état en mémoire du relai 1

Configuration.h

J’ai mis la configuration du programme ici

Il s’agit des branchements du module, du temps entre chaque vérification de la connexion, du baudrate du module et du numéro à appeler au démarrage.

J’ai aussi ajouté une variable au début pour passer du module SIM900/800 (2G) au SIM5230 (3G)  dans le cas où ce serait nécessaire.

smsManager.h

J’ai essayé de commenter au maximum, la façon dont la fonction SMS_read() extirpe le message et le numéro de l'appelant, mais c’est un peu complexe à expliquer.

J’ai ajouté un système qui va toutes les secondes vérifier si le réseau est toujours connecté, car dès fois il semble que la connexion soit perdue.

Jusque là ça a l’air de bien marcher.

Je me suis très largement basé sur cette exemple:
https://github.com/adafruit/Adafruit_FONA/blob/master/examples/FONA_SMS_Response/FONA_SMS_Response.ino