1-Wire Problem mit search

Hallo zusammen

Ich möchte mehrere Temperaturen mit dem Sensor DS18B20 auslesen. Zuerst möchte ich in der Setup Routine prüfen ob die definierten Sensoren gefunden werden.

Sobald aber die Search Funktion ausgeführt wird, werden die im Code gespeicherten Adressen der Sensoren überschrieben mit anderen Adressen, aber nicht alle.

Ich habe in der Beilage mal einen Sketch beigelegt der aufs wesentlichste reduziert ist um den ‘Fehler’ zu reproduzieren. Es muss für die Ausführung des Sketches kein Sensor angeschlossen sein.

Die Adressen werden hier definiert:

DeviceAddress Sensor1_ADR = { 0x28, 0x81, 0x53, 0xD0, 0x04, 0x00, 0x00, 0x87 };
DeviceAddress Sensor2_ADR = { 0x28, 0xF1, 0x05, 0x5A, 0x05, 0x00, 0x00, 0x7F };
DeviceAddress Sensor3_ADR = { 0x28, 0xC8, 0xB8, 0xD0, 0x04, 0x00, 0x00, 0xCE };

Das ist der Search Code, nachdem die Adressen überschrieben werden:

if (!oneWire.search(Sensor1_ADR)) Serial.println(“Can not find: Sensor1_ADR”);
if (!oneWire.search(Sensor2_ADR)) Serial.println(“Can not find: Sensor2_ADR”);
if (!oneWire.search(Sensor3_ADR)) Serial.println(“Can not find: Sensor3_ADR”);

Das Ergebnis sieht so aus:

Es wird nur der 2. Sensor als nicht gefunden ausgegeben (wenn kein Sensor angeschlossen ist). Und nach der Ausgabe ist die 3. Sensoradresse die gleiche wie die 1. Adresse, aber eine dies gar nicht definiert wurde?

Ausgabe der Sensorenadressen 1-3

28 81 53 D0 04 00 00 87
28 F1 05 5A 05 00 00 7F
28 C8 B8 D0 04 00 00 CE

Prüfen ob Sensoren gefunden werden mit search:

Can not find: Sensor2_ADR

Ausgabe der Sensoradressen 1-3. Die 3. Adresse ist mit der 1. Adresse überschrieben

28 E7 65 B1 04 00 00 F1
28 F1 05 5A 05 00 00 7F
28 E7 65 B1 04 00 00 F1

ich verwende die aktuellste Dallas Library 3.7.7 und onWire 2.3.3. Der ‘Fehler’ gibts aber auch mit früheren Libraries. Ich verwende einen MEGA 2560, es passiert aber auch bei anderen Arduinos.

Hat jemand eine Idee warum das passiert und wie das ‘korrigiert’ werden kann? Ist was falsch im Code (Deklaration)? Ich bin leider kein C++ Profi.

Danke

2560_Test.ino (1.96 KB)

Ich erlaube es mir mal, für die Tabletuser lesbar zu machen:

/**********************
   Include Libraries              // Arduino IDE Version Windows10  Vers 1.8.5
 **********************/

#include <OneWire.h>              //  Version 2.3.3 http://www.pjrc.com/teensy/td_libs_OneWire.html
#include <DallasTemperature.h>    //  Version 3.7.7 http://www.pjrc.com/teensy/td_libs_OneWire.html

/****************************************
   Define Constants
 ****************************************/

#define ONE_WIRE_BUS 22           // Data wire is plugged into GPIO 22 on the 2560

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Sensor1_ADR = { 0x28, 0x81, 0x53, 0xD0, 0x04, 0x00, 0x00, 0x87 };
DeviceAddress Sensor2_ADR = { 0x28, 0xF1, 0x05, 0x5A, 0x05, 0x00, 0x00, 0x7F };
DeviceAddress Sensor3_ADR = { 0x28, 0xC8, 0xB8, 0xD0, 0x04, 0x00, 0x00, 0xCE };


//****************************
//* oneWire Search  Problem  *
//****************************

void SensorVorhanden()
{

  if (!oneWire.search(Sensor1_ADR)) Serial.println("Can not find: Sensor1_ADR");
  if (!oneWire.search(Sensor2_ADR)) Serial.println("Can not find: Sensor2_ADR");
  if (!oneWire.search(Sensor3_ADR)) Serial.println("Can not find: Sensor3_ADR");

}


void SensorAdressenDrucken()  {

  printAddress(Sensor1_ADR);
  printAddress(Sensor2_ADR);
  printAddress(Sensor3_ADR);
}


//**************************************
//* function to print a device address *
//**************************************

void printAddress(DeviceAddress deviceAddress)
{

  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}


void setup(void)
{

  Serial.begin(9600);
  delay(1000);

  sensors.begin();
  delay(1000);

  SensorAdressenDrucken();

  Serial.println();
  
  SensorVorhanden();

  Serial.println();
  
  SensorAdressenDrucken();
}

void loop(void)
{

}