DS18B20 Problem nach ein paar Minuten

Hi Leute,
also ich habe in zwischen hinbekommen, dass mein UNO mit Ethernet shield und zweiTemp Sensoren alles schön als client in eine DB schreibt. Aber etwas verstehe ich nicht. Ich habe heute einen dritten Sensor dran gebaut, an einem 20m Kabel. DAs ging auch problemlos. Aber nach 10-12 min. werden auf einmal keine Daten mehr ausgelesen, von keinem Sensor. Nehem ich den dritten wieder ab, läuft alles wieder. Wieso geht das zuerst, dann nicht mehr? Die Sensoren laufen im parasite Modus.

VG, Can

Hallo,
wenn der Widerstand zu gross ist, kann die Spannung in den Temperatursensoren nicht mehr genug ansteigen. ( Kondensator )
Werden die Sensoren oft abgefragt, haben diese dann keine Betriebsspannung mehr und antworten nicht.

Lösung: Widerstand verkleinern ( in Maßen ) oder die Anzahl der Abfragen begrenzen

Ich selbst habe eine 50m-Rolle 'Klingeldraht' angeschlossen und nach dem Verkleinern des Widerstandes funktionierte es.

Gruss
Kurti

Hallo Kurti

wie fragt man diese Sensoren weniger ab?

Ich hab 7 Sensoren am BUS laufen und nach ca. 24h werden keine Teperaturen mehr ausgelesen.
Nach einem Reset läuft es wieder.

Der Wiederstand ist angepasst.

Du mußt zuerst den nippel durch die lasche ziehen und dann den code hier posten.
Dann wird dir geholfen!

Du wirst sicher irgendwie einen interwall da drinne haben den mußt du verlängern, wie hängt davon ab wie du es derzeit machst.

ok sorry

der ganze sketch passt nicht daher nur die betreffenden Auszüge

Auszug Setup.......

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TimerOne.h>



float tempAbgas;
float tempVerbrennung;
float tempKessel;
float tempKesselrueck;
float tempSpeicher_oben;
float tempSpeicher_unten;
float tempReserve;
float tempaussen_Thermometer;
float temphkVorlauf_Thermometer;
float temphkRuecklauf_Thermometer;
float lambdaWert;
float lambdaLesen;
 
/////////////////   DS18B20
/////////////////   Data wire is plugged into pin D3 on the Arduino

#define ONE_WIRE_BUS 3

/////////////////   Setup a oneWire instance to communicate with any OneWire devices

OneWire oneWire(ONE_WIRE_BUS);

/////////////////   Pass our oneWire reference to Dallas Temperature. 

DallasTemperature sensors(&oneWire);


/////////////////   Sensoren Thimmendorf

DeviceAddress kessel_Thermometer =         { 0x28, 0xFA, 0xC9, 0x96, 0x03, 0x00, 0x00, 0x7E };  //Adressen der Sensoren manuell eingeben
DeviceAddress reserve_Thermometer =        { 0x28, 0xC0, 0x97, 0x96, 0x03, 0x00, 0x00, 0x6B };  //Adressen der Sensoren manuell eingeben
DeviceAddress speicher_oben_Thermometer = { 0x28, 0xA6, 0xB7, 0x96, 0x03, 0x00, 0x00, 0xE2 };  //Adressen der Sensoren manuell eingeben
DeviceAddress speicher_unten_Thermometer =  { 0x28, 0x89, 0xA3, 0x96, 0x03, 0x00, 0x00, 0x13 };  //Adressen der Sensoren manuell eingeben
DeviceAddress tempKesselrueck_Thermometer =        { 0x28, 0xDC, 0xC0, 0x96, 0x03, 0x00, 0x00, 0x89 };  //Adressen der Sensoren manuell eingeben
DeviceAddress aussen_Thermometer =         { 0x28, 0xA5, 0x9E, 0x96, 0x03, 0x00, 0x00, 0xB0 };  // Außentemperatur
DeviceAddress hkVorlauf_Thermometer =        { 0x28, 0x18, 0xAC, 0x96, 0x03, 0x00, 0x00, 0xFA }; // Heizkreis Vorlauf
DeviceAddress hkRuecklauf_Thermometer =        { 0x28, 0x26, 0xC7, 0x96, 0x03, 0x00, 0x00, 0x65 }; //Heizkreis Ruecklauf


