Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Datenlogging mit MicroPython und ESP32: Speichere Sensorwerte mit Zeitstempel auf eine SD-Karte

Posted on 3. Juli 20234. März 2025 by Stefan Draeger

Willkommen zurück auf meinem Technikblog! Heute dreht sich alles um die faszinierende Kombination von MicroPython und dem ESP32-Board. In diesem Artikel werde ich dir zeigen, wie du mithilfe von MicroPython und dem ESP32 Sensorwerte mit Zeitstempel auf einer SD-Karte speichern kannst. Dieses spannende Projekt wurde von einem Kommentar inspiriert, den ich vor Kurzem erhalten habe. Der Kommentator fragte, ob es möglich ist, die Ausgabe in eine Datei umzuleiten, einen Zeitstempel hinzuzufügen und das Programm in einer Endlosschleife auszuführen. Nun werde ich genau darauf eingehen und dir Schritt für Schritt zeigen, wie du diese Funktionen in dein MicroPython-Programm integrieren kannst. Lass uns loslegen!

Wie man einen Temperatursensor DS18B20 am ESP32 in Micropython programmiert, hatte ich dir ja bereits im Beitrag Programmieren mit MicroPython #6: digitaler Temperatursensor DS18B20 am ESP32 gezeigt, hier möchte ich nun daran anknüpfen.

Inhaltsverzeichnis

  • Varianten des Projektes
  • Benötigte Ressourcen für dieses Projekt
  • Aufbau der Schaltung
    • SD-Karten Modul für Micro SD-Karten
  • Erstellen des Programmes in der Thonny IDE
    • Schritt 1 – Auslesen des Temperatursensors DS18B20
    • Schritt 2 – Herstellen einer WiFi-Verbindung und auslesen eines Zeitstempels vom NTP-Server
    • Schritt 3 – Speichern der Sensordaten inkl. Zeitstempel auf der SD-Karte in einer CSV-Datei
  • Programm – schreiben der Daten vom Sensor DS18B20 mit einem Zeitstempel auf eine SD-Karte in MicroPython am ESP32
  • Abschluss
  • Quellen für den Beitrag

Varianten des Projektes

Dieses kleine Projekt kann in zwei Varianten umgesetzt werden. Zum einen mit einer RealTimeClock DS3231 und mit einem Zugriff auf einen NTP-Server im Internet. Beide Varianten haben Ihren Charm zunächst werde ich mich auf die Variante mit dem NTP-Server konzentrieren und dir ggf. noch einen weiteren Beitrag mit der RTC DS3231 veröffentlichen.

Benötigte Ressourcen für dieses Projekt

Wenn du die Schaltung und das Projekt nachbauen möchtest, dann benötigst du:

  • einen ESP32,
  • ein Micro-USB Datenkabel,
  • einen Temperatursensor DS18B20,
  • ein SD-Karten Modul, sowie eine passende SD-Karte
  • Breadboardkabel & ein 400 Pin Breadboard

Aufbau der Schaltung

Hier der Aufbau der Schaltung am ESP32.

Schaltung - ESP32 mit Temperatursensor DS18B20 & SD-Card Modul
Schaltung-ESP32_DS18B20_SD-Card

Aus der Schaltung können wir nun folgenden Anschlussplan entnehmen:

KomponenteESP32
SD-Card Modul
GNDGND
VCC3.3 V
MISOGP19
MOSIGP23
SCKGP18
CSGP2
DS18B20
Pin1GND
Pin2GP4, 4,7 kOhm Widerstand > 3.3 V
Pin33.3 V

SD-Karten Modul für Micro SD-Karten

Für diesen Beitrag verwende ich ein kleines SD-Karten Modul für Micro SD-Karten, es gibt aber auch Module für SD-Karten und somit kannst du auch deine ggf. alten Karten für dieses Projekt recyclen.

Varianten des SD-Card Modules für den Arduino, ESP32 & Raspberry Pi
Varianten des SD-Card Modules für den Arduino, ESP32 & Raspberry Pi
  • SD-Karten Modul auf ebay.de*,
  • Micro SD-Karten Modul auf ebay.de*

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Erstellen des Programmes in der Thonny IDE

