DS18B20 und SD

Hallo Leute,
komme bei meinen Temperaturlogger Projekt nicht weiter.
Alles funktioniert bis zu dem Punkt, wo ich die SD.h einbinde... ab dann läuft mein OneWire Bus mit den DS18B20 nicht mehr. Hier hängt sich der Microcontroller dann auf....

Hab mal meinen Code angehangen. Weiß nicht ob der was bringt...
Ist da schon was bekannt, dass sich die SD.h mit der DallasTemperature.h beißt?

Grüße Creepwood

DallasOneWire_T4.ino (13.2 KB)

Hallo,

was geht denn nicht? Läßt es sich nicht kompilieren oder was passiert denn genau?
Welchen Arduino hast Du?

Ich benutze einen Arduino Uno R3. Mein Code kompiliert vollständig.
Aber bei der Ausführung von sensors.requestTemperatures(); hängt sich der Microcontroller dann auf, also arbeitet an der Stelle nicht mehr weiter. Der Befehl ist ja aus der Dallas lib um die DS18B20 Sensoren am 1-Wire bus zu updaten.

Grüße

Hallo,

okay. Ich glaube nicht das sich der µC aufhängt. Er wird die Abfragen einfach überspringen, also diese Zeilen nicht ausführen. Den Rest aber. Kannste überprüfen in dem Du an der Stelle einen Zähler auf die serielle ausgeben läßt. Der wird sicherlich munter hochzählen.

Ich vermute das Problem weiter oben im Adress Array. Auf welchem Bsp. der Dallas Lib beruht dein Codeaufbau?

// arrays to hold device addresses
DeviceAddress T[4] =
{
  { 
    0x28, 0x79, 0xDE, 0x5B, 0x06, 0x0, 0x0, 0x71 }
  , // T1 -> 2879DE5B06000071
  { 
    0x28, 0xB6, 0xF7, 0x5C, 0x06, 0x0, 0x0, 0x47                                                                 }
  , // T2 -> 28B6F75C06000047
  { 
    0x28, 0xA5, 0xED, 0x5C, 0x06, 0x0, 0x0, 0x84                                                                 }
  , // T3 -> 28A5ED5C06000084
  { 
    0x28, 0xFC, 0xC6, 0x5C, 0x06, 0x0, 0x0, 0xB4                                                                 }  
  // T4 -> 28FCC65C060000B4
};

Definiere die Adressen mal einzeln. Also jede Adresse bekommt einen Arraynamen.

Bsp.

// Device Adressen der einzelnen DS1820 Temperatursensoren angeben 
DeviceAddress sensor1 = { 0x28, 0xFF, 0x4A, 0xAD, 0x6B, 0x14, 0x03, 0x79 };   // externer "1."
DeviceAddress sensor2 = { 0x28, 0xFF, 0x36, 0xB0, 0x6B, 0x14, 0x03, 0x90 };   // externer "2."
DeviceAddress sensor3 = { 0x10, 0x47, 0x27, 0xD9, 0x02, 0x08, 0x00, 0x09 };   // Sensor auf dem Board

Theoretisch geht das schon mit Arrays aus DeviceAddress. Mache ich auch so.

Wobei wenn du schon Arrays verwendest dann mache es auch konsequent. Damit meine ich die unnötige switch/case Konstruktion ab Zeile 233. Ab Zeile 300 ist auch duplizierter Code. Ganz schlimm ist auch checkErrors(). Hat aber mit dem eigentlichen Problem erst mal nichts zu tun.

Im Glaskugelmodus:
Ich tippe auf eine Heap <--> Stack Kollision

Also:

  1. Verzichte auf das String objekt.
  2. Stopfe alle konstanten Strings ins Flash.

SD.h mit der DallasTemperature.h ist kein Problem, läuft bei mir seit Jahren.

Ja, wie da String Objekte verwendet werden ist schon erschreckend.

Auch wenn man sie erst mal drin lässt, hilft das F() Makro ein einigen Stellen. Mach das mal überall rein wo du print()/println() mit String Literalen verwendest:

Serial.println(F("String im Flash"));

Und statt "\t" einfach '\t' schreiben. Ein einzelnes Zeichen muss kein String Literal sein

Auch Glückwunsch dass du reserve() verwendest (wenigstens an einer Stelle. In getRTCTimeDate() fehlt es dann leider wieder). Das macht leider kaum jemand. Aber überlege dir ob du wirklich 200 Bytes brauchst.

Ein Problem mit dynamischem Speicher ist dass dir der Verbrauch beim Hochladen nicht angezeigt wird.