Datenlogger Problem

Hallo zusammen, versuche in meinem Pool verschiedene Temperaturen zu messen und diese in einer Excel-Tabelle Festzuhalten.
Nun habe ich das Problem, dass mir der Datenlogger nach ca 2 Std versagt.
Habe schon die Stromversorgung überprüft aber an der kann es auch nicht liegen.

Ich habe die Sensoren alle in Reihe geschaltet da die Spannungsversorgung nur über die Datenleitung zu instabil ist.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <DS1307.h>
#include <DHT.h>
#include <OneWire.h>
#include "SI114X.h"
#include "Arduino.h"



byte Sensor1[8] = {0x28, 0x57, 0xD0, 0x79, 0xA2, 0x01, 0x03, 0x4F};               // Deklaration von Sensor-Adressen und -Namen werden mit dem Programm 
char Name1[] = "1: ";                                                             // "adressenAuslesen" gefunden und müssen dann in die jeweiligen Plätze kopiert werden 

byte Sensor2[8] = {0x28, 0xC5, 0x6B, 0x9D, 0x0B, 0x00, 0x00, 0xB6};
char Name2[] = "2: ";

byte Sensor3[8] = {0x28, 0xC7, 0x41, 0x9E, 0x0B, 0x00, 0x00, 0x15};
char Name3[] = "3: ";

byte Sensor4[8] = {0x28, 0xE8, 0xB2, 0x9B, 0x0B, 0x00, 0x00, 0xEE};
char Name4[] = "4: ";

byte Sensor5[8] = {0x28, 0x30, 0x73, 0x9B, 0x0B, 0x00, 0x00, 0x64};
char Name5[] = "5: ";

byte Sensor6[8] = {0x28, 0x74, 0xB6, 0x9C, 0x0B, 0x00, 0x00, 0xBB};
char Name6[] = "6: ";

byte Sensor7[8] = {0x28, 0x9A, 0x5C, 0x9D, 0x0B, 0x00, 0x00, 0x69};
char Name7[] = "7: ";

byte Sensor8[8] = {0x28, 0xD9, 0xAF, 0x9B, 0x0B, 0x00, 0x00, 0xA4};
char Name8[] = "8: ";

byte Sensor9[8] = {0x28, 0xC1, 0x6C, 0x9C, 0x0B, 0x00, 0x00, 0xB4};
char Name9[] = "9: ";

byte Sensor10[8] = {0x28, 0xBB, 0x09, 0x9E, 0x0B, 0x00, 0x00, 0x27};
char Name10[] = "10: ";

byte Sensor11[8] = {0x28, 0x9D, 0xFA, 0x9B, 0x0B, 0x00, 0x00, 0x4A};
char Name11[] = "11: ";

byte Sensor12[8] = {0x28, 0x0A, 0x7B, 0x9E, 0x0B, 0x00, 0x00, 0xF9};
char Name12[] = "12: ";

byte Sensor13[8] = {0x28, 0xB6, 0xA4, 0x9B, 0x0B, 0x00, 0x00, 0x33};
char Name13[] = "13: ";

byte Sensor14[8] = {0x28, 0x9F, 0x2D, 0x9B, 0x0B, 0x00, 0x00, 0x2B};
char Name14[] = "14: ";

byte Sensor15[8] = {0x28, 0x53, 0x58, 0x9B, 0x0B, 0x00, 0x00, 0x76};              
char Name15[] = "15: ";

byte Sensor16[8] = {0x28, 0xDE, 0x09, 0x9E, 0x0B, 0x00, 0x00, 0x0F};
char Name16[] = "16: ";

byte Sensor17[8] = {0x28, 0xFE, 0x79, 0x9B, 0x0B, 0x00, 0x00, 0x55};
char Name17[] = "17: ";


OneWire DS1820(2);                                                                // Deklaration OneWire (Pin)

DS1307 clock;                                                                     // Deklaration DS1307 als Echtzeituhr

DHT dht(3, DHT22);                                                                // Deklaration DHT-Sensor (Pin, Typ)

SI114X SI1145 = SI114X();                                                         // Deklaration Lichtsensor

File dataFile;                                                                    // Objekt vom Typ File erzeugen

int RelaisPin = 7 ;                                                               // Relais an Pin 7
int TasterPin = 10;                                                               // Taster für Relais an Pin 10 
int empfindlichkeit = 200;                                                        
bool geschaltet = false;                                                          // Speicherung des Schaltzustandes

