DIY CSV Datenlogger

Wie entwickelt sich die Temperatur im Tagesverlauf? Um diese Daten zuverlässig zu erfassen, bietet sich ein selbstgebauter Datenlogger auf Basis eines Mikrocontrollers an. In diesem Projekt wird ein DS18B20-Sensor zur Messung der Temperatur verwendet. Die erfassten Werte werden in regelmäßigen Abständen im CSV (Comma Separated Values) Format auf einer SD-Karte gespeichert und können anschließend ausgewertet werden.

Hardware

Um die Daten einfach speichern und im Anschluss an den Computer übertragen zu können, bietet sich eine SD-Karte an. Diese kann mittels der SPI-Schnittstelle angesteuert werden.

Mit folgender Hardware ist die Umsetzung, durch die Verwendung eines Shields, sehr einfach:

UNO Board (USB-C)

Datenlogger Shield

Sensor (z.B. DS18B20)

Widerstand 4,7kΩ (Widerstandssortiment)

 

Im Beispiel verwenden wir den DS18B20 Sensor. Dieser wird über die OneWire Schnittstelle angesteuert und ausgelesen. Sie können aber auch andere beliebige Sensoren verwenden.

Löten Sie den Sensor wie folgt auf das Shield:

Abbildung 1: Sensor auf dem Datenlogger Shield

Software

Sensor

Um mit dem Sensor zu kommunizieren werden folgende externe Bibliotheken benötigt:

OneWire von Paul Stoffregen

DallasTemperature von jmchippa

 

Diese können Sie über die angegebenen Links von GitHub als .zip heruntergeladen werden und in der Arduino IDE unter
Sketch > include Library > Add .zip Library …

 

ausgewählt und installiert werden.
Alternativ können Sie die Library auch über die integrierte Bibliotheksverwaltung installieren.

 

Um den Sensor und den oberen Aufbau zu testen, laden Sie folgendes Programm auf den Mikrocontroller:

#include <OneWire.h>
#
include <DallasTemperature.h>

#
define BUS_PIN 7

OneWire oneWire(BUS_PIN);

DallasTemperature sensor(&oneWire);

void setup(void) {
 
Serial.begin(9600);
  sensor.
begin();
}

void loop(void) {
  sensor.requestTemperatures();
 
delay(1500);
 
float tempC = sensor.getTempCByIndex(0);

 
if (tempC != DEVICE_DISCONNECTED_C) {
   
Serial.print("Temperature: ");
   
Serial.println(tempC);
  }
 
else {
   
Serial.println("Error: Could not read temperature data");
  }
}

Erklärung:

Zu Beginn des Programms werden die Objekte der Bibliotheksklassen erstellt. Das oneWire Objekt regelt die Kommunikation über die Schnittstelle. Das sensor Objekt sendet die genauen Befehle des Sensors über diese, mit einem Zeiger übergebene, Schnittstelle.

 

Das Programm können Sie hier herunterladen.

RTC

Auf dem Shield befindet sich ein Real Time Clock Modul (RTC). Dieses kann mittels der I2C Schnittstelle eingestellt und ausgelesen werden. Ist die Uhrzeit einmal konfiguriert, wird diese durch die kleine Batterie, auch ohne Stromversorgung des Mikrocontrollers, fortlaufend aktualisiert.

 

Um mit dem RTC-Modul zu kommunizieren wird folgende externe Bibliothek benötigt:

RTClib von Adafruit

 

Diese können Sie über die angegebenen Links von GitHub als .zip heruntergeladen werden und in der Arduino IDE unter
Sketch > include Library > Add .zip Library …

 

ausgewählt und installiert werden.
Alternativ können Sie die Library auch über die integrierte Bibliotheksverwaltung installieren.

Folgendes Programm kann zum einstellen der Uhrzeit und testen der Funktion verwendet werden:

 

#include "Wire.h"
#
include "RTClib.h"

RTC_DS1307 rtc;

