In der Hütte ist es kalt, und Sie möchten die Heizung einige Stunden vor Ihrer Ankunft einschalten, oder Sie sind besorgt über die Möglichkeit einer Notabschaltung des Heizungssystems eines Landhauses in Ihrer Abwesenheit. All diese Probleme können mit dem GSM-Modul gelöst werden, das SMS-Nachrichten senden und empfangen sowie darauf antworten und die erforderliche Last ein- und ausschalten kann. Theoretisch ist alles einfach, in der Praxis gibt es auf dem Weg zur Implementierung eines solchen Geräts viele Fallstricke.

Mein Plan war es, ein einfaches und billiges Gerät zu entwickeln, das mit zwei Temperatursensoren, einem Feuchtigkeitssensor, einem GSM-Modul sowie einem Halbleiterrelais und einer Steckdose zum Anschließen der Last ausgestattet ist. Was am Ende passiert ist, ist auf dem Foto zu sehen. Der Klimasensor BME280 wurde als Temperatur- und Feuchtigkeitssensor ausgewählt, sein Druckkanal wird nicht verwendet. Auf dem Foto sehen Sie es unter der transparenten Kappe links vom Hauptmodul. Diese Anordnung verringert die Auswirkung der Wärmeerzeugung innerhalb des Gehäuses auf die Sensorwerte. Als Kappe wird ein chinesisches Kunststoff-Reagenzglas mit zwei Belüftungslöchern verwendet. Der zweite Temperatursensor ist ferngesteuert und wird am DS18B20 hergestellt. Es befindet sich in einer Metallsonde, die über ein Kabel über eine normale Audiobuchse für Kopfhörer mit dem Gehäuse verbunden ist. Die Sonde dient zur direkten Messung der Temperatur des Heizungssystems. Das Hauptkörpervolumen wird von einem Halbleiterrelais (ich habe ein stärkeres gewählt) und einem Wandler von 220 V auf 5 V zur Stromversorgung des Stromkreises belegt. Die Steckdose zum Anschließen der Last ist an der Rückseite des Gehäuses angebracht, auf dem Foto ist sie nicht sichtbar. Ein auf dem SH1106-Controller basierendes OLED-Display zeigt die Sensorwerte an und zeigt auch an, ob die Last eingeschaltet ist. Zur Steuerung des gesamten Systems wird das Arduino Pro Mini-Modul in Version 3.3V 8MHz verwendet. Ich bin kein großer Fan dieser Plattform, aber die Fülle an Bibliotheken, einschließlich der sorgfältig von der Autorin betrunkenen, macht sie zur besten Wahl, wenn Sie schnell etwas Einfaches tun müssen.
Das SIM800L GSM-Modul ist in einem separaten Metallgehäuse untergebracht, um die Interferenzen zu verringern, die es für den Rest der Schaltung verursacht. Wie die Praxis gezeigt hat, wird die Störung dadurch nicht wesentlich verringert. Und radikal werden sie durch eine externe Antenne reduziert, die über ein abgeschirmtes Kabel mit dem Koaxialstecker verbunden ist. Auf dem Foto oben steht sie im Vordergrund. Aber darauf werden wir später noch näher eingehen.

