Problem mit DS18B20 Sensor GELÖST!

Liebe community,

Ich habe ein Problem mit den Messen der Temperatur mit einem DS18B20 Sensor. Er misst konstant -127 °C. Kann mir bitte jemand helfen?

Hier ist der Schaltplan:

Und hier der Sketch:

// Merkzettel/ Temperaturen/ Kompostwürmer:
// unter 5 Grad werden die Würmer anfangen zu sterben
// unter 16 Grad essen die Würmer weniger und vermehren sich langsamer
// über 27 Grad essen die Würmer weniger und vermehren sich langsamer
// über 36 Grad werden die Würmer sterben oder versuchen zu flüchten
// ideale Temperatur: zwischen 16 und 27 Grad

// Bibliotheken und Definieren für DS18B20
#include <OneWire.h>                                    // OneWire- Bibliothek für DS18B20
#include <DallasTemperature.h>                          // DallasTemperature- Bibliothek für DS18B20
#define ONE_WIRE_BUS 12                                 // Das Datenkabel vom DS18B20 ist an Pin 12 angeschlossen
#define TEMPERATURE_PRECISION 12                        // steuert die Genauigkeit der Temperaturmessung
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Bibliotheken und Definieren von LCD1602
#include <Wire.h>                                        // Bibliothek für 1602 LCD Display
#include <LiquidCrystal_I2C.h>                           // LiquidCrystal Bibliothek laden für LCD Display
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);  // so wenn ein 1602 display genutzt wird
const byte button_Pin = 10;                               // Pin für den Taster

// Temperatursteuerung
const bool stDseAn = HIGH;  // Wenn Steckdose falsch schaltet Logik tauschen
const bool stDseAus = !stDseAn;

const byte steckdoseLuefter = 11;
const byte maximalWertTemp = 30; // bei über 30 Grad wird der Lüfter angeschaltet
int16_t sensorWertTemp = 0;     // Sensorwert auf 0 setzen
int16_t altSensorWertTemp = 0;  // alten Sensorwert auf 0 setzen

void setup() {
  Serial.begin(9600);  // seriellen Monitor starten
  // Sensoren und LCD starten
  Serial.println(F("Hallo"));           // Test
  sensors. begin();                     // DS18B20 Sensor starten
  lcd.init();   // für den LCD- Monitor // initialisiert den LCD-Monitor, d.h. sie sorgt dafür, dass der Monitor richtig konfiguriert ist und bereit ist, Daten anzuzeigen
  pinMode(button_Pin, INPUT_PULLUP);

  //Pins deklarieren und Anfangszustand deklarieren (Alle Steckdosen einschalten am Anfang!!!)
  pinMode(steckdoseLuefter, OUTPUT);
  digitalWrite(steckdoseLuefter, stDseAn);   // Ausgangszustand für Luefter ist an
  lcd.noBacklight();                         // am Anfang den LCD ausschalten
}

void loop() {
  getSensors();
  setTempSwitch();
  setDisplayOnOff();
  setDisplay();
}

void getSensors() {

  sensors.requestTemperatures();      //  fordert vom DS18B20-Sensor die Temperaturmesswerte an
  Serial.print(F("Temperatur: "));
  sensorWertTemp = sensors.getTempCByIndex(0); // speichert die Temperaturmesswerte in einer Variablen
  Serial.print(sensorWertTemp);
  Serial.println("°C");
}

void setTempSwitch() {
  if (sensorWertTemp >= maximalWertTemp)  // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
  {
    Serial.println(F("Lüfter an"));
    digitalWrite(steckdoseLuefter, stDseAn);       // Lüfter starten
  } else if (sensorWertTemp < maximalWertTemp)  // Wenn die Temperatur gleich oder kleiner des festgelegten Minimus...
  {
    Serial.println(F("Lüfter aus"));
    digitalWrite(steckdoseLuefter, stDseAus);  // Lüfter ausschalten
  }
}

void setDisplayOnOff() {
  static uint32_t lastSwitch = 0;     // Merker für Auslösen der Taste
  static bool isOn = false;           // Merker für Zustand des Backlight
  static bool buttonPressed = false;  // Status des Tasters                            // Wenn die Variable in verschiedenen Funktionen des Sketches verwendet wird, muss sie als globale Variable deklariert werden.
  if (!digitalRead(button_Pin))       // Taster gedrückt?
  {
    if (!buttonPressed)  // vorher nicht gedrückt?
    {
      Serial.println(F("Button gedrückt"));
      buttonPressed = true;   // Tasterstatus auf gedrückt setzen
      isOn = !isOn;           // Toggle der Variablen für das Backlight // also umkehren, negieren der Variable
      lastSwitch = millis();  // Auslösezeit merken
    }
  } else  // Taster nicht (mehr) gedrückt? // also wenn der Taster HIGH ist...
  {
    if (millis() - lastSwitch > 100)  // entprellzeit ist abgelaufen
    {
      buttonPressed = false;  // Tasterstatus auf nicht gedrückt setzen
    }
  }
  isOn ? lcd.backlight() : lcd.noBacklight();  //ternärer Operator, eine kompakte Schreibweise für: if (isOn == true){lcd.backlight();}else{lcd.noBacklight()}
}

