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)
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)
Code: Alles auswählen
send_command(uart1, b‘AT’)
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.
.