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

Arduino Lektion 27: Daten loggen mit dem Logging Shield

Posted on 18. März 20173. Mai 2023 by Stefan Draeger

Das Data Logging Shield von „Deek-Robot“ wird mit einer RTC  (DS1307)geliefert und hat somit ein extra Fach für eine Knopfzelle (CR1220 – 3V). Des Weiteren besitzt dieses Shield ein Mini SD Karten Schacht.

Deek-Robot - Data logging board
Deek-Robot – Data logging board

Das Data logging Shield hat 8 Pins welche wie folgt belegt sind:

PINs vom Data logging board
PINs vom Data logging board
PINBeschreibung
 CSChip Select
 MOSIMaster Output, Slave Input
MISOMaster Input, Slave Output
SCKClock
SCLClock Line
SDAData
GNDGround
5VVersorgungsspannung

  • Der SD Card Slot
  • Das RTC Modul
    • Technische Daten
    • Anschluss am Arduino Nano
    • Quellcode
  • Technische Daten
  • Schaltplan
  • Quellcode
    • lesen von der SD Card
    • schreiben auf der SD Card
    • Beispiel 1 – Hallo Welt in CSV
    • Beispiel 2 – Temperaturwerte in CSV
      • Ausgabe in der CSV Datei
    • Beispiel 3 – Temperatur und Zeit in CSV Datei speichern
      • Ausgabe in der CSV Datei
    • Beispiel 4 – Temperatur und Zeit in CSV Datei speichern (mit Pufferbatterie)
  • Download

Der SD Card Slot

Der SD Card Slot ist für Micro SD Cards entworfen. Eine maximale Speicherkarten Größe konnte aus keiner Quelle gefunden werden, für die nachfolgenden Beispiele verwende ich eine 2 GB Speicherkarte welche im FAT32 Format formatiert wurde.

Micro SD Card
Micro SD Card

Das RTC Modul

Die Real Time Clock (DS1307) dient als Zeitgeber und kann durch den Einsatz einer Pufferbatterie (CR1220) die Zeit vorhalten. Somit kann nach einem eventuellen Stromausfall der Messvorgang mit der korrekten Uhrzeit fortgesetzt werden.

Technische Daten

  • Auflösung: Jahr, Monat, Tag, Stunden, Minuten
  • Schaltjahr kompensation
  • Kalender bis ins 2100 Jahr
  • 1Hz Frequenz

Anschluss am Arduino Nano

Die RTC wird wie folgt angeschlossen:

PIN – Data LoggerArduino Nano
 SDAA4
 SCLA5

Quellcode

Für die Programmierung des DS1307 RTC Moduls benötigt man folgende Bibliotheken (außer man möchte natürlich alles selber schreiben)…

  • Time Library
  • DS1307RTC Library

Nachdem die oben genannten Bibliotheken in der Arduino IDE eingebunden worden sind 2 Beispiele zum DS1307 vorhanden, einmal ReadTime und einmal SetTime. In dem Beispiel 3 dieses Tutorials habe ich dieses Modul implementiert. Durch die Time Bibliothek ist es möglich auch OHNE Batterie die korrekte Uhrzeit zu bekommen, dieses funktioniert jedoch, nur wenn der Arduino mit einem PC verbunden wurde.

Technische Daten

  • Betriebsspannung 5V
  • Abmaße 35 mm x 35 mm

Schaltplan

Data logger Shield am Arduino Nano
Data logger Shield am Arduino Nano
Data loggíng Shield am Arduino Nano
Data loggíng Shield am Arduino Nano
PIN – Data LoggerArduino Nano
 CSdigital D10
 MOSI digital D11
 MISOdigital D12
 SCKdigital D13
 GNDGND
 5V5V

Quellcode

#include <SD.h>   //SD Card Bibliothek
#include <SPI.h>  //Bibliothek zum zugriff auf die SPI Schnittstelle des Arduinos

File outFile; // Die Datei welche geschrieben bzw. gelesen werden soll
int pinCS = 53; // Chip Select Pin 10 auf dem Arduino Uno
String filename = "test.txt"; //Dateiname der zu lesenden bzw. schreibenden Datei

