Il fait froid au chalet, et vous souhaitez allumer le chauffage quelques heures avant votre arrivée, ou vous êtes inquiet de la possibilité d'un arrêt d'urgence du système de chauffage d'une maison de campagne en votre absence. Tous ces problèmes peuvent être résolus à l'aide du module GSM, qui peut envoyer et recevoir des messages SMS et y répondre, en activant et désactivant la charge nécessaire. En théorie, tout est simple, en pratique, sur le chemin de la mise en place d'un tel appareil, il y a de nombreux écueils.

Mon plan était de créer un appareil simple et bon marché équipé de deux capteurs de température, un capteur d'humidité, un module GSM, ainsi qu'un relais à semi-conducteurs et une prise pour connecter la charge. Ce qui s'est passé à la fin peut être vu sur la photo. Le capteur climatique BME280 a été choisi comme capteur de température et d'humidité; son canal de pression n'est pas utilisé. Sur la photo, vous pouvez le voir sous le capuchon transparent à gauche du module principal. Cette disposition réduit l'effet de la génération de chaleur à l'intérieur du boîtier sur les lectures du capteur. Comme bouchon, un tube à essai en plastique chinois avec deux trous de ventilation est utilisé. Le deuxième capteur de température est distant, fabriqué sur le DS18B20. Il est situé à l'intérieur d'une sonde métallique, connectée au boîtier avec un câble via une prise audio standard pour casque. La sonde est conçue pour mesurer directement la température du système de chauffage. Le volume du corps principal est occupé par un relais à semi-conducteurs (j'ai choisi un plus puissant) et un convertisseur de 220V à 5V pour alimenter le circuit. La prise pour connecter la charge est montée à l'arrière du boîtier, sur la photo, elle n'est pas visible. Un écran OLED basé sur le contrôleur SH1106 affiche les lectures du capteur et indique également si la charge est activée. Pour contrôler l'ensemble du système, le module Arduino Pro Mini est utilisé en version 3.3V 8MHz. Je ne suis pas un grand fan de cette plate-forme, mais l'abondance de bibliothèques, notamment soigneusement bues par l'auteur, fait d'elle le meilleur choix lorsque vous devez rapidement faire quelque chose de simple.
Le module GSM SIM800L est logé dans un boîtier métallique séparé pour réduire les interférences qu'il crée avec le reste du circuit. Comme la pratique l'a montré, les interférences en résultant ne sont pas beaucoup réduites. Et radicalement elles sont réduites par une antenne externe reliée par un câble blindé au connecteur coaxial, sur la photo ci-dessus elle est au premier plan. Mais nous en parlerons plus en détail plus tard.