void setDisplay() {
  bool TempisNew = false;

  if (altSensorWertTemp != sensorWertTemp) {
    TempisNew = true;
    altSensorWertTemp = sensorWertTemp;
  }

  if (TempisNew) {
    lcd.setCursor(0, 0);
    lcd.print("Temp.: ");
    if (sensorWertTemp < 10) {
      lcd.print(' ');
    }
    lcd.print(sensorWertTemp);  // Temperatur  anzeigen
    lcd.print("\337C ");        // Grad und dahinter Leerzeichen
    lcd.setCursor(12, 0);
    if (digitalRead(steckdoseLuefter) == HIGH) { // wenn der Lüfter läuft
      lcd.print('w');  // w schreiben
    } else {
      lcd.print(' '); // das w überschreiben
    }
  }
}
1 Like

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Hi Künstler :wink:
Dann will ich mal ganz schnell helfen.
Der Sensor misst nicht -127°c sondern die Lib gibt Dir -127°C zurück.
Das ist der Wert, der abgegeben wird, wenn der den Sensor nicht findet.
Unbedingt Verkabelung prüfen.
Sehr oft: der Widerstand ist falsch oder gar nicht angeschlossen.

Das ist der Wert, der abgegeben wird, wenn der den Sensor nicht findet.

Das habe ich mir auch schon gedacht:) . Habe schon einen zweiten DS18B20 Sensor getestet um einen Defekt auszuschließen. Liegt es an dem Schaltplan, habe ich etwas falsch verdrahtet?

Der Plan sieht erstmal ok aus.
Kannst Du mal ein Foto von oben drauf machen, das man den ganzen Aufbau erkennt?

Vermutlich ja, allerdings ist dein Schaltbild sehr unübersichtlich und daher nicht einfach zu durchschauen.
Das dauert also etwas.

Mein Tipp, baue dein Projekt einfach nach einem Beispiel der Library auf. Wenn das funktioniert, Stück für Stück erweitern.


Hier ist ein Bild von oben, es ist aber leider ziemlich unübersichtlich :/.

1 Like

Mal noch ne Idee...
Schreib mal ganz unkonventionell in die erste Zeile im loop() ein delay(1000);
Ist nur rein zum testen....

Habe ich ausprobiert:

void loop() {
  delay(1000);
  getSensors();
  setTempSwitch();
  setDisplayOnOff();
  setDisplay();
}

Leider ohne Erfolg :wink: .

Ich habs:
In Deinem Bild geht eine dreierKlemme an den Sensor.
Der fängt rechts mit dem DataPin an, Mitte GND und links +5V
Daneben ist eine 2erKlemme.
Der GND von da geht an den DataPin auf dem Steckbrett ganz rechts über den Widerstand.
Der muss an den Mittelpin.
Der Plan weicht an der Stelle von deinem Aufbau ab.

1 Like

Leider ja, damit nur sehr schwer zu durchschauen.
Nochmal, baue ein Beispiel nach.

Das nutzt ihm herzlich wenig, wenn der elektrisch nicht stimmt.

Du Adlerauge! Respekt!!! Ich hänge direkt drüber und habe es nicht gesehen :P. Danke!!! :smiling_face_with_three_hearts:

Ich habe ja nicht geschrieben, er soll es fehlerhaft nachbauen.

Hat @fony mir auch schon nachgesagt :wink:
Na dann: Viel Spass damit!
Übrigens ist Dein Code sehr verdächtig. Man sieht, wo Du gelernt hast. :blush:

Danke, ja jetzt werde ich Spaß haben :). Mit guten Lehrern lernt man :wink: .

1 Like

Danke.

Mach ihn noch zu. Dann bin zufrieden für heute.

:+1:

Trotz gelöst muss ich jetzt da weiterschreiben, weil es ja hier nicht die Lösung für EIN Problem gibt.

Ich habe jetzt das Material bekommen, um mein Gerät zu entstören. Ich habe als erstens die Datenleitung für den DS18B20 gegen eine Geschirmte einadrige Leitung ausgetauscht, die ja direkt über die DC Treiber für die Lüftermotoren geht. Das hat nichts gebracht. Also gefühlt genauso oft Messstörung wie ohne diese Geschirmte Leitung. Ich dachte eigentlich mindestens an eine deutliche Verbesserung, aber war nix.
Schritt 2. Das Metallgewebe, dass ich heute auch bekommen habe, mit einem Flexiblen Draht verbunden, das Gewebe mit einem breiten Klebeband komplett verschlossen und über die DC Motortreiber gelegt, so dass die Treiber, genauso wie die Drähte zu den Motoren komplett abgeschirmt sind. UNd keinerlei Störungen mehr. Ich dachte es wird nicht Störungsfrei werden, aber def. ist es so. Das Metalgewebe schirmt den Rest in dem Gerät restlos von den Treibern ab.

Franz

Hi Franz54, ich glaube Du hast Dich im Thread vertan. Hier Pillzucht- Steuerung, Problem mit Relais Schaltung - #40 by LeonardoFiando hatte ich Probleme mit der EVM beim Betreiben mehrerer PC Lüfter über Mosfet Module (mit PWM).

Wie auch immer, vielen Dank für das Teilen Deiner sehr interessanten Erkenntnisse! :slight_smile: