SD Karten Temperatur Logger mit DS18B2 Sensor

Ein freundliches Hallo von Haus zu Haus.

Aktuell bin ich dabei mir eine Temperatur Sensor Station auf zu bauen, welche die Temperaturen auf einer SD Karte sichern soll.

Dazu habe ich auch schon folgenden Code hier im Forum gefunden “Temperatur Logger mit DS18B2” aber da ich noch Anfänger bin, ist mir nicht so ganz klar wie ich das SetUp anschließen muss.

Hätte jemand vielleicht eine Zeichnung davon, wo ich was am Arduino anschließen muss oder wäre bereit mir diese an zu fertigen?

Vielen lieben dank für eure Hilfe.

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

#define ONE_WIRE_BUS 6 // DS18B20 an Pin 6 anngeschlossen 

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

DeviceAddress insideThermometer = { 0x28, 0x03, 0xF6, 0xC2, 0x03, 0x00, 0x00, 0xA7 };

// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL 3000 // mills between entries (reduce to take more/faster data)

// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 3000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()

#define ECHO_TO_SERIAL 1 // echo data to serial port
#define WAIT_TO_START 0 // Wait for serial input in setup()

// the digital pins that connect to the LEDs
#define redLEDpin 2
#define greenLEDpin 3

// The analog pins that connect to the sensors
//#define tempPin 6
//#define tempPin 1 // analog 1
//#define BANDGAPREF 14 // special indicator that we want to measure the bandgap

//#define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter!
//#define bandgap_voltage 1.1 // this is not super guaranteed but its not -too- off

RTC_DS1307 RTC; // define the Real Time Clock object

// for the data logging shield, we use digital pin 10 for the SD cs line
const int chipSelect = 9;

// the logging file
File logfile;

void error(char *str)
{
  Serial.print("error: ");
  Serial.println(str);
  
  // red LED indicates error
  digitalWrite(redLEDpin, HIGH);

  while(1);
}


void setup(void)
{
  Serial.begin(9600);
  Serial.println();
  sensors.begin(); DEC;   // Start up the library
  sensors.setResolution(insideThermometer, 9);
  // use debugging LEDs
  pinMode(redLEDpin, OUTPUT);
  pinMode(greenLEDpin, OUTPUT);
  
#if WAIT_TO_START
  Serial.println("Type any character to start");
  while (!Serial.available());
#endif //WAIT_TO_START

  // initialize the SD card
  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(9, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    error("Card failed, or not present");
  }
  Serial.println("card initialized.");
  
  // create a new file
  char filename[] = "DATALOG.TXT";
  for (uint8_t i = 0; i < 100; i++) {
    filename[6] = i/10 + '0';
    filename[7] = i%10 + '0';
    if (! SD.exists(filename)) {
      // only open a new file if it doesn't exist
      logfile = SD.open(filename, FILE_WRITE | O_APPEND);
      break; // leave the loop!
    }
  }
  
  if (! logfile) {
    error("couldnt create file");
  }
  
  Serial.print("Logging to: ");
  Serial.println(filename);

  // connect to RTC
  Wire.begin();
  if (!RTC.begin()) {
    logfile.println("RTC failed");
#if ECHO_TO_SERIAL
    Serial.println("RTC failed");
#endif //ECHO_TO_SERIAL
  }
  

  logfile.println("millis,stamp,datetime,light,temp,vcc");
#if ECHO_TO_SERIAL
  Serial.println("millis,stamp,datetime,light,temp,vcc");
#endif //ECHO_TO_SERIAL

  // If you want to set the aref to something other than 5v
  //analogReference(EXTERNAL);
}
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } 
  else {
    //Serial.print("C: ");
    Serial.print(tempC);
  }
}


void loop(void)
{
  DateTime now;

  // delay for the amount of time we want between readings
  delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
  
  digitalWrite(greenLEDpin, HIGH);
  
  // log milliseconds since starting
  uint32_t m = millis();
  logfile.print(m); // milliseconds since start
  logfile.print(", ");
#if ECHO_TO_SERIAL
  Serial.print(m); // milliseconds since start
  Serial.print(", ");
#endif

  // fetch the time
  now = RTC.now();
  // log time
  logfile.print(now.unixtime()); // seconds since 1/1/1970
  logfile.print(", ");
  logfile.print('"');
  logfile.print(now.year(), DEC);
  logfile.print("/");
  logfile.print(now.month(), DEC);
  logfile.print("/");
  logfile.print(now.day(), DEC);
  logfile.print(" ");
  logfile.print(now.hour(), DEC);
  logfile.print(":");
  logfile.print(now.minute(), DEC);
  logfile.print(":");
  logfile.print(now.second(), DEC);
  logfile.print('"');
#if ECHO_TO_SERIAL
  Serial.print(now.unixtime()); // seconds since 1/1/1970
  Serial.print(", ");
  Serial.print('"');
  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.print('"');
#endif //ECHO_TO_SERIAL

  sensors.requestTemperatures();
  float tempinsideThermometer = sensors.getTempC(insideThermometer); //damit wird die Temperatur an tempinsideThermometer gegeben

// analogRead(tempPin);
// delay(10);
  //int tempReading = analogRead(tempPin);
  //int tempReading = digitalRead(tempPin);
  // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0
//  float voltage = tempReading * aref_voltage / 1024;
  //float temperatureC = (voltage - 0.5) * 100 ;
  //float temperatureF = (temperatureC * 9 / 5) + 32;
  
  logfile.print(", ");
  logfile.print(tempinsideThermometer);
#if ECHO_TO_SERIAL
  Serial.print(", ");
  Serial.print(tempinsideThermometer);
#endif //ECHO_TO_SERIAL

  // Log the estimated 'VCC' voltage by measuring the internal 1.1v ref


  logfile.println();
#if ECHO_TO_SERIAL
  Serial.println();
#endif // ECHO_TO_SERIAL

  digitalWrite(greenLEDpin, LOW);

  // Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
  // which uses a bunch of power and takes time
  if ((millis() - syncTime) < SYNC_INTERVAL) return;
  syncTime = millis();
  
  // blink LED to show we are syncing data to the card & updating FAT!
  digitalWrite(redLEDpin, HIGH);
  logfile.flush();
  digitalWrite(redLEDpin, LOW);
  
}

So wird das nix, schreib dein eigenen Code.
Wer Hilfe sucht, der wird die hier auch finden.

Hallo und ein freundliches Hallo zurück!

Ich empfehle dir dich erst mal in die Thematik einzuarbeiten:

  • DS18B20 Sensor anschließen und auslesen
  • SD-Karte anschließen und auslesen
  • DS1307 anschließen und auslesen

Es ist leider unumgänglich dass du dich einarbeitest.
Zu den o.g. Schritten gibts Examples und Schaltpläne.

Stefan_F:
...
Dazu habe ich auch schon folgenden Code hier im Forum gefunden "Temperatur Logger mit DS18B2" aber da ich noch Anfänger bin, ist mir nicht so ganz klar wie ich das SetUp anschließen muss.
...

Grundlegend:
Genau aus diesem Grund poste ich keine umfangreichen Sketchs von mir im Forum.
Diese gibts nur bei ausreichend know-how per PN.

Ich bin nicht bereit meine Zeit zu investieren, damit sich andere wichtige Einarbeitungszeit sparen.

mde110:
Ich bin nicht bereit meine Zeit zu investieren, damit andere Zeit sparen.

Sorry, ist ganz an Arduino vorbei, meiner Meinung nach.

Mit dem anderen bin ich ganz einverstanden.

[...]

skorpi08:
Sorry, ist ganz an Arduino vorbei, meiner Meinung nach.
...

Bitte nicht falsch verstehen.
Ich helfe gerne, stelle gerne Code bereit, nur bin ich der Meinung, dass man sich gewisse Kentnisse selber erarbeiten sollte.

@Stefan_F,
schade dass du deine Beiträge löscht. Das sehen wir hier nicht gerne.

mde110:
Genau aus diesem Grund poste ich keine umfangreichen Sketchs von mir im Forum.
Diese gibts nur bei ausreichend know-how per PN.

Ich bin nicht bereit meine Zeit zu investieren, damit sich andere wichtige Einarbeitungszeit sparen.

