DS18b20 Sensordaten immer vertauscht

Hi

Habe ein Problem mit meinen Sensordaten.
Habe 3 Ds18b20 diese per DeviceAddress zugeteilt.

Jetzt hab ich das Problem das immer mein Display unter Templinks mir den wert von TempFilter anzeigt.
Was mach ich da falsch. hab schon mehrere versuche durch ausm Forum hier un div. Websiten.

Hier mal mein Code

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>

//Oled 
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

//Temperatur
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress linksThermometer = {0x28, 0xFF, 0xD, 0xFF, 0x90, 0x15, 0x3, 0x96};
DeviceAddress rechtsThermometer = {0x28, 0xFF, 0xE7, 0x58, 0x91, 0x15, 0x1, 0xC9};
DeviceAddress filterThermometer = {0x28, 0xFF, 0x75, 0x50, 0x52, 0x16, 0x3, 0xBF};

//Device Address: 28FFE758911501C9

//--------------------------------T E M P E R A T U R - M O D U L E--------------------------------------
//double tempLinks = 0;
//double tempRechts = 0;
//double tempFilter =0;

//-------------------------------- Nachfüllanlage  ---------------------------
const int N_Sensor = 4;
int liquidSensorValue = 0;
const int FuelPin = 9;
//-------------------------------- Wasserstand -------------------------------
const int W1_Sensor = 5;
int liquidSensorValue1 = 0;
const int W2_Sensor = 11;
int liquidSensorValue2 = 0;
//--------------------------------Nachfüllanlage On/Off-----------------------
const int Schalter = 7;
int Schalter_1 =0;
//--------------------------------------------------------- Relais Ausgänge -----------------------------------------------
const int Relais0 = 8;
//-------------------------------- MILLIS für Tempmesseung --------------------------------
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 10000 ;    // Interval zwischen zwei Änderungen 300000 = 5min

void setup() 
{
   Serial.begin(9600);
  //Oled
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
   //display.display();   

  //Thermometer
  sensors.begin();             // Start up the DS18B20 Temp library
  
 sensors.setResolution(linksThermometer, 9);  
 sensors.setResolution(rechtsThermometer, 9);
 sensors.setResolution(filterThermometer, 9);
  
  if (!sensors.getAddress(linksThermometer, 0)) Serial.println("Unable to find address for Device 0"); 
  if (!sensors.getAddress(rechtsThermometer, 1)) Serial.println("Unable to find address for Device 1");
  if (!sensors.getAddress(filterThermometer, 2)) Serial.println("Unable to find address for Device 2");  

//Pinout
pinMode(N_Sensor, INPUT_PULLUP);   //Filter becken wasserstand
pinMode(W1_Sensor, INPUT_PULLUP);  //Linkes becken wasserstand
pinMode(W2_Sensor, INPUT_PULLUP);  //Rechtes becken wasserstand
pinMode(Schalter, INPUT_PULLUP);   //Schalter
pinMode(FuelPin, OUTPUT);
pinMode(Relais0, OUTPUT); 

//digitalWrite(Relais0, LOW);
//digitalWrite(FuelPin, LOW);

}