void setup () {
 
Serial.begin(9600);

 
if (! rtc.begin()) {
   
Serial.println("Couldn't find RTC");
   
while (1) delay(10);
  }

 
if (! rtc.isrunning()) {
   
Serial.println("RTC is NOT running, let's set the time!");
   
// August 17, 2025  3:5:0 :
   
// rtc.adjust(DateTime(2025, 8, 17, 3, 5, 0));
  }

 
}

void loop () {
    DateTime now = rtc.now();

   
Serial.print(now.year(), DEC);
   
Serial.print('/');
   
Serial.print(now.month(), DEC);
   
Serial.print('/');
   
Serial.print(now.day(), DEC);

   
Serial.print(' ');

   
Serial.print(now.hour(), DEC);
   
Serial.print(':');
   
Serial.print(now.minute(), DEC);
   
Serial.print(':');
   
Serial.print(now.second(), DEC);
   
Serial.println();

   
delay(3000);
}

Erklärung:

Nach der üblichen Bibliotheksdatei Einbindung und der Erstellung des Objekts, folgt im setup() das Starten der Kommunikation mit dem RTC-Modul und im Anschluss optional das Einstellen der aktuellen Uhrzeit.
Um diese Uhrzeit einstellen zu können, entfernen Sie die Kommentierung und passen Sie die Uhrzeit an. Achten Sie darauf, dass diese Zeile im Anschluss wieder kommentiert ist, da sonst bei jedem Booten die Uhrzeit überschrieben wird.

Im loop() werden die Uhrzeit und das Datum über die serielle Schnittstelle ausgegeben.

 

Den Code können Sie hier herunterladen.

Ablauf Datenlogger

Abbildung 2: Ablaufdiagramm des Datenlogger Programms

Datenlogger Code

Laden Sie zum Schluss das vollständige Programm auf den Mikrocontroller:

#include <SPI.h>
#
include "Wire.h"
#
include <OneWire.h>
#
include <SD.h>
#
include <DallasTemperature.h>
#
include "RTClib.h"

const int CS_PIN_SD = 4; // SD Card Chip Select Pin
const char* BASE_FILENAME = "LOG"; // Base filename, e.g., LOG00.CSV
const char* FILE_EXTENSION = ".txt";

#
define ONE_WIRE_BUS 7

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
RTC_DS1307 rtc;

float temperatureAmbient = 0.0;

unsigned long lastLogTime = 0;
const unsigned long LOG_INTERVAL_MS = 2500;

char tempAStr[10];
char logFileName[13]; //  LOG00000.txt
char timeStr[6];

void createNewLogFile() {
 
for (int i = 0; i < 100000; i++) { // Max 99999 log files
    sprintf(logFileName,
"%s%05d%s", BASE_FILENAME, i, FILE_EXTENSION);
   
if (!SD.exists(logFileName)) {
     
File logFile = SD.open(logFileName, FILE_WRITE);
     
if (logFile) {
        logFile.
println("Header:");
        logFile.
close();
       
Serial.print("Created new log file: ");
       
Serial.println(logFileName);
      }
else {
       
Serial.println("Error creating new log file!");
      }
     
return;
    }
  }
 
Serial.println("Max log files reached!");
}

void setup() {
 
Serial.begin(9600);

  sensors.
begin();

 
pinMode(10, OUTPUT); // Required for SPI on UNO
 
if (!SD.begin(CS_PIN_SD)) {
   
Serial.println("SD Card Failed!");
   
while(1) {
    }

  }
else {
   
Serial.println("SD Card OK.");
   
  }

 
if (! rtc.begin()) {
   
Serial.println("Couldn't find RTC");
   
while (1) delay(10);
  }
 
if (! rtc.isrunning()) {
   
Serial.println("RTC is NOT running, let's set the time!");
   
// August 17, 2025  3:5:0 :
   
// rtc.adjust(DateTime(2025, 8, 17, 3, 5, 0));
  }
 
  createNewLogFile();
// Create a new log file on startup
}