Nachdem wir nun die Schaltung erstellt haben, können wir das Programm in Micropython in der Thonny IDE erstellen. Diese Entwicklungsumgebung kannst du dir kostenfrei unter https://thonny.org/ für macOS, Linux und Microsoft Windows herunterladen.

Schritt 1 – Auslesen des Temperatursensors DS18B20

Im ersten Schritt lesen wir die Temperatur des Sensors DS18B20 aus.

#Import der benötigten Module
from machine import Pin
from onewire import OneWire
from ds18x20 import DS18X20
from time import sleep

#der Temperatursensor DS18B20 ist am GPIO 4 angeschlossen
sensorPin = Pin(4)
sensor = DS18X20(OneWire(sensorPin))

#ermitteln der angeschlossenen Sensoren
roms = sensor.scan()
#ausgeben der Anzahl der Sensoren
print('gefundene Sensoren: ', len(roms))

#starten der Endlosschleife
while True:
  #
  sensor.convert_temp()
  #nach dem Aufruf der Funktion convert_temp()
  #muss man min. 750 Millisekunden warten
  sleep(0.750)
  #Schleife über die Sensoren
  for rom in roms:
    #auslesen des Sensorwertes
    #und runden auf max. 2 Nachkommastellen
    temp = round(sensor.read_temp(rom),2)
    #ausgeben des Wertes auf der seriellen Schnittelle
    #inkl. Grad Celsius
    print(str(temp), "°C", sep=" ")
  #Pause von 5 Sekunden einlegen
  sleep(5)

Wenn wir den Code ausführen, dann wird auf der seriellen Schnittstelle die Temperatur mit 2 Nachkommastellen ausgegeben.

Ausgabe der Daten des Temperatursensors auf der seriellen Schnittstelle
Ausgabe der Daten des Temperatursensors auf der seriellen Schnittstelle

Der Sensor DS18B20 hat eigentlich eine Genauigkeit von ±0,5 °C, somit können wir auch locker auf 1 Stelle nach dem Komma kürzen.

Schritt 2 – Herstellen einer WiFi-Verbindung und auslesen eines Zeitstempels vom NTP-Server

Im nächsten Schritt stellen wir nun eine Verbindung zum lokalen WiFi-Netzwerk her und lesen einen Zeitstempel vom NTP-Server.

#Import der benötigten Module
#für den Aufbau der WiFi-Verbindung
#und das laden des Zeitstempels von
#einem NTP-Server
import time
from time import sleep
import ntptime
import network

ssid = 'xyz'
password = '123456789'

#Starten des Netzwerkes im Station Mode
sta=network.WLAN(network.STA_IF)
sta.active(True)

def doConnect():
    #Wenn die Verbindung nicht erstellt wurde, dann...
    if not sta.isconnected():
        #Aufbau der WiFi-Verbindung mit den Daten
        sta.connect(ssid, password)
        #solange die Verbindung noch nicht hergestellt wurde
        #dann soll diese Schleife laufen
        while not sta.isconnected():
            pass
    #Wenn die WiFi-Verbindung erfolgreich aufgebaut wurde,
    #dann soll auf der seriellen Schnittstelle der Text ausgegeben werden
    print('Verbindung erfolgreich aufgebaut!')

def readTimestamp():
    #setzen der Zeit auf dem Mikrocontroller
    ntptime.settime()
    #auslesen der Zeit in ein Tupel
    timeTpl = time.gmtime()
    #Auslesen der Werte in einzelene Variablen
    print("Jahr", timeTpl[0])
    print("Monat", timeTpl[1])
    print("Tag", timeTpl[2])
    print("Stunde", timeTpl[3]+2)
    print("Minute", timeTpl[4])
    print("Sekunde", timeTpl[5])
    #Formatieren der Daten in ein deutsches Datum/Zeit Format
    timestamp = "{day}.{month}.{year} {hour}:{minute}:{seconds}".format(day = timeTpl[2], month = timeTpl[1], year = timeTpl[0], hour = timeTpl[3]+2, minute = timeTpl[4], seconds = timeTpl[5])
    #Ausgeben des Zeitstempels
    print(timestamp)
    #print("++++++++++++++++++++++++++++++++++++++++++")
    #eine Pause von 1 Sekunde einlegen
    sleep(1)

#starten der Endlosschleife
while True:
    try:
        #Wenn die WiFi-Verbindung abgebrochen ist, dann
        #soll diese wiederhergestellt werden
        if not sta.isconnected():
           doConnect()
        readTimestamp()
    except:
      print("Ein Fehler bei der Verarbeitung ist aufgetreten!")
    
    
    

Vom NTP-Server erhalten wir einen Zeitstempel, zu welchem wir noch zusätzlich 2 Stunden dazurechnen müssen (Zeitzone). Als Rückgabe beim Aufruf der Funktion time.gmttime() erhalten wir ein Tupel mit den Daten aus dem Zeitstempel.

Ausgabe eines Zeitstempels auf der seriellen Schnittstelle welcher vom NTP-Server geladen wurde
Ausgabe eines Zeitstempels auf der seriellen Schnittstelle, welcher
vom NTP-Server geladen wurde

Schritt 3 – Speichern der Sensordaten inkl. Zeitstempel auf der SD-Karte in einer CSV-Datei

Für den Zugriff auf die SD-Karte benötigen wir zusätzlich ein Python Modul sdcard.py welches wir vom GitHub Repository micropython/micropython-lib herunterladen können.

import machine, os, sdcard
import time
import ntptime
from machine import Pin, SPI
import network

from onewire import OneWire
from ds18x20 import DS18X20

#Dateiname für die CSV-Datei
outputFilename = 'ds18b20.csv'

#Zugangsdaten zum lokalen WiFi-Netzwerk
ssid = 'HOTSPOT'
password = '123456789'

#Zeit welche zwischen zwei Lesevorgängen
#vergehen muss in Sekunden.
sleepBetweenMeasurements = 5

#Starten des Netzwerkes im Station Mode
sta= network.WLAN(network.STA_IF)
sta.active(True)

#der Temperatursensor DS18B20 ist am GPIO 4 angeschlossen
sensorPin = Pin(4)
sensor = DS18X20(OneWire(sensorPin))
sensors = ()