void loop() 
{ 
  
  liquidSensorValue = digitalRead(N_Sensor);
  liquidSensorValue1 = digitalRead(W1_Sensor);  //Links
  liquidSensorValue2 = digitalRead(W2_Sensor); //Rechts
  Schalter_1 = !digitalRead(Schalter);

//Display(); 
  
  if (millis() - previousMillis >= interval) {
    previousMillis = millis();   // aktuelle Zeit abspeichern   
  sensors.requestTemperatures(); // Send the command to get temperatures 
 float tempLinks = sensors.getTempC(linksThermometer);
 float tempRechts = sensors.getTempC(rechtsThermometer);  
 float tempFilter = sensors.getTempC(filterThermometer);  
  
    display.clearDisplay();
    display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(30,0);
  display.println("Temperaturen");
       // display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,10);
  display.println("Links  Rechts  Filter");  
  display.setTextColor(WHITE);
  display.setCursor(0,20);
  display.println(tempLinks);
    display.setCursor(42,20);
  display.println(tempRechts);
    display.setCursor(90,20);
  display.println(tempFilter);  
  display.display();
 //delay(1000);
 //display.clearDisplay();  

  } 
  else
  {
  }
  
// Wasserstand Überwachung

  if ((liquidSensorValue1 == 1 ) || (liquidSensorValue2 == 1 ))
 {
   digitalWrite (Relais0, HIGH);   // Relais Aus
   //Serial.print("Relais Aus");
 }
     else
     {
       digitalWrite (Relais0, LOW); 
      //Serial.print("Relais An"); 
     }
     
// Nachfüllautomatik 

if (Schalter_1 == HIGH )
    {
     // Serial.print("Schalter An");
      
if (liquidSensorValue == 0)

    {
      digitalWrite(FuelPin, HIGH);
      // Serial.print("FuelPin on ");
      }
      
           else
            {
        digitalWrite(FuelPin, LOW);
       // Serial.print("FuelPin off ");
        }  
      
    }
    else
    {
   // Serial.print("Schalter Aus");
    }
}

Hallo,

float tempLinks = sensors.getTempC(linksThermometer);
 float tempRechts = sensors.getTempC(rechtsThermometer);  
 float tempFilter = sensors.getTempC(filterThermometer);

für mich sieht das so aus als würde einer bestimmten Variable immer ein anderer Wert zugewiesen.

probiere es mal so:

float tempLinks = sensors.getTempCA(linksThermometer);
 float tempRechts = sensors.getTempCB(rechtsThermometer);  
 float tempFilter = sensors.getTempCC(filterThermometer);

Gruß und Spaß
Andreas
P.S. ich finde auch, es ist zuviel Mist dabei um drei Sensoren auszulesen...

Ich sehe auch das da einiges verquer läuft.

Sieh dir mal die Beispiele von Dallas an und mache es per "Index", ist einfacher und übersichtlicher.

Wie Andreas schon schreibt, der Fehler passiert bei der Übergabe in die Variable.

Das ist ja der Komplette sketch wo auch andere sachen noch passieren.
Geht darum das wenn ich mal nen Sensor abziehe und neu drauf mache die anzeige nicht verschoben wird weil der index neu sortiert wird.

Deswegen wollte ich die Sensoren ja mit der festen Adresse auslesen und das in der float Variable auslesen.

Hallo,
egal was Du anstöpselst oder abstöpselst- am Index änder sich nichts.
3 Sensoren, Index 0 bis 2.

Hole Index 0-Temp1
Hole Index 1-Temp2
Hole Index 2-Temp3

ziehst Du jetzt Sensor 2, dann kommt an Index 1 kein Wert.
Kommt an Index-1 jetzt der Wert von Index-2, dann ist das wohl ein Index ohne
Zuordnung und Fehlerabfrage.
So ein Index ist aber nicht zu gebrauchen.

Anders: Ein Buch hat auch einen Index, Seitenzahlen.

Seite 1 bis 200.
Reiße ich jetzt Seite 100 raus, dann wird doch nicht die Seitenzahl 101 zu
Seite 100!
Alles klar?
Gruß und Spaß
Andreas

Mach jeden Sensor an einen eigenen Datenpin, dann kannst du stöpseln wie du willst, es ist immer index 0.

Wenn man bei 5 Sensoren am Bus den 3. wegnimmt, wird 4 zu 3 und 5 zu 4. Das ist natürlich Mist.

Hallo,
er kann es ja so betreiben, aber dann muss er den Fehler abfangen.

Jeder IndexWert bekommt eine Adresse zugeteilt.
Gruß und Spaß
Andreas

SkobyMobil:
Jeder IndexWert bekommt eine Adresse zugeteilt.

Bei mir nahm er die Sensoren in der Reihenfolge der Adresswertigkeit (sagt man so?). Fehlte einer z.B. wg. Wackelkontakt, war alles Durcheinander. und der Letzte index, der ja dann keinen entsprechenden physischen Sensor abfragen konnte, bekam den Wert des vorletzten index