Raspberry Pi Pico W: Sensor-Daten per E-Mail senden

Wenn man mit einem Raspberry Pi Pico Sensor-Daten aufzeichnet, dann will man diese Daten in der Regel irgendwann aus dem System bekommen. Man muss also irgendwie eine Kommunikationsmöglichkeit oder Schnittstelle für die Datenausgabe vorsehen.

Die Möglichkeiten sind vielfältig und auch beliebig komplex. Die einfachste Variante wäre einfach eine E-Mail mit den Sensor-Daten zu schicken.

Damit eine E-Mail versendet werden kann, benötigen wir eine externe MicroPython-Bibliothek und die Zugangsdaten von einem vorhandenen E-Mail-Account.

SMTP-Bibliothek für MicroPython

MicroPython verfügt über keine eigenen Funktionen, um E-Mails zu versenden. Hierfür muss man auf eine externe MicroPython -Bibliothek zurückgreifen, mit der E-Mails per SMTP versendet werden können.
Das SMTP-Protokoll ist für die Übertragung von E-Mails vom SMTP-Client des Absenders zum SMTP-Server (Postausgang) und zwischen Mail-Servern zuständig.

Die einfachste Lösung zum Senden von E-Mails ist die Bibliothek µMail (MicroMail). Sie funktioniert mit den meisten Mail-Providern.

Die Bibliothek (Datei) muss heruntergeladen und auf dem Raspberry Pi Pico W mit dem Dateinamen umail.py gespeichert werden.

Hinweis zur sicheren Übertragung von E-Mails: Die Bibliothek „umail“ verwendet zum Senden der E-Mails an den SMTP-Server „STARTTLS“. Das heißt, die Übertragung der E-Mails erfolgt mit TLS und damit verschlüsselt.

Programmcode: E-Mails verschicken mit µMail (MicroMail)

Im folgenden Programmcode wird zuerst eine Verbindung mit einem WLAN hergestellt. Hierzu sind die Zugangsdaten korrekt einzutragen.

  • wlanSSID: Das ist der Name des WLANs zu dem eine Verbindung hergestellt werden soll.
  • wlanPW: Das ist das WLAN-Passwort von dem WLAN.

Desweiteren muss hier die SMTP-Login-Konfiguration hinterlegt werden, wie sie in jedem E-Mail-Client eingerichtet ist (smtpHost, smtpPort, fromName, fromMail, fromPW). Desweiteren muss die E-Mail-Adresse und ein Name angegeben werden, an die die E-Mail verschickt werden soll (toName, toMail). Das kann auch die eigene E-Mail-Adresse sein. Außerdem hat eine E-Mail typischerweise einen Betreff (Subject) und einen Text als Nachricht.

  • smtpHost: Das ist die Host-Adresse des SMTP-Servers. Es handelt sich in der Regel um einen Domain-Namen.
  • smtpPort: Portnummer auf dem SMTP-Server. In der Regel 587.
  • fromName: Hier wird der Name oder die Bezeichnung eingetragen, wem die E-Mail-Adresse gehört, von der die E-Mail verschickt werden soll.
  • fromMail: Die verwendete E-Mail-Adresse, von der die E-Mail verschickt werden soll.
  • fromPW: Zugehöriges Passwort der E-Mail-Adresse für die Authentifizierung gegenüber dem SMTP-Server.
  • toName: Name oder Bezeichnung des Empfängers der E-Mail.
  • toMail: E-Mail-Adresse, an die die E-Mail gesendet wird.
  • mailSubject: Betreffzeile der E-Mail. Kann im Verlauf des Programmcodes auch dynamisch erzeugt werden.
  • mailText: Text der E-Mail. Kann im Verlauf des Programmcodes auch dynamisch erzeugt werden.

Nach dem die WLAN-Verbindung hergestellt ist, wird in einer Endlos-Schleife alle 3 Minuten (180 Sekunden) die Temperatur mit dem internen Temperatursensor ermittelt und gespeichert. Nach 3 Durchgängen (insgesamt 9 Minuten) wird eine E-Mail mit den Daten verschickt.

# Bibliotheken laden
import machine
import network
import time
import umail

# WLAN-Konfiguration
wlanSSID = 'WLANNAME'
wlanPW = 'WLANPASSWORD'
network.country('DE')

# E-Mail-Konfiguration (Sender)
smtpHost = 'smtp-host'
smtpPort = 587
fromName = 'Name'
fromMail = 'E-Mail-Adresse'
fromPW = 'Passwort'

# E-Mail-Konfiguration (Empfänger)
toName = 'Name'
toMail = 'E-Mail-Adresse'

# E-Mail: Betreff und Text
mailSubject = 'E-Mail von Raspberry Pi Pico W'
mailText = "\n" + 'Diese E-Mail wurde von einem Raspberry Pi Pico W verschickt.'

# Status-LED für die WLAN-Verbindung
led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0)

# Initialisierung des Sensors
sensor_temp = machine.ADC(4)

# Funktion: Temperatur abrufen und umrechnen
def getTemp():
    read = sensor_temp.read_u16()
    spannung = read * 3.3 / (65535)
    temperatur = 27 - (spannung - 0.706) / 0.001721
    return str(temperatur)

# WLAN-Verbindung herstellen
wlan = network.WLAN(network.STA_IF)
if not wlan.isconnected():
    print('WLAN-Verbindung herstellen')
    wlan.active(True)
    wlan.connect(wlanSSID, wlanPW)
    for i in range(10):
        if wlan.status() < 0 or wlan.status() >= 3:
            break
        led_onboard.toggle()
        print('.')
        time.sleep(1)

# WLAN-Verbindung prüfen
if wlan.isconnected():
    print('WLAN-Verbindung hergestellt / WLAN-Status:', wlan.status())
    led_onboard.on()
    ipconfig = wlan.ifconfig()
    print('IPv4-Adresse:', ipconfig[0])
else:
    led_onboard.off()
    print('WLAN-Status:', wlan.status())
    raise RuntimeError('Keine WLAN-Verbindung')

# Wiederholung (Endlos-Schleife)
while True:
    # Variablen leeren
    tempLog = ()
    temp = ''
    # Alle 3 Minuten einen Sensor-Wert lesen und loggen
    for i in range(3):
        print('Sensor lesen')
        # Temperatur lesen und loggen
        tempLog += (getTemp(),)
        time.sleep(180)
    # Nach 9 Minuten eine E-Mail schicken
    c = len(tempLog)
    for i in range (c): temp += tempLog[i] + "\n"
    print('E-Mail senden')
    smtp = umail.SMTP(smtpHost, smtpPort)
    smtp.login(fromMail, fromPW)
    smtp.to(toMail)
    smtp.write('From: ' + fromName + ' <' + fromMail + '>' + "\r\n")
    smtp.write('To: ' + toName + ' <' + toMail + '>' + "\r\n")
    smtp.write('Subject: ' + mailSubject + "\r\n\r\n")
    smtp.write(temp + mailText + "\r\n")
    smtp.send()
    smtp.quit()

Hinweis: Um die Anzahl der E-Mails zu reduzieren kann man die Abstände der Sensorwert-Aufnahme verlängern und/oder die Anzahl der Durchgänge erhöhen.

Erweiterungen

Wenn die E-Mail zu einer bestimmten Uhrzeit gesendet werden soll, dann muss nach einer initialen WLAN-Verbindung die interne RTC gesetzt werden. Diese Uhrzeit kann über die WLAN-Verbindung von einem NTP-Server bezogen werden.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren