GSM-Modul SIM800L (Teil 2)

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 194
Registriert: Do 21. Okt 2010, 18:31

GSM-Modul SIM800L (Teil 2)

Beitrag von Heinrichs » Do 22. Mai 2025, 12:29

Dies ist die Fortsetzung meiner Reihe von Beiträgen zum SIM800L-Modul, vgl. GSM-Modul SIM800L (Teil 1)


3 TTGO sendet eine SMS mit SIM800L

Im Kapitel 2 meiner Reihe zum SIM800L-Modul habe ich dargestellt, wie man mithilfe eines Terminalprogramms wie HTerm eine SMS über das SIM800L-Modul versenden kann. Nun möchte ich zeigen, wie eine SMS von unserem TTGO verschickt werden kann. Dies kann man z. B. ausnutzen, um sich eine Alarm-SMS zukommen zu lassen, wenn z. B. eine Bewegung mit einem PIR-Bewegungsmelder registriert wird (s. dazu auch Kapitel 4).

Es ist auch recht einfach, den TTGO die benötigten AT-Commands (s.o.) an das SIM800L-Modul schicken zu lassen. Dazu benutzen wir eine Instanz der UART-Klasse:

Code: Alles auswählen

from machine import UART
uart1 = UART(1, baudrate = 56000, tx = 12, rx = 13)
Um ein Kommando an den SIM800L-Baustein zu übertragen, benutzen wir die Methode send_command:

Code: Alles auswählen

def send_command(uart, cmd):   # cmd ist vom Typ String, ohne \r 
    c = cmd + '\r'             # c ist Vom Typ String
    anzahl_der_gesendeten_zeichen = uart.write(c)
    print(anzahl_der_gesendeten_zeichen, 'Zeichen gesendet:', c)
Das AT-Kommando wird damit z. B. so gesendet:

Code: Alles auswählen

send_command(uart1, b‘AT’)
Deutlich komplexer ist die Aufgabe, die vom SIM800L gegebenen Antworten zu analysieren. Die Analysen sind erforderlich, weil diese anzeigen, wann und ob der SIM800L einen Befehl erfolgreich ausgeführt hat; erst dann ist es sinnvoll, die nächsten Schritte durchzuführen. Bei dieser Analyse durchsucht der TTGO nach jedem empfangenen Byte die bislang vorliegenden Byte-Folge nach einem signifikanten Suchwort, welche das Ende der Botschaft kennzeichnet. Bei dem AT-Kommando benutzen wir als Suchwort z. B. “OK\r\n”, bei dem Kommando AT+CPIN=”xxxx” wählen wir als Suchwort z. B. “SMS READY\r\n”.

Die folgende Funktion read_resonse durchsucht die vom SIM800L empfangene Antwort nach dem Suchwort (search_word). Wird diese innerhalb der Time-Out-Zeit (timeout in ms) gefunden, wird die empfangene Antwort zurückgegeben, ansonsten wird das Programm abgebrochen. Dafür benötigen wir zusätzlich die folgenden Importe (Die Methode ticks_ms liefert einen Zeitstempel in ms; mit ticks_diff bestimmt man den Zeitabstand zwischen zwei Zeitstempeln.):

Code: Alles auswählen

from time import sleep, ticks_ms, ticks_diff
from sys import exit

def read_response(uart, search_word, timeout):
    received = b''
    t0 = ticks_ms()
    while not (search_word in received):
        c = uart.read(1) # nur 1 Byte lesen
        if c != None:
            # print(c)
            received = received + c
            # print(received)
        t1 = ticks_ms()
        deltat = ticks_diff(t1, t0)
        if deltat > timeout:
            print('Timeout: Suchwort nicht in Anwort enthalten')
            print('Abbruch...')
            exit()
    return str(received, 'UTF-8')

Unser Programm führt die einzelnen Senden-Empfangen-Schritte im Prinzip genauso der Reihe nach durch, wie das im letzten Kapitel beschrieben worden ist. Es tauchen nur zwei Zusätze auf:

1. Nach dem einleitenden AT-Kommando senden wir (optional) noch ein ATZ-Kommando; dieses sorgt beim SIM800L-Baustein für einen RESET.

2. Wenn das SIM800L-Modul in einem vorangegangen erfolgreichen Programmdurchlauf noch im GSM-Netz eingeloggt ist, dann soll das Kommando AT+CPIN="xxxx" nicht ein weiteres Mal ausgeführt werden. Ob unser Modul noch eingeloggt ist, können wir mit dem Kommando

AT+CREG?

kontrollieren; ist das Modul eingeloggt, liefert es als Antwort +CREG 0,1, ansonsten +CREG 0,0.

Das gesamte Programm send_sms.py finden Sie im Anhang.


Bemerkung: In meinem Beitrag https://g-heinrichs.de/attiny/module/SIM800L.pdf habe ich ein Programm für den Attiny2313 vorgestellt, welches ganz ähnlich arbeitet. Allerdings war in diesem Fall die Empfangs-Prozedur deutlich aufwendiger, insbesondere die Suchwort-Suche: Diese wurde in einer Interrupt-Routine mithilfe eines Software-Ringspeichers durchgeführt.

.
Dateianhänge
SIM800L_Programme.zip
Programme zum SIM800L-Modul
(5.3 KiB) 11-mal heruntergeladen

Antworten