Zum Glück (auch zu deinem) teilen die Autoren aller nicht-kommerziellen Libraries deine Einstellung nicht.

Ich bin sogar der Ansicht, dass die Standard-(Haus)Aufgaben als fertige Musterlösung(en) zu finden sein sollten,
damit die Leute, die nur hirnlos kopieren wollen, das auch tun können, ohne anderen Zeit zu stehlen.
Auch würde es für Lehrer/Assistenten/studentische Hilfskräfte einfacher sein, Betrug zu entlarven.

Aber letztlich ist es natürlich jedem selbst überlassen, was er veröffentlicht.

mde110:
@Stefan_F,
schade dass du deine Beiträge löscht. Das sehen wir hier nicht gerne.

Stand eh nix gescheites drin, das übliche Übel halt.

Danke für eure Hilfe bisher…

Nach dem ich im Code festgestellt habe, das da ein Fehler vorhanden war, welchen ich auch lösen konnte und soweit alles jetzt läuft, würde ich mich freuen, wenn jemand vielleicht einen tipp für mich hat, wiee er die TXT Datei fortlaufend durch nummeriert? Zwar wollte der Ursprüngliche Code Ersteller dies auch schon tun aber das Funktionierte nicht so wie von ihm gedacht und ich musste dies raus löschen.

  // create a new file
  char filename[] = "DATALOG.TXT";
  for (uint8_t i = 0; i < 100; i++) {

    if (! SD.exists(filename)) {
      // only open a new file if it doesn't exist
      logfile = SD.open(filename, FILE_WRITE | O_APPEND);
      Serial.println(filename);
      break; // leave the loop!
    }
  }

Stefan_F:
Hätte jemand vielleicht eine Zeichnung davon, wo ich was am Arduino anschließen muss oder wäre bereit mir diese an zu fertigen?

QUATSCH!

So funktioniert das hier nicht.

Wenn Du Dir keine Schaltbild-Zeichnung malst, dann wird es auch sonst niemand für Dich malen.

Aber wenn Du verraten würdest, welche Hardware Du konkret verwenden möchtest, zum Beispiel welches Arduino-Board oder welches Arduino-kompatible Board, dann könnte Dir ggf. jemand einen "Anschlussplan" posten und Dir schreiben, was Du wo anschließen solltest.

Für Deinen Temperatursensor und das RTC-Modul verrate ich Dir schon mal:

RTC-Modul VCC an Arduino 5V
RTC-Modul GND an Arduino GND
RTC-Modul SDA an Arduino SDA
RTC-Modul SCL an Arduino SCL

Temperatursensor VCC an Arduino 5V
Temperatursensor GND an Arduino GND
Temperatursensor Data an Arduinp Pin-6 // wenn das der Pin ist, über den Du den Sensor auslesen möchtest

Bischn merkwürdig, erst weiß er nicht wo wie was und warum und dann löst er so ganz easy vonalleine das Problem was die anderen nicht konnten.

skorpi08:
Bischn merkwürdig, erst weiß er nicht wo wie was und warum und dann löst er so ganz easy vonalleine das Problem was die anderen nicht konnten.

Schön gesagt aber ich bin nicht dumm, stehe nur manchmal auf'm Schlauch und hab viel Zeit mich damit zu beschäftigen, wenn ich möchte :wink:

jurs:
Wenn Du Dir keine Schaltbild-Zeichnung malst, dann wird es auch sonst niemand für Dich malen.

Das hat sich schon erledigt, inzwischen Läuft das System ja im Probeaufbau und macht seine Aufgabe.

Nur das mit dem Datei Namen stört mich noch etwas, ich muss erst jedes mal die TXT Datei Löschen bevor es weiter geht. Cooler wäre es, wenn er mit jedem Neustart auch eine neue Datei anlegt. Dann ist's eigentlich perfekt für meine Zwecke.

Achso, Endschuldigt bitte das ich das nicht geschrieben habe. Mein Fehler!
Verwenden tue ich ein Arduino UNO Rv3 und eine RealTime Clock RTC DS3231 sowie das micro SD TF Card Memory Modul aber später soll das eigentlich auf einem Nano oder Micro Arduino laufen.