De nombreux articles ont été écrits sur l'utilisation des modules GSM, y compris sur le hub, donc j'éviterai les répétitions et parlerai de ce que je n'ai pas vu dans les publications sur ce sujet, à savoir comment fabriquer un appareil fiable basé sur ce module.
Dans les garages, où je visite souvent, j'ai récemment installé une barrière à l'entrée, qui s'ouvre lorsque vous appelez un certain numéro. Apparemment, il est réalisé sur un module GSM similaire. J'ai été surpris de voir combien il est difficile de passer à travers ce numéro pour l'ouvrir. Maintenant, je connais plusieurs raisons à cela. Cette connaissance m'a coûté plusieurs mois d'expériences et une somme impressionnante d'argent dépensée pour eux. J'espère que maintenant cette connaissance servira quelqu'un d'autre. Considérez à quoi il est important de faire attention, en passant de problèmes matériels évidents à des problèmes logiciels moins évidents.
La première chose importante à faire correctement est d'insérer une carte SIM.
Il me semblait évident que la carte SIM est insérée avec un coin biseauté vers l'avant. Depuis une semaine, j'essaie de comprendre pourquoi le module ne veut pas s'enregistrer sur le réseau, maîtrisant simultanément les commandes dans le terminal. En conséquence, sur un forum en anglais, j'ai trouvé une mention selon laquelle vous devez l'insérer avec un coin biseauté en arrière. Il est étrange qu'il soit généralement inséré dans les deux sens.
Pour bien travailler, il faut bien manger.
Les besoins en énergie du module GSM sont assez spécifiques. Il est fabriqué sur la base d'une puce conçue pour les téléphones portables à bouton-poussoir et est conçu pour être alimenté directement à partir d'une batterie au lithium. Par conséquent, 5V est beaucoup pour lui et 3,3V ne suffit pas. De plus, en mode transmission à puissance maximale, il est capable de consommer du courant jusqu'à 2A. Si la source d'alimentation n'est pas en mesure de fournir le courant requis, le module GSM peut redémarrer lors de la tentative d'enregistrement sur le réseau et continuer à redémarrer dans un cycle sans fin. Les périodes de pointe de consommation durent généralement moins d'une seconde, il est donc tentant d'utiliser un stabilisateur à faible courant avec stockage d'énergie pour les périodes de pointe. En tant que tel lecteur, vous pouvez utiliser une batterie au lithium. Dans le même temps, il est important d'assurer la possibilité de le déconnecter et il est important de ne pas oublier de l'utiliser, sinon la déconnexion de l'appareil du réseau entraînera une décharge profonde de la batterie et ses dommages permanents. Une autre option consiste à remplacer la batterie par un ionistor (supercondensateur). Il n'a pas peur d'une décharge profonde. Mais il a également des problèmes de fiabilité. Une cellule de l'ionistor est généralement conçue pour une tension de 2,5 à 3 V. Les ionistors conçus pour une tension plus élevée sont constitués de plusieurs cellules (généralement 2). Dans ce cas, cependant, le déséquilibre de tension dans les cellules peut entraîner une panne des cellules. Un tel déséquilibre est facilement obtenu en raison de la différence de capacité des cellules ou de la différence de courant de fuite. Le paramètre de résistance interne de l'ionistor doit également être pris en compte. Les ionistors à haute résistance interne à des courants élevés sont inutiles, et les ionistors à faible résistance ne sont pas moins chers que la batterie. Après que mon ionistor soit mort subitement à cause d'un déséquilibre des cellules, je viens d'appliquer un convertisseur de 220V à 5V de puissance suffisante. Afin d'abaisser la tension au module GSM souhaité, j'ai mis une diode au silicium régulière entre le convertisseur et le module. Sur une telle diode, 0,7 V tombe généralement, de sorte que le module obtient les 4,3 V nécessaires. Après la diode, il est utile de placer un condensateur électrolytique de grande capacité. Il atténuera les baisses de tension lorsque l'émetteur est brusquement allumé.
Éloignez-vous de l'antenne d'émission.
Même après avoir fourni au module GSM la puissance requise, le symptôme de redémarrage est apparu périodiquement, mais cette fois, l'Arduino a redémarré. L'observation de sa puissance à l'aide d'un oscilloscope a montré que la puissance n'est pas nécessaire ici. Apparemment, l'émetteur a créé le module, car le problème se posait le plus souvent avec les pires conditions de réception du signal de la station de base. Un tel effet radical d'interférence de l'antenne d'émission est tout à fait explicable si l'on rappelle que l'émetteur du module est capable de délivrer 2 watts à l'antenne. Une telle puissance peut faire bouillir un millilitre d'eau en 5 minutes ou chauffer votre oreille à quelques degrés. Pour lutter contre ce problème, différentes méthodes ont été essayées. Tout d'abord, j'ai connecté une antenne externe, qui était située à l'extérieur du boîtier et connectée au module avec un court câble coaxial. Cependant, cela n'a pas donné l'effet escompté. J'ai ensuite placé le module dans un boîtier métallique séparé, auquel l'antenne était fixée de l'extérieur. Ça s'est amélioré, mais pas beaucoup. Radicalement amélioré la situation que le retrait de l'antenne à une certaine distance de l'appareil grâce à sa connexion avec un câble coaxial de longueur suffisante.
Il est facile de comprendre pourquoi cela se produit à partir de considérations physiques. Une antenne typique est une broche quart d'onde, c'est-à-dire la moitié de l'antenne dipôle. Mais, pour créer un champ électrique, la moitié du dipôle ne suffit pas, vous avez besoin de la seconde moitié, puis un champ électrique apparaîtra entre les éléments chargés négativement et positivement de l'antenne. Pour une antenne fouet ordinaire, l'autre moitié est soit la surface de la terre, soit le corps de l'instrument, soit des «balances» conductrices spéciales. Mais pour les commerçants, tout cela est trop compliqué, donc nous ne vendons généralement que la moitié de l'antenne normale. Comment fonctionne-t-elle? Très simple - l'autre moitié est le câble auquel l'antenne est connectée. Le fait qu'il soit blindé ne change rien. La surface extérieure de sa tresse joue le rôle de la seconde moitié de l'antenne dipôle. Dans ce cas, des interférences sont facilement induites sur les fils passant dans le voisinage, malgré le fait que le câble semble être blindé. Eh bien, s'il n'y a pas de câble, par exemple, nous avons caché le module dans un écran métallique, d'où sort l'antenne? Si l'écran est grand (par rapport à la longueur d'onde), il fonctionne comme la seconde moitié de l'émetteur, et s'il est petit, les autres fils connectés à ce module émettent, peu importe lesquels. La figure suivante illustre ce qui précède (les avantages et les inconvénients sont présentés pour plus de clarté, en réalité, la charge des éléments d'antenne change de signe avec la fréquence porteuse).

L'antenne «droite» est représentée à gauche, son câble d'entrée n'émet pas d'interférences. L'image du milieu montre l'antenne que vous achetez habituellement. Ici, le câble d'entrée fait partie de l'émetteur et interfère avec les fils passant à proximité. La situation de droite montre quand la source du signal est cachée dans une enceinte blindée compacte. Ici, tous les fils apportés à un tel boîtier font partie de l'émetteur.
La morale est que le seul moyen fiable de se protéger des interférences causées par l'antenne d'émission est de l'éloigner du reste de l'électronique en la connectant avec un câble coaxial de longueur suffisante. Combien de temps est suffisant? Il est naturel de mesurer la distance avec la longueur d'onde, dans ce cas c'est un maximum de 30 cm, c'est la distance minimale par laquelle l'antenne doit être assignée, mais plus c'est loin, mieux c'est.
Tous les ports série ne sont pas également utiles.
Dans les microcontrôleurs AVR simples, que tout le monde utilise généralement, il n'y a qu'un seul port série matériel et il est utilisé pour télécharger le programme. Par conséquent, l'implémentation logicielle du port série est une solution très populaire. Je vais prouver une déclaration que beaucoup trouveraient inattendue - pour la gestion du module GSM, l’implémentation logicielle du port série ne convient pas du tout.
L'essence du problème est que la mise en œuvre logicielle du port série interdit les interruptions pendant tout le temps où le caractère suivant est transmis ou reçu. Il semblerait que ce soit mauvais, comme beaucoup le font. Par exemple, la mise en œuvre du protocole 1-Wire pour la lecture des thermomètres Dallas Semiconductor interdit également les interruptions lors de la transmission d'un bit, soit 65 microsecondes. Bien sûr, ce n'est pas trop bon non plus. Si le système a d'autres gestionnaires d'interruption, ils ne pourront pas fournir un temps de réponse d'interruption inférieur à ces 65 microsecondes. Si une demande d'interruption arrive alors qu'elle est refusée, elle ne sera traitée qu'après une nouvelle résolution de l'interruption. Par exemple, un port série matériel utilise des interruptions pour placer le prochain caractère reçu dans la mémoire tampon du récepteur. Si le personnage suivant arrive jusqu'à ce que l'interruption du précédent soit traitée, il sera perdu. Cela signifie que le port série matériel ne pourra pas fonctionner à une vitesse supérieure à 115200 bits par seconde. Dans le cas de l'implémentation logicielle du port série, tout est pire. Pour son fonctionnement, il est nécessaire que le temps de réponse à une interruption soit inférieur au temps de transmission d'un bit. Cela nous limite à une vitesse de 9600 bits par seconde.
Un problème plus grave est que le logiciel du port série lui-même interdit les interruptions. De plus, le temps pendant lequel il les interdit (le temps de transmission ou de réception d'un caractère) est toujours environ 10 fois plus long que le temps maximum de traitement d'interruption requis pour le bon fonctionnement du récepteur du même port série logiciel. Autrement dit, il interfère toujours avec lui-même à un point tel qu'il ne peut pas en même temps recevoir et envoyer des données. Bien sûr, dans la plupart des cas, cela n'est pas nécessaire. Dans la plupart des cas, mais pas dans notre cas avec le module GSM. Il peut, de manière inattendue pour nous, de sa propre initiative, commencer à transférer des données (par exemple, lors de la réception d'un SMS). Et dans le cas de l'utilisation d'une implémentation logicielle du port série, cela peut facilement conduire à une défaillance du protocole de communication avec le module. Par conséquent, je viens d'appliquer le même port série matériel à la fois pour la programmation Arduino et pour communiquer avec le module GSM. Inconvénient bien sûr, mais c'est le seul moyen de rendre un appareil fiable.
Protocole asynchrone - Gestionnaire asynchrone
Un protocole asynchrone est un protocole dans lequel un côté de l'échange peut commencer à transmettre des informations de manière inattendue à l'autre côté, c'est-à-dire sans aucune synchronisation avec ses messages. C'est exactement le protocole de communication avec le module GSM. Il répond régulièrement aux demandes de l'Arduino, mais il peut également commencer à transmettre quelque chose qui lui est propre, par exemple, pour informer sur le message SMS reçu. Et cela crée un vrai problème, car aucune des bibliothèques que je connais pour travailler avec le module pour Arduino ne prend en compte du tout l'asynchronie de protocole. Imaginez qu'Arduino a envoyé une commande au module, et que le module a en même temps transmis des informations sur le message SMS reçu. Ces informations seront acceptées au lieu de répondre à la commande. Par conséquent, la bibliothèque retournera une erreur en réponse à la commande (au mieux, tout «se bloquera» au pire) et le message sur le SMS reçu sera perdu.
C'est facile à résoudre - il vous suffit d'écrire votre propre gestionnaire de protocole asynchrone. Un gestionnaire asynchrone ne fait que les exigences minimales nécessaires pour les réponses du module à ses commandes. Par conséquent, le module répond soit OK, soit ERREUR à chaque commande. Et c'est tout ce qu'il faut pour corriger la réponse. Toutes les autres lignes provenant du module sont traitées, qu'elles soient venues en réponse à une commande ou par elles-mêmes. La signification de ces lignes peut toujours être déterminée par leur début. Si la ligne commence par + CSQ, elle contient des informations sur la qualité du signal. S'il démarre + CMT, il s'agit d'informations sur le SMS reçu et il contient l'adresse de l'expéditeur. La première ligne est envoyée dans le cadre de la réponse à la commande AT + CSQ, et le deuxième module est envoyé de sa propre initiative, mais pour nous, cette différence est absolument insignifiante. Le module envoie les messages SMS reçus directement au port série. Cela évite de les lire de la mémoire et de les supprimer ultérieurement. Pour que nous reconnaissions les messages SMS dans le flux de messages général du module, ils doivent commencer par le symbole #, sinon le message est ignoré.
Une bibliothèque créée par l'auteur qui implémente l'approche ci-dessus se trouve
ici .
Pour recevoir des lignes commençant par une certaine séquence de caractères, le client crée un objet spécial - un piège. Il peut créer n'importe quel nombre de ces pièges. Les lignes reçues du module, autres que OK, ERREUR, qui ne sont tombées dans aucun des pièges, sont simplement ignorées. Puisqu'une telle architecture ne nécessite pas une analyse complète des réponses des modules à de nombreux types de commandes différents, le code de la bibliothèque est beaucoup plus compact que toutes les bibliothèques que je connais.
Quel est le résultat?
Le résultat est un appareil qui fonctionne de manière fiable dans une zone à faible couverture, encore mieux que le téléphone moyen. En voici un aperçu complet.

Pour ceux qui sont intéressés, il y a un lien vers le github où vous trouverez le code source du projet et une description des commandes qui peuvent être envoyées à l'appareil dans des messages SMS.
github.com/olegv142/GsmMon