#CS Pin mit GP2 als Ausgang 
cs = Pin(2, Pin.OUT)
#Initialisieren der SPI Kommunikation
spi = SPI(2, baudrate=1000000, polarity=0, phase=0, bits=8,
          firstbit=SPI.MSB, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
#Initialisieren des SD-Card Objektes mit
#der konfigurierten SPI Schnittstelle
sd = sdcard.SDCard(spi, cs)


def setup():
    global sensors
    #mounten / einbinden der SD-Karte
    os.mount(sd, '/sd')
    #einen Zugriffsversuch starten
    #sollte dieser misslingen so wird eine Exception geworfen
    os.listdir('/sd')
    
    #ermitteln der angeschlossenen Sensoren
    sensors = sensor.scan()
    #ausgeben der Anzahl der Sensoren
    print('gefundene DS18B20 Sensoren: ', len(sensors))
    
    #aufbauen der WiFi-Verbindung
    doConnect()
    

def writeLine(timestampValue, ds18b20Value):
    #öffnen der Datei ds18b20.csv mit dem Parameter "a"
    #für schreibzugriff mit anhängen (append) 
    file = open('/sd/'+outputFilename, 'a')
    #schreiben einer Zeile
    file.write("\"{timestamp}\";{value}\r\n".format(timestamp=timestampValue, value=ds18b20Value))
    #schließen der Datei
    file.close()

def doConnect():
    #Wenn die Verbindung nicht erstellt wurde, dann...
    if not sta.isconnected():
        print("Aufbau der WiFi-Verbindung zu ", ssid)
        #Aufbau der WiFi-Verbindung mit den Daten
        sta.connect(ssid, password)
        #solange die Verbindung noch nicht hergestellt wurde
        #dann soll diese Schleife laufen
        while not sta.isconnected():
            pass
    #Wenn die WiFi-Verbindung erfolgreich aufgebaut wurde,
    #dann soll auf der seriellen Schnittstelle der Text ausgegeben werden
    print("Verbindung erfolgreich zu {ssid} aufgebaut!".format(ssid=ssid))

def readTimestamp():
    #setzen der Zeit auf dem Mikrocontroller
    ntptime.settime()
    #auslesen der Zeit in ein Tupel
    timeTpl = time.gmtime()
    #Formatieren der Daten in ein deutsches Datum/Zeit Format
    return "{day}.{month}.{year} {hour}:{minute}:{seconds}".format(day = timeTpl[2], month = timeTpl[1], year = timeTpl[0], hour = timeTpl[3]+2, minute = timeTpl[4], seconds = timeTpl[5])
    
def readSensorValue():
    sensor.convert_temp()
    #nach dem Aufruf der Funktion convert_temp()
    #muss man min. 750 Millisekunden warten
    time.sleep(0.750)
    return round(sensor.read_temp(sensors[0]),2)
    

def main():
    #starten der Endlosschleife
    while True:
       #lesen des Zeitstempels vom NTP-Server
       timestampValue = readTimestamp()
       #lesen der Temperatur vom Sensor
       ds18b20Value = readSensorValue()
       #Ausgeben der Daten auf der seriellen Schnittstelle
       print("{timestamp} - {tempValue}".format(timestamp=timestampValue, tempValue=ds18b20Value))
       #Speichern der Daten in der CSV-Datei auf der SD-Karte
       writeLine(timestampValue, ds18b20Value)
       #eine kleine Pause einlegen
       time.sleep(sleepBetweenMeasurements)

setup()
main()

Das Programm erzeugt nun eine zusätzliche Zeile in der CSV-Datei auf der SD-Karte und gibt zusätzlich noch die Daten auf der seriellen Schnittstelle aus.

Ausgabe des fertigen Programms auf der seriellen Schnittstelle
Ausgabe des fertigen Programms auf der seriellen Schnittstelle

Programm – schreiben der Daten vom Sensor DS18B20 mit einem Zeitstempel auf eine SD-Karte in MicroPython am ESP32

Hier nun das fertige Programm zu Download als ZIP-Datei.

Programm für den ESP32 um Sensordaten mit einem Zeitstempel auf einer SD-Karte zu speicernHerunterladen

Abschluss

Herzlichen Glückwunsch! Du hast es geschafft, dein eigenes Datenlogging-Programm mit MicroPython und dem ESP32 zu entwickeln. Indem du Sensorwerte mit Zeitstempel auf einer SD-Karte speicherst, eröffnen sich viele Möglichkeiten für deine IoT-Projekte. Denk daran, dass Programmieren eine kontinuierliche Lernreise ist, und ich hoffe, dieser Artikel hat dir geholfen, wichtige Konzepte zu verstehen und deine Fähigkeiten weiterzuentwickeln.

Wenn du das vollständige Programm herunterladen möchtest, findest du den Link dazu im Artikel. Zögere nicht, es anzupassen und zu erweitern, um es an deine spezifischen Anforderungen anzupassen. Vergiss nicht, dass das Experimentieren und das Hinzufügen eigener Ideen ein wichtiger Teil des Lernprozesses ist.

Wenn du Fragen oder Feedback hast, hinterlasse gerne einen Kommentar unter dem Beitrag. Ich stehe dir jederzeit zur Verfügung, um dir weiterzuhelfen. Viel Spaß beim Programmieren und bleib neugierig!

Quellen für den Beitrag

Für diesen Beitrag habe ich mich aus der offiziellen Dokumentation zu Micropython bedient.

  • https://randomnerdtutorials.com/micropython-ds18b20-esp32-esp8266/
  • https://github.com/orgs/micropython/discussions/10760
  • https://www.coderdojotc.org/micropython/advanced-labs/09-micro-sd-card-reader/

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}