DS18B20, total of 3 sensors but only 2 are working

I have wired up 3 x DS18B20 sensors and are using this code (see below) to read the data. However, the output gives me correct temperatures for sensors 1 & ,3 but 2 always reads -127°C.

I have swapped the sensors around, connector wires, inputs, etc. all to no avail so it is clearly a problem with the code. I have checked it over but can't see anything obvious. Can you help please? The code is below. I currently use no pullup resistor because the sensors have a length of 50cm.

//Einbinden der Bibliotheken
#include <OneWire.h>
#include <DallasTemperature.h>

const int Relai1 = 21; // Relai connected to pin
const int Relai2 = 18; // Relai connected to pin
const int Relai3 = 5; // Relai connected to pin

const float MIN_TEMP1 = 28; //Temperaturschwellwert zum schalten des Relais

OneWire ds18_1(23); // Anschluss des DS18B20 für "Wabe" an PIN 23 (4k7 zwischen Plus und Data)
OneWire ds18_2(22); // Anschluss des DS18B20 für "unten" an PIN 22 (4k7 zwischen Plus und Data)
OneWire ds18_3(19); // Anschluss des DS18B20 für "unten" an PIN 1 (4k7 zwischen Plus und Data)

DallasTemperature sensors1(&ds18_1);
DallasTemperature sensors2(&ds18_2);
DallasTemperature sensors3(&ds18_3);

void setup()

{
Serial.begin(115200); //Starten der seriellen Kommunikation mit 115200 baud
pinMode(Relai1, OUTPUT); // Relai 1
pinMode(Relai2, OUTPUT); // Relai 2
pinMode(Relai3 , OUTPUT); // Relai 3

sensors1.begin(); //Starten der Kommunikation mit dem Sensor
sensors2.begin(); //Starten der Kommunikation mit dem Sensor
sensors3.begin(); //Starten der Kommunikation mit dem Sensor
}

void loop()

{
if(sensors1.getDS18Count()==0)
{
Serial.println("Es wurde Temperatursensor1 nicht gefunden!");
Serial.println("Bitte überprüfe deine Schaltung!");
}
sensors1.requestTemperatures();

if(sensors2.getDS18Count()==0)
{
Serial.println("Es wurde Temperatursensor2 nicht gefunden!");
Serial.println("Bitte überprüfe deine Schaltung!");
}
sensors2.requestTemperatures();

if(sensors3.getDS18Count()==0)
{
Serial.println("Es wurde Temperatursensor3 nicht gefunden!");
Serial.println("Bitte überprüfe deine Schaltung!");
}
sensors3.requestTemperatures();

//Ausgabe aller Werte der angeschlossenen Temperatursensoren.
float temp1 = sensors1.getTempCByIndex(0); // Auslesen Temperaturen der DS18B20 am Bus auslesen
float temp2 = sensors2.getTempCByIndex(0); // Auslesen Temperaturen der DS18B20 am Bus auslesen
float temp3 = sensors3.getTempCByIndex(0); // Auslesen Temperaturen der DS18B20 am Bus auslesen

printValue(temp1, "°C"); //ausgeben der Temperatur auf dem seriellen Monitor

printValue(temp2, "°C"); //ausgeben der Temperatur auf dem seriellen Monitor

printValue(temp3, "°C"); //ausgeben der Temperatur auf dem seriellen Monitor
Serial.print("\t\t"); // Gibt 2 Tab aus

//wenn die aktuelle Temperatur größer als die gespeicherte dann soll das Relais ausgelöst werden
if(MIN_TEMP1 < temp1){
digitalWrite(Relai1, HIGH);
} else {
digitalWrite(Relai1, LOW);
}

delay(2000); //eine Pause von 2 sek.
}

//ausgeben eines Textes auf den seriellen Monitor der Arduino IDE
void printValue(float value, String text){
Serial.print(value);
Serial.println(text);
}

I don't see an issue with the code on a brief inspection. If you swap sensor1 and sensor2 and the problem remains the same, I'd suspect a hardware error. Perhaps those pull-ups are more important than you thought :wink:

1 Like

I used the same library in a recent project and based my code (for reading two float variables) on one of its examples; it differs from yours:

sensors.requestTemperatures();
fullA = sensors.getTempCByIndex(0);
fullB = sensors.getTempCByIndex(1);

I’m not a C/C++ programmer. But FWIW is it possible that numbering should start from zero?

You "created" 3 onewire buses.
OneWire ds18_1(23);
OneWire ds18_2(22);
OneWire ds18_3(19);

This way you need to place a 4k7 resistor for each bus.
Did you do it like this?

See your sketch working correctly in the simulator:
" 3xDS18B20 - Wokwi ESP32, STM32, Arduino Simulator

1 Like

-127 means not connected.
The code is probably kosher, even if it is dumb, but your wiring isn't. This is possibly because of

Which equally dumb. I suspect the other two sensors are working more due to luck than competence.

3 Likes

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.