void setup ()
{

///////////////// DS18B20Anfang
///////////////// Start der library DS18B20

  sensors.begin();	
  
///////////////// Auflösung des Sensors auf 9 bit  

  sensors.setResolution(kessel_Thermometer, 9);
  sensors.setResolution(tempKesselrueck_Thermometer, 9);
  sensors.setResolution(speicher_oben_Thermometer, 9);
  sensors.setResolution(speicher_unten_Thermometer, 9);
  sensors.setResolution(reserve_Thermometer, 9);
  sensors.setResolution(aussen_Thermometer, 9);
  sensors.setResolution(hkVorlauf_Thermometer, 9);
  sensors.setResolution(hkRuecklauf_Thermometer, 9);
  
/////////////////  Start abfrage DS18B20 

  sensors.requestTemperatures();      

/////////////////  Temperatur DS18b20 in Varable ablegen

  tempKessel = sensors.getTempC(kessel_Thermometer); 					
  tempKesselrueck = sensors.getTempC(tempKesselrueck_Thermometer);
  tempSpeicher_oben = sensors.getTempC(speicher_oben_Thermometer);
  tempSpeicher_unten = sensors.getTempC(speicher_unten_Thermometer);
  tempReserve = sensors.getTempC(reserve_Thermometer);
  tempaussen_Thermometer = sensors.getTempC(aussen_Thermometer);
  temphkVorlauf_Thermometer = sensors.getTempC(hkVorlauf_Thermometer);
  temphkRuecklauf_Thermometer = sensors.getTempC(hkRuecklauf_Thermometer);

Auszug Loop......

               //DS18B20
		sensors.requestTemperatures();//DS18B20
		tempKessel = sensors.getTempC(kessel_Thermometer);
		tempKesselrueck = sensors.getTempC(tempKesselrueck_Thermometer);
		tempSpeicher_oben = sensors.getTempC(speicher_oben_Thermometer);
		tempSpeicher_unten = sensors.getTempC(speicher_unten_Thermometer);
		tempReserve = sensors.getTempC(reserve_Thermometer);
		tempaussen_Thermometer = sensors.getTempC(aussen_Thermometer);
		temphkVorlauf_Thermometer = sensors.getTempC(hkVorlauf_Thermometer);
		temphkRuecklauf_Thermometer = sensors.getTempC(hkRuecklauf_Thermometer);

im weiteren Verlauf wird dann mit den in den Variablen gearbeitet

ich hoffe diese Bruchstücke reichen euch
jedenfalls hängt sicht die Temperaturabfrage nach ca. 20-30h auf und der Arduino muß neu gestartet werden.

Zu deiner Frage wie man die Sensoren weniger abfragt.
Hast du ein Uhrmodul eingebaut? Dann z.B. könnte man jede Minute einmal abfragen (if sec < 1).
Oder aber mit millis().
Hier mal ein Beispiel von mir:

void SensorLesen(){
 jetzt = millis();
 if(jetzt - vorher > 30000){ //Sensoren werden nur alle 30 sec gelesen
  sensors.requestTemperatures();
  Temperatur[0] = sensors.getTempC(Sensor0); Temperatur[1] = sensors.getTempC(Sensor1);
  Temperatur[2] = sensors.getTempC(Sensor2); Temperatur[3] = sensors.getTempC(Sensor3);
  Temperatur[4] = sensors.getTempC(Sensor4); Temperatur[5] = sensors.getTempC(Sensor5);
  Temperatur[6] = sensors.getTempC(Sensor6); Temperatur[7] = sensors.getTempC(Sensor7);
  Temperatur[8] = sensors.getTempC(Sensor8);
   vorher=millis();
 }
}

nein hab ich nicht ich bau das mal mit ein mal sehen wie es dann läuft melde mich wieder

vielen Dank

Hi Kurti,

vielen DAnk für deine prompte Antwort! Jetzt klappt das Auslesen perfekt. Ich habe den Widerstand auf 4.1kOhm reduziert und das delay um die Antworten zu erwarten auf 2000ms gesetzt. Jetzt habe ich bereits sieben Fühler, die alle pefekt laufen!

Hallo laserbrain,

Danke für Deine Rückmeldung.
Schön, dass Deine Fühler jetzt funktionieren.

Gruss
Kurti