void loop() {
 
unsigned long currentMillis = millis();

  sensors.requestTemperatures();
 
//delay(1500);
  temperatureAmbient = sensors.getTempCByIndex(
0);
  DateTime now = rtc.now();

 
Serial.println(temperatureAmbient);

  dtostrf(temperatureAmbient,
0, 1, tempAStr);
  sprintf(timeStr,
"%02d:%02d", now.hour(), now.minute());

 
// Log to SD Card
 
if (currentMillis - lastLogTime >= LOG_INTERVAL_MS) {
   
digitalWrite(3,HIGH);
    lastLogTime = currentMillis;

   
File logFile = SD.open(logFileName, FILE_WRITE);
   
if (logFile) {
      logFile.
print(currentMillis);
      logFile.
print(",");
      logFile.
print(now.timestamp());
      logFile.
print(",");
      logFile.
print(timeStr);
      logFile.
print(",");
      logFile.
print(tempAStr);
      logFile.
println();

      logFile.
close();
     
Serial.println("Data logged to SD.");
    }
else {
     
Serial.println("Error opening log file!");
    }
  }

 
delay(100);
 
}

Erklärung:

Im Vergleich zu den beiden vorherigen Programmen wurde lediglich die Ausgabe auf die SD-Karte ergänzt. Die Funktion createNewLogFile() legt dabei eine neue Datei an, deren Name automatisch fortlaufend nummeriert wird.

Datenauswertung

Nachdem Sie eine Messreihe erfolgreich mit dem Datenlogger aufgezeichnet haben, sollen die Werte jetzt in einem Tabellenkalkulationsprogramm grafisch dargestellt werden.
In diesem Tutorial wird LibreOffice Calc verwendet, da dieses Opensource und auf allen Betriebssystemen kostenlos erhältlich ist. Sämtliche andere Programme sind aber vom Ablauf und Bedienung ähnlich.

1. Kopieren Sie die .txt Datei, welche vom Datenlogger generiert wurde, von der SD-Karte auf die Festplatte ihres Computers. Klicken Sie danach mit der rechten Maustaste auf die Datei und wählen Sie "umbenennen", hier ändern Sie die Dateiendung von .txt auf .csv.

2. Öffnen Sie die csv Datei mit dem Tabellenkalkulationsprogramm. Hier öffnet sich ein Dialogfenster, in welchem Sie die Abtrennungssymbole auswählen können. Wählen Sie hier “Komma” und bestätigen Sie den Import, nach Überprüfung der Vorschau unten, mit OK.

Abbildung 3: Importfenster

 

3. Da der Mikrocontroller die Sensorwerte mit einem Punkt als Dezimaltrennzeichen ausgibt, das Programm jedoch ein Komma erwartet, müssen Sie dies nun ersetzen.
Öffnen Sie hierzu mit der Tastenkombination Strg+Alt+F das Suchen und Ersetzen Fenster. Hier können Sie alle Punkte durch Kommas ersetzen.

4. Wählen Sie nun die Spalte mit den Millisekunden und den Sensorwerten, durch gedrückthalten der Strg-Taste und Anklicken der Spaltenbezeichnung, aus und wählen Sie unter Einfügen, Diagramm…

5. In diesem Fenster können Sie jetzt den Diagrammtyp aus hier empfiehlt sich bei einem Sensorwert-Verlauf das XY(Streudiagramm)

Abbildung 4: Diagramm Fenster

 

Hier können Sie noch die Darstellungsart und den Linientyp einstellen.

 

Abbildung 5: Finales Diagramm mit Messwerten

 

Fazit

Der Datenlogger kann noch um einen Taster und eine LED erweitert werden, um Statusanzeigen und einfache Steuerfunktionen wie das Starten und Stoppen zu ermöglichen.
Einsatzmöglichkeiten bieten sich vor allem in der Umweltmessung, bei der Überwachung des Raumklimas oder in ähnlichen Szenarien bei welchen Sensorwerte aufgezeichnet werden müssen.
Mit den gezeigten Schritten haben Sie eine kostengünstige und flexible Grundlage kennengelernt, auf der sich eigene Projekte leicht aufbauen lassen.

 

Viel Spaß beim Nachbauen :)

 

Für arduinoProjekte für anfängerSensorenTemperatur

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery