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
}
}
}