void setup() {
  Serial.begin(9600); //Serielle Kommunikation mit 9600 Baud beginnen
  pinMode(pinCS, OUTPUT);
  if (SD.begin()){ //Wenn die SD Card initialisiert werden konnte dann....
    Serial.println("SD Karte konnte erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  } else {
    //Dieser Block wird ausgeführt wenn die SD Card nicht initialisiert werden konnte.
    Serial.println("SD Karte konnte NICHT erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    Serial.println("---Programm wird beendet!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    return; //vorzeitiges beenden der setup Methode
  }
}

lesen von der SD Card

void readContent(){
  outFile = SD.open(filename); //Öffnet bzw. erzeugt die Datei (im nur lese Modus)
  if (outFile) { //Wenn die Datei existiert dann...
    Serial.println("Lese Daten:"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    // Sollange Text in der Datei enthalten ist...
    while (outFile.available()) {
      Serial.write(outFile.read()); //Ausgabe des Textes auf der Seriellen Schnittstelle
    }
    outFile.close();//Schließen der Datei
  } else {
    //Dieser Block wird ausgeführt wenn die Datei nicht gelesen werden konnte.
    Serial.println("Fehler beim öffnen der Datei test.txt"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  }
}

schreiben auf der SD Card

void writeContent(){
  outFile = SD.open(filename, FILE_WRITE); //Öffnet bzw. erzeugt die Datei im Modus schreibend
  if (outFile) { //Wenn die Datei existiert dann...
    Serial.println("Schreiben von Daten..."); //Ausgabe des Textes auf der Seriellen Schnittstelle
    outFile.println("Hallo Welt!"); //Schreiben der Zeile in die Textdatei
    outFile.close(); //Schließen der Datei (Dieses ist wichtig da sonst beim beenden des Sketches dies Daten verloren gehen können.)
    Serial.println("Fertig!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  } else {
    //Dieser Block wird ausgeführt wenn die Datei nicht erzeugt werden konnte.
    Serial.println("Fehler beim öffnen der Datei test.txt"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  }
}

Beispiel 1 – Hallo Welt in CSV

#include <SD.h>   //SD Card Bibliothek
#include <SPI.h>  //Bibliothek zum zugriff auf die SPI Schnittstelle des Arduinos

File outFile; // Die Datei welche geschrieben bzw. gelesen werden soll
int pinCS = 53; // Chip Select Pin 10 auf dem Arduino Uno
String filename = "test.txt"; //Dateiname der zu lesenden bzw. schreibenden Datei

void setup() {
  Serial.begin(9600); //Serielle Kommunikation mit 9600 Baud beginnen
  pinMode(pinCS, OUTPUT);
  if (SD.begin()){ //Wenn die SD Card initialisiert werden konnte dann....
    Serial.println("SD Karte konnte erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  } else {
    //Dieser Block wird ausgeführt wenn die SD Card nicht initialisiert werden konnte.
    Serial.println("SD Karte konnte NICHT erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    Serial.println("---Programm wird beendet!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    return; //vorzeitiges beenden der setup Methode
  }

  writeContent();
  readContent();
}

void writeContent(){
  outFile = SD.open(filename, FILE_WRITE); //Öffnet bzw. erzeugt die Datei im Modus schreibend
  if (outFile) { //Wenn die Datei existiert dann...
    Serial.println("Schreiben von Daten..."); //Ausgabe des Textes auf der Seriellen Schnittstelle
    outFile.println("Hallo Welt!"); //Schreiben der Zeile in die Textdatei
    outFile.close(); //Schließen der Datei (Dieses ist wichtig da sonst beim beenden des Sketches dies Daten verloren gehen können.)
    Serial.println("Fertig!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  } else {
    //Dieser Block wird ausgeführt wenn die Datei nicht erzeugt werden konnte.
    Serial.println("Fehler beim öffnen der Datei test.txt"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  }
}

void readContent(){
  outFile = SD.open(filename); //Öffnet bzw. erzeugt die Datei (im nur lese Modus)
  if (outFile) { //Wenn die Datei existiert dann...
    Serial.println("Lese Daten:"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    // Solange Text in der Datei enthalten ist...
    while (outFile.available()) {
      Serial.write(outFile.read()); //Ausgabe des Textes auf der Seriellen Schnittstelle
    }
    outFile.close();//Schließen der Datei
  } else {
    //Dieser Block wird ausgeführt wenn die Datei nicht gelesen werden konnte.
    Serial.println("Fehler beim öffnen der Datei test.txt"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  }
}

void loop() {
  // Leere Methode die gesamte Logik wird im Setup erledigt
}

Beispiel 2 – Temperaturwerte in CSV

In diesem Beispiel möchte ich eine Temperatur messen und diese in eine CSV Datei schreiben. Als Sensor verwende ich den Temperatursensor LM35.

#include <SD.h>   //SD Card Bibliothek
#include <SPI.h>  //Bibliothek zum zugriff auf die SPI Schnittstelle des Arduinos

File outFile; // Die Datei welche geschrieben bzw. gelesen werden soll
int pinCS = 53; // Chip Select Pin 10 auf dem Arduino Uno
String filename = "temp.txt"; //Dateiname der zu lesenden bzw. schreibenden Datei

int val;   
int dat;  

int temperatursensorPin = 0 ;// Bestimmen das der Temperatursensor LM35 an den analogen PIN 0 angeschlossen ist.

int index = 0;

void setup() {
  Serial.begin(9600); //Serielle Kommunikation mit 9600 Baud beginnen
  pinMode(pinCS, OUTPUT);
  if (SD.begin()){ //Wenn die SD Card initialisiert werden konnte dann....
    Serial.println("SD Karte konnte erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  } else {
    //Dieser Block wird ausgeführt wenn die SD Card nicht initialisiert werden konnte.
    Serial.println("SD Karte konnte NICHT erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    Serial.println("---Programm wird beendet!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    return; //vorzeitiges beenden der setup Methode
  }
}

void writeContent(int temp){
  outFile = SD.open(filename, FILE_WRITE); //Öffnet bzw. erzeugt die Datei im Modus schreibend
  if (outFile) { //Wenn die Datei existiert dann...
    outFile.print(++index);
    outFile.print(",");
    outFile.print(temp);
    outFile.println("");
    outFile.close(); //Schließen der Datei (Dieses ist wichtig da sonst beim beenden des Sketches dies Daten verloren gehen können.)
  } else {
    //Dieser Block wird ausgeführt wenn die Datei nicht erzeugt werden konnte.
    Serial.println("Fehler beim öffnen der Datei test.txt"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  }
}

int readTemperatur(){
  val = analogRead(temperatursensorPin); // Den analogen Wert des Temperatursensors lesen.
  dat = (125*val)>>8 ; // Aus dem gelesenen Wert die Temperatur berechnen.
  return dat;  // Temperatur zurück gegeben
}

void loop() {
  int temperatur = readTemperatur();
  writeContent(temperatur);
  delay(2000);
}

Ausgabe in der CSV Datei

1,21
1,22
2,21
3,21
4,21
5,21
6,21
7,21
8,21
9,21
10,21
11,21
12,21
.....

Beispiel 3 – Temperatur und Zeit in CSV Datei speichern

Da ich noch keine Batterie für das RTC Modul gefunden habe, lese ich beim Starten des Sketches die Zeit vom Kompilieren ein, dieses ist nicht auf die Sekunde genau, da der Schritt des Hochladens des Sketches noch ein paar Sekunden benötigt. Aber für dieses Beispiel ist es ausreichend. Im Beispiel 4 werde ich das ganze erneut mit einer Batterie darstellen.

Für das nachfolgende Beispiel wird unter anderem die Bibliothek TimeLib.h benötigt, diese kann man vom GitHub Repository von PaulStoffregen herunterladen werden.

#include <SD.h>   //SD Card Bibliothek
#include <SPI.h>  //Bibliothek zum zugriff auf die SPI Schnittstelle des Arduinos
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

File outFile; // Die Datei welche geschrieben bzw. gelesen werden soll
int pinCS = 53; // Chip Select Pin 10 auf dem Arduino Uno
String filename = "temptime.txt"; //Dateiname der zu lesenden bzw. schreibenden Datei

int val;   
int dat;  

int temperatursensorPin = 0 ;// Bestimmen das der Temperatursensor LM35 an den analogen PIN 0 angeschlossen ist.

int index = 0;

const char *monthName[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
tmElements_t tm;

void setup() {
  Serial.begin(9600); //Serielle Kommunikation mit 9600 Baud beginnen
  pinMode(pinCS, OUTPUT);
  if (SD.begin()){ //Wenn die SD Card initialisiert werden konnte dann....
    Serial.println("SD Karte konnte erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    configureDS1307(); //Konfigurieren des RTC DS1307 Moduls
  } else {
    //Dieser Block wird ausgeführt wenn die SD Card nicht initialisiert werden konnte.
    Serial.println("SD Karte konnte NICHT erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    Serial.println("---Programm wird beendet!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    return; //vorzeitiges beenden der setup Methode
  }
}

//Diese Methode wird nur benötigt wenn KEINE Batterie eingelegt ist.
void configureDS1307(){ 
  //Von der Kompilierungszeit das Datum und die Uhrzeit auslesen
  if (getDate(__DATE__) && getTime(__TIME__)) {
    //Die gelesenen Werte auf die RTC schreiben
    RTC.write(tm);
  }
}

String getTimestamp(){ 
  tmElements_t tm;
  String timestamp = "-error-"; //Meldung wenn die Zeit nicht gelesen werden konnte.
  if (RTC.read(tm)) { //Lesen der aktuellen Zeit
    timestamp = "";
    timestamp += get2digits(tm.Day); //Tag
    timestamp += ".";
    timestamp += get2digits(tm.Month); //Monat
    timestamp += ".";
    timestamp += get2digits(tmYearToCalendar(tm.Year)); //Jahr
    timestamp += " ";
    timestamp += get2digits(tm.Hour); //Stunde
    timestamp += ":";
    timestamp += get2digits(tm.Minute); //Minute
    timestamp += ":";
    timestamp += get2digits(tm.Second); //Sekunde
  }
  delay(1000);
  Serial.println(timestamp);
  return timestamp;
}

//Die Funktion liefert einen String Wert zurück welcher bei Zahlen < 10 mit führender Null beginnt.
String get2digits(int number) {
  String val = "";
  if (number >= 0 && number < 10) {
    val += "0";
  }
  val += String(number);
return val;
}


//Parsen der Uhrzeit
bool getTime(const char *str){
  int Hour, Min, Sec;
  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

//Parsen des Datums
bool getDate(const char *str){
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

void writeContent(int temp){
  outFile = SD.open(filename, FILE_WRITE); //Öffnet bzw. erzeugt die Datei im Modus schreibend
  if (outFile) { //Wenn die Datei existiert dann...
    outFile.print(++index);
    outFile.print(",");
    outFile.print(temp);
    outFile.print(",");
    outFile.print(getTimestamp());   
    outFile.println("");
    outFile.close(); //Schließen der Datei (Dieses ist wichtig da sonst beim beenden des Sketches dies Daten verloren gehen können.)
  } else {
    //Dieser Block wird ausgeführt wenn die Datei nicht erzeugt werden konnte.
    Serial.println("Fehler beim öffnen der Datei test.txt"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  }
}

int readTemperatur(){
  val = analogRead(temperatursensorPin); // Den analogen Wert des Temperatursensors lesen.
  dat = (125*val)>>8 ; // Aus dem gelesenen Wert die Temperatur berechnen.
  return dat;  // Temperatur zurück gegeben
}

void loop() {
  int temperatur = readTemperatur();
  writeContent(temperatur);
  delay(2000);
}

Ausgabe in der CSV Datei

1,21,13:31:55 01.04.2017
2,21,13:31:58 01.04.2017
3,21,13:32:01 01.04.2017
4,21,13:32:04 01.04.2017
5,21,13:32:07 01.04.2017
6,21,13:32:10 01.04.2017
7,21,13:32:13 01.04.2017
8,21,13:32:16 01.04.2017
9,21,13:32:19 01.04.2017

Beispiel 4 – Temperatur und Zeit in CSV Datei speichern (mit Pufferbatterie)

Nachdem nun die Pufferbatterie erschienen ist, kann ich den Quellcode folgendermaßen anpassen:

  • es entfällt die Funktion configureDS1307();
  • es entfällt die Funktion getTime(); & getDate();

Bevor jedoch der Sketch hochgeladen werden kann, muss zuerst das Datum und die Uhrzeit geschrieben werden. Dazu öffnet man das Beispielsketch „SetTime“ aus der Bibliothek „DS1307RTC“ und lädt dieses einmalig auf den Arduino im seriellen Monitor sollte man nach dem erfolgreichen Kompilieren und Hochladen dann einen Zeitstempel sehen.

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
  bool parse=false;
  bool config=false;

  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }

  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
}

void loop() {
}

bool getTime(const char *str)
{
  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

Als Nächstes kann nun der Sketch zum Schreiben der Temperaturwerte hochgeladen werden. Die Uhrzeit geht dabei nicht verloren und wird durch die Pufferbatterie aufrechterhalten / gespeichert.

#include <SD.h>   //SD Card Bibliothek
#include <SPI.h>  //Bibliothek zum zugriff auf die SPI Schnittstelle des Arduinos
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

File outFile; // Die Datei welche geschrieben bzw. gelesen werden soll
int pinCS = 53; // Chip Select Pin 10 auf dem Arduino Uno
String filename = "temptime.txt"; //Dateiname der zu lesenden bzw. schreibenden Datei

int val;   
int dat;  

int temperatursensorPin = 0 ;// Bestimmen das der Temperatursensor LM35 an den analogen PIN 0 angeschlossen ist.

int index = 0;

const char *monthName[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
tmElements_t tm;

void setup() {
  Serial.begin(9600); //Serielle Kommunikation mit 9600 Baud beginnen
  pinMode(pinCS, OUTPUT);
  if (SD.begin()){ //Wenn die SD Card initialisiert werden konnte dann....
    Serial.println("SD Karte konnte erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
   // configureDS1307(); //Konfigurieren des RTC DS1307 Moduls
  } else {
    //Dieser Block wird ausgeführt wenn die SD Card nicht initialisiert werden konnte.
    Serial.println("SD Karte konnte NICHT erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    Serial.println("---Programm wird beendet!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
    return; //vorzeitiges beenden der setup Methode
  }
}

//Diese Methode wird nur benötigt wenn KEINE Batterie eingelegt ist.
void configureDS1307(){ 
  //Von der Kompilierungszeit das Datum und die Uhrzeit auslesen
  if (getDate(__DATE__) && getTime(__TIME__)) {
    //Die gelesenen Werte auf die RTC schreiben
    RTC.write(tm);
  }
}

String getTimestamp(){ 
  tmElements_t tm;
  String timestamp = "-error-"; //Meldung wenn die Zeit nicht gelesen werden konnte.
  if (RTC.read(tm)) { //Lesen der aktuellen Zeit
    timestamp = "";
     timestamp += get2digits(tm.Day); //Tag
    timestamp += ".";
    timestamp += get2digits(tm.Month); //Monat
    timestamp += ".";
    timestamp += get2digits(tmYearToCalendar(tm.Year)); //Jahr
    timestamp += " ";
    timestamp += get2digits(tm.Hour); //Stunde
    timestamp += ":";
    timestamp += get2digits(tm.Minute); //Minute
    timestamp += ":";
    timestamp += get2digits(tm.Second); //Sekunde
  }
  delay(1000);
  Serial.println(timestamp);
  return timestamp;
}

//Die Funktion liefert einen String Wert zurück welcher bei Zahlen < 10 mit führender Null beginnt.
String get2digits(int number) {
  String val = "";
  if (number >= 0 && number < 10) {
    val += "0";
  }
  val += String(number);
return val;
}


//Parsen der Uhrzeit
bool getTime(const char *str)
{
  int Hour, Min, Sec;
  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

//Parsen des Datums
bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

void writeContent(int temp){
  outFile = SD.open(filename, FILE_WRITE); //Öffnet bzw. erzeugt die Datei im Modus schreibend
  if (outFile) { //Wenn die Datei existiert dann...
    outFile.print(++index);
    outFile.print(",");
    outFile.print(temp);
    outFile.print(",");
    outFile.print(getTimestamp());   
    outFile.println("");
    outFile.close(); //Schließen der Datei (Dieses ist wichtig da sonst beim beenden des Sketches dies Daten verloren gehen können.)
  } else {
    //Dieser Block wird ausgeführt wenn die Datei nicht erzeugt werden konnte.
    Serial.println("Fehler beim öffnen der Datei test.txt"); //Ausgabe des Textes auf der Seriellen Schnittstelle
  }
}

int readTemperatur(){
  val = analogRead(temperatursensorPin); // Den analogen Wert des Temperatursensors lesen.
  dat = (125*val)>>8 ; // Aus dem gelesenen Wert die Temperatur berechnen.
  return dat;  // Temperatur zurück gegeben
}

void loop() {
  int temperatur = readTemperatur();
  writeContent(temperatur);
  delay(2000);
}

Download

Daten loggen – simpleHerunterladen
Daten loggen – Temperatur (LM35)Herunterladen
Daten loggen – Temperatur (LM35) & ZeitHerunterladen
Daten loggen – Temperatur (LM35) & Zeit & PufferbatterieHerunterladen

15 thoughts on “Arduino Lektion 27: Daten loggen mit dem Logging Shield”

  1. Roman sagt:
    27. Juli 2018 um 09:44 Uhr

    Guten Tag Herr Draeger

    Ich wollte ihr Datenlogger mit Pufferbatterie nachbauen.
    Ich habe exakt dieselben Komponenten wie Sie.
    Jedoch bekomme ich eine Fehlermeldung beim beschreiben der Zeit.

    „DS1307 Communication Error :-{ Please check your circuitry“

    Nach mir ist die Verkabelung OK.
    Ich bin momentan ziemlich ratlos.

    Freundliche Grüsse Roman

    Antworten
    1. Stefan Draeger sagt:
      27. Juli 2018 um 11:25 Uhr

      Hallo Roman,

      sende mir doch mal per E-Mail ein Foto deines Aufbaus. Es sieht nach der Fehlermeldung so aus das ggf. ein Pin falsch gesetzt / gesteckt ist.

      Gruß,

      Stefan

      Antworten
    2. Jan sagt:
      29. Juli 2018 um 10:00 Uhr

      Pullups am I2C vergessen? Die sind nämlich nicht auf dem Nano bestückt. Einen 4k7 über 5V auf SDA und einen an SCL bestücken, dann sollte es gehen.

      Antworten
  2. Andreas sagt:
    22. Januar 2019 um 14:53 Uhr

    Hallo Herr Draeger, habe diesen Datenlogger seit ein paar Tagen und auch die Sketches SetTime und ReadTest erfolgreich getestet. Seit Gestern leuchtet die rote LED auf dem Shield. Ich bin mir ziemlich sicher, dass sie vorher nicht geleuchtet hat. Die Pufferbatterie habe ich gewechselt. Auf die MicroSD Karte warte ich gerade. Ich finde auch keine Beschreibung im Netz.

    Antworten
  3. Michael sagt:
    12. Mai 2019 um 21:41 Uhr

    Hallo Herr Draeger,
    ich habe mich dran versucht das Beispiel auf zB den DHT11 oder DHT22 zu übertragen, aber ich komme nicht weiter? Wäre das ggf ein neues kleines Projekt für Sie?
    Vielen Dank fürs drüber nachdenken …
    Beste Grüße,
    Michael

    Antworten
    1. Stefan Draeger sagt:
      14. Mai 2019 um 09:47 Uhr

      Hallo Herr Hagemann,

      das Projekt würde also bedeuten das Sie die Daten von einem DHT11 / DHT22 Sensor
      in einem Intervall x auf eine SD-Karte mit einem Zeitstempel schreiben wollen?

      Hier würde ich noch zusätzlich einen deep sleep implementieren um einen Batteriebetrieb über einen langen
      Zeitraum zu ermöglichen.

      Gruß,

      Stefan Draeger

      Antworten
    2. Mario sagt:
      15. Februar 2021 um 13:48 Uhr

      #include // Bibliothek einbinden!!! WICHTIG!!!

      #define DHTTYPE DHT22 // Typ kann auch DHT11 sein.
      #define DHT_PIN 2 // Am Pin zwei in diesem Fall

      //DHT22 Temperatur und Luftfeuchtgkeit Sensor Initialisieren
      DHT dht(DHT_PIN, DHTTYPE);

      dht.begin();// Diese Zeile muss in setup() stehen!

      //Diese Zeilen müssen in loop() stehen!
      // Innenfeuchtigkeit in %
      float Ih = dht.readHumidity();
      // Innentemperatur in °C
      float It = dht.readTemperature();

      Die Objekte Benennung (in diesem Fall nur dht) ist beliebig.

      Antworten
  4. Joachim Meitzner sagt:
    24. Juli 2021 um 18:37 Uhr

    Sehr geehrter Herr Dräger, ich habe Ihren Dataloggersketch genommen und mit dem Arduinoshield für SD-Card und RTC aufgebaut. Als Temperatursensor verwende ich den TMP36GZ. Datur und Uhrzeit sowie die Nummer der Messung werden korrekt angezeigt. Leider laufen die Messwerte völlig aus dem Ruder, sie bewegen sich bei Zimmertemperatur um die „73“ , was selbst im Sommer etwas zu ist. Wie kann ich dem begegnen?
    Mit freundlichen Grüßen

    Antworten
    1. Stefan Draeger sagt:
      26. Juli 2021 um 20:13 Uhr

      Hi,

      welchen Mikrocontroller benutzen Sie denn?
      Da man für die analogen Temperatursensoren mit der Spannung etwas rechnen muss, ist eine stabile interne 5V Spannung nützlich.
      Die günstigen China Klone haben hier manchmal einpaar Schwächen.

      Ggf. einfach mal mit einem Voltmeter messen und diesen Faktor mit einrechnen.

      Gruß,

      Stefan Draeger

      Antworten
      1. Joachim Meitzner sagt:
        2. August 2021 um 16:00 Uhr

        Danke für Ihre umgehende Antwort. Auf dem Prozessor steht gedruckt:
        ATMEL
        ATMEGA 328P
        AU1701 .
        Ich habe aber noch einmal im Programm nachgesehen und in Zeile 112 gefunden, dass die Temperaturangabe in F erfolgt. Gibt es eine Möglichkeit der Umrechnung auf C ?
        Freundliche Grüße
        J. Meitzner

        Antworten
        1. Stefan Draeger sagt:
          4. August 2021 um 10:35 Uhr

          Hi,

          die Umrechnung von Fahrenheit in Celsius ist recht einfach.
          Die Formel lautet wie folgt 73 °F − 32) × 5/9 = 22,778 °C

          Quelle: https://www.google.de/search?q=fahrenheit+in+celsius

          Gruß,

          Stefan Draeger

          Antworten
  5. Rolfi sagt:
    30. Januar 2022 um 23:33 Uhr

    Hallo.
    Ich bin Anfänger im Arduino.
    Ich habe ein Sheald am Uno und dazu digitale Temperatursensoren DS18B20.
    Da diee im One-Wire-Bus arbeiten können, habe ich mich für diese entschieden und Euren Sketch entsprechend umgestrickt. Die einzelnen Adressen der Sensoren müssen natürlich vorher ausgelesen und im Sketch eingetragen werden.
    Bei mir läuft das aktuell mir 3 Sensoren. Soll aber auf 8 erweitert werden.
    Wenn Jemand Interesse hat, hier ist mein Ergebnis:

    https://pastebin.pl/view/63d9894b

    Antworten
    1. Mario sagt:
      13. Juni 2023 um 14:43 Uhr

      … hallo Rolfi …
      habe gerade die sachen mal wieder in der mache … würde gern eine datei erzeugen, die jahr und monat im namen hat … so in etwa „temp_2023-06.txt“ geht das zu ändern ?

      Antworten
  6. Rolfi sagt:
    30. Januar 2022 um 23:41 Uhr

    Oh Sorry
    Leider geht die Formatierung verloren.

    Antworten
    1. Stefan Draeger sagt:
      31. Januar 2022 um 07:13 Uhr

      Hi,

      danke für deinen Kommentar und das Teilen deines Codes.
      Wenn du langen Quellcode in Kommentare teilen möchtest, dann empfehle ich dir die Seite „pastebin.pl“ dort kann man Quellcode einfügen und mit einem entsprechenden Formatter hervorheben lassen.
      (Im Fall von Arduino Sketche verwende ich C++.)

      Das Ergebnis ist eine URL, welche man am eigentlichen Ziel einfügen kann und somit seinen Kommentar recht kurz hält.

      Gruß,

      Stefan Draeger

      Antworten

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}