byte DEGREE_SYMBOL = 0;
byte degree[8] = {
  0b00000,
  0b00010,
  0b00101,
  0b00010,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

unsigned long WRITE_INTERVAL = 10000;                                               // Messabstand in ms

unsigned long lastWrite = WRITE_INTERVAL;

float getTemperature(bool type_s, byte address[8])
{
  // Temperaturwert des adressieren Sensors auslesen
  // Dabei wird zwischen DS18S20 und den anderen unterschieden
  byte data[12];
  int16_t raw;
  byte i;

  DS1820.reset();
  DS1820.select(address);
  DS1820.write(0x44, 0);        // Start Messung
  delay(1000); 
  DS1820.reset();
  DS1820.select(address);
  DS1820.write(0xBE);           // Read Scratchpad
  for ( i = 0; i < 9; i++)
  {
    data[i] = DS1820.read();
  }
  raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3;
    if (data[7] == 0x10)
    {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else
  {
    byte cfg = (data[4] & 0x60);                                                      // Aufloesung bestimmen, bei niedrigerer Aufloesung sind                                                                                                            
    if (cfg == 0x00) raw = raw & ~7;      //  9 Bit Aufloesung,  93.75 ms             // die niederwertigen Bits undefinier -> auf 0 setzen
    else if (cfg == 0x20) raw = raw & ~3; // 10 Bit Aufloesung, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 Bit Aufloesung, 375.0 ms              // Default ist 12 Bit Aufloesung, 750 ms Wandlungszeit                                                                               
  }
  return ((float)raw / 16.0);
}

void setup() {
  Serial.begin(9600);                                                                 // Serielle Schnittstelle initialisieren (Baud 9600)
  
  int selectedChip = 4;                                                               // SD Karte initialisieren 
  if (!SD.begin(selectedChip)) {
    Serial.println("SD-Card failed or is missing");
  } else {
    Serial.println("SD-Card initialized.");
  }

(deleted)

hier der zweite Teil des Sketches

dht.begin();                                                                        // Verbindung zum DHT Sensor herstellen

  clock.begin();                                                                      // Verbindung zur Echtzeituhr SI1145 herstellen

  pinMode(RelaisPin, OUTPUT);                                                         // Initialisieren Ausgang für Relais  
  pinMode(TasterPin, INPUT_PULLUP);                                                   // Taster als Eingang mit Pull Up
  
  dataFile = SD.open("Testpool.csv", FILE_WRITE| O_APPEND);                                     // Header
  if (dataFile) {                                                                          
    dataFile.print(F("Datum"));                                                          
    dataFile.print(";");  
    dataFile.print(F("Uhrzeit"));                                                          
    dataFile.print(";");                                                                
    dataFile.print(F("Feuchtigkeit"));                                                  
    dataFile.print(F(";"));
    dataFile.print(F("Temp-DHT22"));
    dataFile.print(F(";"));
    dataFile.print(F("1-Tw"));
    dataFile.print(F(";"));
    dataFile.print(F("2"));
    dataFile.print(F(";"));
    dataFile.print(F("3"));
    dataFile.print(F(";"));
    dataFile.print(F("4"));
    dataFile.print(F(";"));
    dataFile.print(F("5"));
    dataFile.print(F(";"));
    dataFile.print(F("6"));
    dataFile.print(F(";"));
    dataFile.print(F("7"));
    dataFile.print(F(";"));
    dataFile.print(F("8"));
    dataFile.print(F(";"));
    dataFile.print(F("9"));
    dataFile.print(F(";"));
    dataFile.print(F("10i"));
    dataFile.print(F(";"));
    dataFile.print(F("11"));
    dataFile.print(F(";"));
    dataFile.print(F("12"));
    dataFile.print(F(";"));
    dataFile.print(F("13i"));
    dataFile.print(F(";"));
    dataFile.print(F("14i"));
    dataFile.print(F(";"));
    dataFile.print(F("15"));
    dataFile.print(F(";"));
    dataFile.print(F("16"));
    dataFile.print(F(";"));
    dataFile.print(F("17"));
    dataFile.print(F(";"));
    dataFile.print(F("IR"));
    dataFile.print(F(";"));
    dataFile.print(F("UV"));
    dataFile.println("");                                                             // Zeilenvorschub für den Tabellenkopf
    dataFile.close();                                                                 // die csv-Datei wieder schließen
  }
}

void loop() {
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  float IR = SI1145.ReadVisible();
  float UV = SI1145.ReadUV(); 

//  if (isnan(temperature) || isnan(humidity)) {
//    Serial.println("Failed to read from DHT");
//    return;                                                                           // Keine Daten --> loop() an dieser Stelle wieder verlassen
//  }

                                                                                      //Werte auf SD-Karte schreiben (DHT22, Sensor 1-x)
  if (millis() - lastWrite > WRITE_INTERVAL) {
    String line = String(clock.dayOfMonth) + "." + String(clock.month) + ";" + String(getTime())                                                                                                  //RTC
    + ";" + String(humidity) + ";" + String(temperature)                                                                                                                                          //DHT22
    + ";" + getTemperature(false,Sensor1) + ";" + getTemperature(false,Sensor2) + ";" + getTemperature(false,Sensor3) + ";" + getTemperature(false,Sensor4)                                       //DS18B20
    + ";" + getTemperature(false,Sensor5) + ";" + getTemperature(false,Sensor6) + ";" + getTemperature(false,Sensor7) + ";" + getTemperature(false,Sensor8) 
    + ";" + getTemperature(false,Sensor9) + ";" + getTemperature(false,Sensor10) + ";" + getTemperature(false,Sensor11) + ";" + getTemperature(false,Sensor12)
    + ";" + getTemperature(false,Sensor13) + ";" + getTemperature(false,Sensor14) + ";" + getTemperature(false,Sensor15) + ";" + getTemperature(false,Sensor16)
    + ";" + getTemperature(false,Sensor17)
    + ";" + String(IR) + ";" + String(UV);                                                                                                                                                        // SI1145                                                                                                                                                                                                                                  //SI1145
    writeToSD(line);
    lastWrite = millis();
  }

   if (digitalRead(TasterPin) == LOW)                                                 // Abfrage ob der Taster gedrückt ist  
  {
    if (geschaltet == false) {        
      geschaltet = true;              
    }
    else {
      geschaltet = false;             
    }
  }
 
  if (geschaltet == true) {           
    digitalWrite(RelaisPin, HIGH);       
  }
 
  if (geschaltet == false) {          
    digitalWrite(RelaisPin, LOW);
  }
 
  delay(empfindlichkeit);             


  
//  if (getTemperature(false,Sensor2) > 50){                                            // Maximaltemperatur in °C
//    digitalWrite(RelaisPin, HIGH);                                                    // Relais aus

  
  }
   


String getTime() {
  clock.getTime();                                                                    // Zeit vom Chip abfragen
  String t = String(clock.hour);
  t += String(":");
  t += String(clock.minute);
  t += String(":");
  t += String(clock.second);
  t += String(":");
  return t;
}

void writeToSD(String line) {
  File dataFile = SD.open("Testpool.csv", FILE_WRITE| O_APPEND);
  if (dataFile) {
    dataFile.println(line);                                                             // Auf die SD-Karte schreiben
    dataFile.close();
    Serial.println(line);                                                               // Zusätzlich auf serielle Schnittstelle schreiben zum Debuggen
  }
  else {
    Serial.println("Error opening datafile");
  }
}
/////////////////////////////////ENDE/////////////////////////////////

(deleted)

@Peter
dann kann also das die Probleme verursachen? Dann versuche ich das mal umzubauen.
vielen Dank schon mal für die ultra schnellen Antworten :)))

Hier ist noch ein Bild des Schaltkastens, hab leider kein Fritzing :frowning:

Die Widerstände unten in der Hutleiste sind übrigens zwei mal 330 Ohm

bendix95:
dann kann also das die Probleme verursachen?

Ich habe da noch einen anderen Verdacht, welcher auch gern übersehen wird.

Mit welcher Spannung (Netzteilspannung) betreibst du den Arduino ?

Und vermutlich sind alle Module dann an 5Volt angeschlossen ?

Es wird über ein ganz normales 12V/1A Netzteil versorgt.
Ja es läuft alles über 5 Volt.

bendix95:
Es wird über ein ganz normales 12V/1A Netzteil versorgt.
Ja es läuft alles über 5 Volt.

Na dann solltest du mal die Stromaufnahme messen.
Ich vermute mal der Spannungsregler auf deinem Mega wird sehr heiß und macht damit die Grätsche bzw. stellt die Funktion ein.

Immerhin muss dieser 7 Volt mal deiner gesamten Stromaufnahme vernichten.
Ich empfehle daher ein Netzteil mit ca. 7 Volt, damit ist die Verlustleistung deutlich geringer und schont deinen Spannungsregler.

Edit:
Dein Aufbau sieht sehr sauber aus, gefällt mir gut.

habe es jetzt ne Stunde mit nem 5V/ 500 mA Netzteil probiert und die RTC versagt nach ca 20 min, die Sensoren bleiben jedoch vorerst stabil.

@HotSystems: der Schaltschrank ist ordentlich aber der Code nicht :smiley:

bendix95:
habe es jetzt ne Stunde mit nem 5V/ 500 mA Netzteil probiert und die RTC versagt nach ca 20 min, die Sensoren bleiben jedoch vorerst stabil.

@HotSystems: der Schaltschrank ist ordentlich aber der Code nicht :smiley:

Wo hast du die 5Volt jetzt angeschlossen ?

Was genau heißt "versagt" ?

Bitte immer genaue Fehlerangaben machen.
Im übrigen ist deine RTC nicht die beste, genauste. Da wäre eine DS3231 schon deutlich besser.

Ich habe eben das 12V Netzteil gegen ein 5V getauscht und wie zuerst an der Hohlbuchse angeschlossen.

Die RTC versagt indem sie "stehen" bleibt und immer wieder die gleiche Uhrzeit printet.

bendix95:
Ich habe eben das 12V Netzteil gegen ein 5V getauscht und wie zuerst an der Hohlbuchse angeschlossen.

Die RTC versagt indem sie "stehen" bleibt und immer wieder die gleiche Uhrzeit printet.

Kein Wunder, dass du damit Probleme hast.
Du Buchse braucht min. 7 Volt damit der Mega funktioniert.
Da ist ein Spannungsregler drauf der dann aus den 7V die 5 Volt macht und er brauch 7Volt. Naja 6,5 V können auch reichen.

Hallo bendix95,

gibt es schon irgendwelcher Erkentnisse ?

Hallo HotSystems,
hab den Logger die Nacht durchlaufen lassen und jetzt waren die Sensoren stabil.
Leider ist mir die RTC wieder stehen geblieben.

Außerdem nochmal vielen Dank für deine Hilfe

bendix95:
Hallo HotSystems,
hab den Logger die Nacht durchlaufen lassen und jetzt waren die Sensoren stabil.
Leider ist mir die RTC wieder stehen geblieben.

Außerdem nochmal vielen Dank für deine Hilfe

Gerne....an welcher Spannung ?
Wenn die RTC stehen bleibt, ist da noch ein Problem.

(deleted)

Hallo bendix95,

bevor du an irgendwelchen Dingen rumbastelst, musst du zuvor die Spannungsversorgung richtig herstellen.
5Volt an der Hohlbuchse (Spannungsbuchse) funktioniert nicht (hatte ich auch schon geschrieben).
Da du darauf nicht geantwortet hast, vermute ich, du machst es immer noch falsch.

Dann kann dein System nicht stabil arbeiten. An der Buchse brauchst du min. 6,5 Volt.

Auch dass deine RTC nicht optimal ist, hatte ich auch schon geschieben.
Warum die aussetzt, solltest du klären, sobald das Problem mit der Versorgung gelöst wurde.
Hier kann es evtl. auch an falscher Anschaltung an I2C liegen, oder auch an fehlenden Pullup-Widerständen.

Dazu solltest du uns ein Schaltbild posten.

Ich habe jetzt mal ein neues Netzteil bestellt und versuche es dann nächste Woche wie sich der Logger verhält. Habe gleich noch die 3431 RTC mitbestellt
Halte euch auf dem Laufenden wie es funktioniert :slight_smile:

bendix95:
Ich habe jetzt mal ein neues Netzteil bestellt und versuche es dann nächste Woche wie sich der Logger verhält. Habe gleich noch die 3431 RTC mitbestellt
Halte euch auf dem Laufenden wie es funktioniert :slight_smile:

Hört sich gut an, viel Erfolg.
Bestimmt meinst du aber die DS3231 als RTC.
Und welche Spannung hat das Netzteil ?

oh ja die meinte ich ^^
Hab ein 7,5 V/ 1,6 A bestellt