Es wurden viele Artikel über die Verwendung von GSM-Modulen geschrieben, auch auf dem Hub. Daher werde ich Wiederholungen vermeiden und darüber sprechen, was ich in Veröffentlichungen zu diesem Thema nicht gesehen habe, nämlich wie man ein zuverlässiges Gerät basierend auf diesem Modul herstellt.
In den Garagen, die ich oft besuche, habe ich kürzlich am Eingang eine Schranke aufgestellt, die sich öffnet, wenn Sie eine bestimmte Nummer anrufen. Anscheinend wird es auf einem ähnlichen GSM-Modul hergestellt. Ich war überrascht, wie schwierig es ist, durch diese Nummer zu kommen, um sie zu öffnen. Jetzt kenne ich viele Gründe dafür. Dieses Wissen hat mich mehrere Monate an Experimenten gekostet und eine beeindruckende Menge Geld dafür ausgegeben. Ich hoffe, dass dieses Wissen jetzt jemand anderem dient. Überlegen Sie, worauf Sie achten müssen, und wechseln Sie von offensichtlichen Hardwareproblemen zu weniger offensichtlichen Softwareproblemen.
Das erste, was wichtig ist, ist das Einlegen einer SIM-Karte.
Mir schien klar, dass die SIM-Karte mit einer abgeschrägten Ecke nach vorne eingelegt ist. Seit einer Woche versuche ich zu verstehen, warum sich das Modul nicht im Netzwerk registrieren möchte, und beherrsche gleichzeitig Befehle im Terminal. Als Ergebnis fand ich in einem englischsprachigen Forum eine Erwähnung, dass Sie es mit einer abgeschrägten Ecke hinten einfügen müssen. Es ist seltsam, dass es im Allgemeinen sowohl so als auch so eingefügt wird.
Um gut zu arbeiten, muss man gut essen.
Die Leistungsanforderungen für das GSM-Modul sind sehr spezifisch. Es basiert auf einem Mikrochip für Mobiltelefone mit Druckknopf und kann direkt mit einer Lithiumbatterie betrieben werden. Daher sind 5 V viel für ihn und 3,3 V sind nicht genug. Darüber hinaus kann es im Übertragungsmodus bei maximaler Leistung Strom bis zu 2A verbrauchen. Wenn die Stromquelle nicht in der Lage ist, den erforderlichen Strom zu liefern, wird das GSM-Modul möglicherweise neu gestartet, wenn versucht wird, sich im Netzwerk zu registrieren, und der Neustart wird in einem endlosen Zyklus fortgesetzt. Spitzenverbrauchsperioden dauern normalerweise weniger als eine Sekunde, daher ist es verlockend, für Spitzenlastperioden einen Niedrigstromstabilisator mit Energiespeicher zu verwenden. Als solches Laufwerk können Sie eine Lithiumbatterie verwenden. Es ist wichtig sicherzustellen, dass es ausgeschaltet werden kann, und es ist wichtig, nicht zu vergessen, es zu verwenden. Andernfalls führt das Trennen des Geräts vom Netzwerk zu einer tiefen Entladung des Akkus und seiner irreversiblen Beschädigung. Eine andere Möglichkeit besteht darin, die Batterie durch einen Ionistor (Superkondensator) zu ersetzen. Er hat keine Angst vor einer tiefen Entladung. Er hat aber auch Probleme mit der Zuverlässigkeit. Eine Zelle des Ionistors ist normalerweise für eine Spannung von 2,5 bis 3 V ausgelegt. Ionistoren, die für eine höhere Spannung ausgelegt sind, bestehen aus mehreren Zellen (normalerweise 2). In diesem Fall kann das Spannungsungleichgewicht in den Zellen jedoch zu einem Zellausfall führen. Ein solches Ungleichgewicht wird leicht aufgrund des Unterschieds in der Zellenkapazität oder des Unterschieds im Leckstrom erhalten. Der Innenwiderstandsparameter des Ionistors sollte ebenfalls berücksichtigt werden. Ionistoren mit hohem Innenwiderstand bei hohen Strömen sind unbrauchbar, und Ionistoren mit niedrigem Widerstand sind nicht billiger als die Batterie. Nachdem mein Ionistor plötzlich aufgrund eines Ungleichgewichts der Zellen gestorben war, habe ich gerade einen Konverter von 220 V auf 5 V mit ausreichender Leistung angelegt. Um die Spannung auf das gewünschte GSM-Modul zu senken, habe ich eine reguläre Siliziumdiode zwischen den Wandler und das Modul gelegt. Bei einer solchen Diode fallen normalerweise 0,7 V ab, sodass das Modul die erforderlichen 4,3 V erhält. Nach der Diode ist es nützlich, einen Elektrolytkondensator mit großer Kapazität zu platzieren. Es gleicht Spannungseinbrüche aus, wenn der Sender plötzlich eingeschaltet wird.
Von der Sendeantenne fernhalten.
Selbst nachdem ich das GSM-Modul mit der erforderlichen Leistung versorgt hatte, trat das Neustart-Symptom regelmäßig auf, aber diesmal wurde das Arduino neu gestartet. Die Beobachtung seiner Leistung mit einem Oszilloskop zeigte, dass hier keine Leistung erforderlich ist. Anscheinend hat der Sender das Modul erstellt, da das Problem umso häufiger auftrat, je schlechter die Empfangsbedingungen des Basisstationssignals waren. Ein derart radikaler Effekt der Interferenz durch die Sendeantenne ist durchaus erklärbar, wenn wir uns daran erinnern, dass der Sender des Moduls in der Lage ist, 2 Watt an die Antenne zu liefern. Eine solche Kraft kann einen Milliliter Wasser in 5 Minuten kochen oder Ihr Ohr um einige Grad erwärmen. Um dieses Problem zu bekämpfen, wurden verschiedene Methoden ausprobiert. Zuerst habe ich eine externe Antenne angeschlossen, die sich außerhalb des Gehäuses befand und mit einem kurzen Koaxialkabel mit dem Modul verbunden war. Dies ergab jedoch nicht den erwarteten Effekt. Dann legte ich das Modul in ein separates Metallgehäuse, an dem die Antenne von außen befestigt war. Es wurde besser, aber nicht viel. Radikal verbessert die Situation nur das Entfernen der Antenne in einem bestimmten Abstand vom Gerät aufgrund seiner Verbindung mit einem Koaxialkabel von ausreichender Länge.
Warum dies geschieht, ist aus physikalischen Gründen leicht zu verstehen. Eine typische Antenne ist ein Viertelwellenstift, dh die Hälfte der Dipolantenne. Um jedoch ein elektrisches Feld zu erzeugen, reicht die Hälfte des Dipols nicht aus. Sie benötigen die zweite Hälfte. Dann erscheint ein elektrisches Feld zwischen den negativ und positiv geladenen Elementen der Antenne. Bei einer normalen Peitschenantenne ist die andere Hälfte entweder die Erdoberfläche oder der Instrumentenkörper oder eine spezielle leitfähige „Waage“. Für Vermarkter ist dies alles jedoch zu kompliziert, sodass wir normalerweise nur die Hälfte der normalen Antenne verkaufen. Wie arbeitet sie? Sehr einfach - die andere Hälfte ist das Kabel, an das die Antenne angeschlossen ist. Die Tatsache, dass es abgeschirmt ist, ändert nichts. Die äußere Oberfläche seines Geflechts spielt die Rolle der zweiten Hälfte der Dipolantenne. In diesem Fall können die in der Nachbarschaft verlaufenden Drähte leicht gestört werden, obwohl das Kabel abgeschirmt zu sein scheint. Wenn es zum Beispiel kein Kabel gibt, haben wir das Modul in einem Metallschirm versteckt, aus dem die Antenne herausragt? Wenn der Bildschirm groß ist (im Vergleich zur Wellenlänge), funktioniert er wie die zweite Hälfte des Emitters, und wenn er klein ist, emittieren die anderen Drähte, die an dieses Modul angeschlossen sind, egal welche. Die folgende Abbildung zeigt das Obige (die Vor- und Nachteile sind der Klarheit halber dargestellt, in Wirklichkeit ändert die Ladung der Antennenelemente das Vorzeichen mit der Trägerfrequenz).

Die 'rechte' Antenne ist links abgebildet, das Einführungskabel gibt keine Störungen ab. Das mittlere Bild zeigt die Antenne, die Sie normalerweise kaufen. Hier ist das Zuleitungskabel Teil des Emitters und stört Drähte, die in der Nähe verlaufen. Die Situation rechts zeigt, wann die Signalquelle in einem kompakten, abgeschirmten Gehäuse versteckt ist. Hier sind alle Drähte, die zu einem solchen Gehäuse gebracht werden, Teil des Emitters.
Die Moral ist, dass der einzige zuverlässige Weg, sich vor den durch die Sendeantenne verursachten Störungen zu schützen, darin besteht, sie vom Rest der Elektronik zu entfernen, indem Sie sie mit einem Koaxialkabel von ausreichender Länge verbinden. Wie lange ist ausreichend Es ist natürlich, den Abstand mit der Wellenlänge zu messen, in diesem Fall maximal 30 cm. Dies ist der minimale Abstand, um den die Antenne zugewiesen werden soll, aber je weiter desto besser.
Nicht alle seriellen Schnittstellen sind gleichermaßen nützlich.
In einfachen AVR-Mikrocontrollern, die normalerweise jeder verwendet, gibt es nur einen seriellen Hardware-Port, über den das Programm heruntergeladen wird. Daher ist die Software-Implementierung der seriellen Schnittstelle eine sehr beliebte Lösung. Ich werde eine Aussage beweisen, die viele unerwartet finden würden - für die Verwaltung des GSM-Moduls ist die Software-Implementierung der seriellen Schnittstelle überhaupt ungeeignet.
Das Wesentliche des Problems ist, dass die Software-Implementierung der seriellen Schnittstelle Unterbrechungen für die gesamte Zeit verbietet, in der das nächste Zeichen gesendet oder empfangen wird. Es scheint, dass dies schlecht ist, wie viele es tun. Beispielsweise verhindert die Implementierung des 1-Draht-Protokolls zum Lesen von Dallas Semiconductor-Thermometern auch Unterbrechungen während der Übertragung eines Bits, dh 65 Mikrosekunden. Das ist natürlich auch nicht so gut. Wenn das System über andere Interrupt-Handler verfügt, können diese keine Interrupt-Antwortzeit von weniger als diesen 65 Mikrosekunden bereitstellen. Wenn eine Interrupt-Anforderung eintrifft, wenn sie abgelehnt wird, wird sie erst verarbeitet, nachdem der Interrupt erneut behoben wurde. Beispielsweise verwendet eine serielle Hardware-Schnittstelle Interrupts, um das nächste empfangene Zeichen in den Empfängerpuffer zu legen. Wenn das nächste Zeichen eintrifft, bis der Interrupt des vorherigen verarbeitet ist, geht es verloren. Dies bedeutet, dass die serielle Hardware-Schnittstelle nicht mit einer Geschwindigkeit von mehr als 115200 Bit pro Sekunde arbeiten kann. Bei der Software-Implementierung der seriellen Schnittstelle ist alles schlechter. Für seinen Betrieb ist es notwendig, dass die Antwortzeit auf einen Interrupt kürzer als die Übertragungszeit von einem Bit ist. Dies begrenzt uns auf eine Geschwindigkeit von 9600 Bit pro Sekunde.
Ein schwerwiegenderes Problem besteht darin, dass die Software für die serielle Schnittstelle selbst Interrupts verhindert. Darüber hinaus ist die Zeit, für die sie verboten sind (die Zeit des Sendens oder Empfangens eines Zeichens), immer etwa zehnmal länger als die maximale Interrupt-Verarbeitungszeit, die für den korrekten Betrieb des Empfängers derselben seriellen Software-Schnittstelle erforderlich ist. Das heißt, es stört sich immer so stark, dass es gleichzeitig keine Daten empfangen und senden kann. In den meisten Fällen ist dies natürlich nicht erforderlich. In den meisten, aber nicht in unserem Fall mit dem GSM-Modul. Er kann unerwartet für uns von sich aus mit der Datenübertragung beginnen (z. B. beim Empfang einer SMS-Nachricht). Bei Verwendung einer Software-Implementierung der seriellen Schnittstelle kann dies leicht zu einem Ausfall des Kommunikationsprotokolls mit dem Modul führen. Daher habe ich nur die gleiche serielle Hardware-Schnittstelle sowohl für die Arduino-Programmierung als auch für die Kommunikation mit dem GSM-Modul verwendet. Natürlich unpraktisch, aber nur so kann ein zuverlässiges Gerät hergestellt werden.
Asynchrones Protokoll - Asynchroner Handler
Ein asynchrones Protokoll ist ein Protokoll, bei dem eine Seite des Austauschs beginnen kann, Informationen unerwartet an die andere Seite zu übertragen, dh ohne Synchronisation mit ihren Nachrichten. Dies ist genau das Kommunikationsprotokoll mit dem GSM-Modul. Es reagiert regelmäßig auf Anfragen vom Arduino, kann aber auch beginnen, etwas Eigenes zu senden, um beispielsweise über die empfangene SMS-Nachricht zu informieren. Und dies schafft ein echtes Problem, da keine der Bibliotheken, die ich für die Arbeit mit dem Modul für Arduino kenne, die Protokollasynchronität überhaupt berücksichtigt. Stellen Sie sich vor, Arduino hat einen Befehl an das Modul gesendet und gleichzeitig Informationen über die empfangene SMS-Nachricht übertragen. Diese Informationen werden akzeptiert, anstatt auf den Befehl zu antworten. Infolgedessen gibt die Bibliothek als Antwort auf den Befehl einen Fehler zurück (im besten Fall hängt alles im schlimmsten Fall), und die Nachricht über die empfangene SMS geht verloren.
Dies ist einfach zu beheben - Sie müssen nur Ihren eigenen asynchronen Protokollhandler schreiben. Ein asynchroner Handler stellt nur die erforderlichen Mindestanforderungen für Modulantworten auf seine Befehle. Infolgedessen antwortet das Modul auf jeden Befehl entweder mit OK oder mit FEHLER. Und das ist alles, was Sie brauchen, um die Antwort zu korrigieren. Alle anderen Zeilen, die vom Modul stammen, werden verarbeitet, unabhängig davon, ob sie als Antwort auf einen Befehl oder allein eingegangen sind. Die Bedeutung dieser Zeilen kann immer durch ihren Anfang bestimmt werden. Wenn die Zeile mit + CSQ beginnt, enthält sie Informationen zur Signalqualität. Wenn + CMT gestartet wird, handelt es sich um Informationen zur empfangenen SMS, die die Adresse des Absenders enthalten. Die erste Zeile wird als Teil der Antwort auf den Befehl AT + CSQ gesendet, und das zweite Modul wird von sich aus gesendet, aber für uns ist dieser Unterschied absolut unbedeutend. Das Modul sendet empfangene SMS-Nachrichten direkt an die serielle Schnittstelle. Dadurch wird vermieden, dass sie aus dem Speicher gelesen und anschließend gelöscht werden. Damit wir SMS-Nachrichten im allgemeinen Nachrichtenfluss des Moduls erkennen können, müssen sie mit dem Symbol # beginnen, andernfalls wird die Nachricht ignoriert.
Hier befindet sich eine vom Autor erstellte Bibliothek, die den obigen Ansatz implementiert.
Um Zeilen zu empfangen, die mit einer bestimmten Zeichenfolge beginnen, erstellt der Client ein spezielles Objekt - eine Falle. Er kann beliebig viele solcher Fallen erstellen. Die vom Modul empfangenen Zeilen außer OK, ERROR, die nicht in eine der Fallen gefallen sind, werden einfach ignoriert. Da eine solche Architektur keine vollständige Analyse der Modulantworten auf viele verschiedene Arten von Befehlen erfordert, ist der Bibliothekscode um ein Vielfaches kompakter als jede der mir bekannten Bibliotheken.
Was ist das Ergebnis?
Das Ergebnis ist ein Gerät, das in einem Gebiet mit geringer Abdeckung zuverlässig funktioniert, sogar besser als ein durchschnittliches Telefon. Unten finden Sie eine vollständige Übersicht.

Für Interessenten gibt es einen Link zum Github, wo Sie den Quellcode des Projekts und eine Beschreibung der Befehle finden, die in SMS-Nachrichten an das Gerät gesendet werden können.
github.com/olegv142/GsmMon