Brauche Hilfe beim DS18B20 und seiner Adresse

Hallo zusammen,

ich würde euch gerne shcon wieder um Hilfe bitten (:

und zwar möchte ich mehrere DS18B20 auslesen und zwar wenn es geht ohne die lib.

bisher lese ich einen so aus:

float DS18B20()
{
byte data[12];
byte addr[8];

// überprüfen ob Sensor angeschlossen
if ( !HT.search(addr))
{
HT.reset_search();
return 999.9; // Fehlercode
}

HT.reset();
HT.select(addr);
HT.write(0x44, 1);

byte present = HT.reset();
HT.select(addr);
HT.write(0xBE);

for (int i = 0; i < 12; i++) // 12 bytes
{
data = HT.read();

  • }*
  • HT.reset_search();*
  • byte high = data[1];*
  • byte low = data[0];*
  • float SensorRead = ((high << 8) | low);*
  • float Temperatur = SensorRead / 16;*
  • return Temperatur;*
    }
    ich vermute mal, dabei wird einfach nach dem Nächstbesten gesucht und der dann ausgelesen.....
    ich habe jetzt folgende Adressen ermittelt:
    Device is a DS18B20 : 0x28, 0xFF, 0x40, 0xA4, 0x64, 0x15, 00x2, 0x92
    Device is a DS18B20 : 0x28, 0xFF, 0xA8, 0xCD, 0x64, 0x15, 00x2, 0x75
    Device is a DS18B20 : 0x28, 0xFF, 0x39, 0x83, 00x1, 0x15, 00x3, 0x34
    Device is a DS18B20 : 0x28, 0xFF, 0x6B, 0xF3, 0x64, 0x15, 00x2, 0x44
    Ich verstehe jetzt nur nicht, wie ich diese Adressen anstelle von "addr" verwenden kann.....
    hab schon gesucht, aber das meiste war mit lib und in der lib selber hab ich auch keine Antwort gefunden....
    liegt sicher an der falschen Deklarierung oder so... mit bytes usw kenn ich mich noch nicht ganz so gut aus.

Warum wollst du das ohne Libary machen? Die ist doch gerade für dich geeignet, wenn du das ganze nicht selber hinbekommst.

Wenn du dir mal die Beispiele anschaust, solltest du schon erkennen, wie die Adresse gespeichert wird.

http://playground.arduino.cc/Learning/OneWire-DE
byte addr[MAX_DS1820_SENSORS][8];

Hallo,

wenn du mit der Lib die Bsp. durchgehst, wirst du irgendwann solche Zeilen sehen.

Bsp. von mir.

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
// Device Adressen der einzelnen ds1820 Temperatursensoren angeben
DeviceAddress sensor1 = { 0x28, 0xFF, 0x4A, 0xAD, 0x6B, 0x14, 0x03, 0x79 };   // externer "1."
DeviceAddress sensor2 = { 0x28, 0xFF, 0x36, 0xB0, 0x6B, 0x14, 0x03, 0x90 };   // externer "2."
DeviceAddress sensor3 = { 0x10, 0x47, 0x27, 0xD9, 0x02, 0x08, 0x00, 0x09 };   // Sensor auf dem Board

Wobei du mit der lib die freie Wahl hast ob feste Adressen oder immer wieder neue Erkennung verwendet wird.
Die festen Adressen sind mir jedoch lieber, da weis ich welche Adresse welcher Sensor ist. Nicht das plötzlich der 10. zum 5. wird oder einer nicht erkannt wird und alles durcheinander kommt.

auf die lib verzichten würde ich gerne, weil ich vieles nicht brauche und weil das Auslesen von einem Sensor auch ohne sehr gut geklappt hat.........
und ich denke, ich lerne so auch noch was dazu (;

mein Problem ist glaube ich ehr, das ich nicht weiß, wie ich einer Variablen, die Adresse zuweise ??

hiermit hatte ich es schon versucht, bekomme aber Fehlermeldungen......

DeviceAddress sensor3 = { 0x10, 0x47, 0x27, 0xD9, 0x02, 0x08, 0x00, 0x09 };

Wenns jetzt nur um ein Pin gehen würde, wäre das ja ganz einfach........

int Sensor1Pin = 1;
int Sensor2Pin = 2;

............................

Temperatur1 = readSensor(Sensor1Pin);

Temperatur2 = readSensor(Sensor2Pin);

void readSensor(int Pin)
{
..............

}

Was ich nicht auf die Reihe bekomme, ist es die gesamte Sensor-Addresse einer Variablen zuzuweisen.....

hab ich das richtig verstanden, das addr[8] ein Array ist und das je ein Hexwert? an einer Position gespeichert ist ?

Jetzt schmeißt du verschiedene Dinge durcheinander. DeviceAddress stammt aus das DallasTemperature Library. Und ist nichts anderes als:

typedef uint8_t DeviceAddress[8];

Also ein Alias für ein Byte Array

Wenn du das ohne die Lib schreibt, kennt das der Compiler nicht. Wie auch?

vielen Dank erstmal !
Das "DeviceAddress" was mit der lib zutun hat, dachte ich mir schon, habs aber trotzdem mal probiert (;

Ich habs jetzt so probiert, allerdings wird ein temperaturwert angezeigt, obwohl es für die Adresse kein Sensor gibt und die /*-Zeilen funktionieren nicht...........

#include <OneWire.h>

const int DS18B20_DATA_Pin = 35; // PIN, an den das DATA-Bein des Temperatur-Sensor angeschlossen ist

OneWire ds(DS18B20_DATA_Pin); // DS18S20-Setup
typedef uint8_t DeviceAddress[8];

DeviceAddress sensor2 = { 0x10, 0x47, 0x27, 0xD9, 0x02, 0x08, 0x00, 0x07 };

/*
DeviceAddress sensor1 = {0x28, 0xFF, 0x40, 0xA4, 0x64, 0x15, 00x2, 0x92}; // Raumtemperatur
DeviceAddress sensor2 = {0x28, 0xFF, 0xA8, 0xCD, 0x64, 0x15, 00x2, 0x75}; // Heiztemperatur
DeviceAddress sensor3 = {0x28, 0xFF, 0x39, 0x83, 00x1, 0x15, 00x3, 0x34}; // Sumpftemperatur + Kopftemperatur
DeviceAddress sensor4 = {0x28, 0xFF, 0x6B, 0xF3, 0x64, 0x15, 00x2, 0x44}; // Kühlwassertemperatur
*/

float temp; // Temperatur-Variable deklarieren

void setup()
{

Serial.begin(9600);

}

void loop()

{

Serial.print("Temperatur1: ");
Serial.println(DS18B20(sensor2));

/*
Serial.print("Temperatur1: ");
Serial.println(DS18B20(Sensor1));

Serial.print("Temperatur2: ");
Serial.println(DS18B20(Sensor2));

Serial.print("Temperatur3: ");
Serial.println(DS18B20(Sensor3));

Serial.print("Temperatur4: ");
Serial.println(DS18B20(Sensor4));

*/

}

float DS18B20(byte addr[8])
{
byte data[12];

// überprüfen ob Sensor angeschlossen
if ( !ds.search(addr))
{
ds.reset_search();
return 99.99; // Fehlercode
}

ds.reset();
ds.select(addr);
ds.write(0x44,1);

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE);

for (int i = 0; i < 12; i++) // 12 bytes
{
data = ds.read();

  • }*

  • ds.reset_search();*

  • byte high = data[1];*

  • byte low = data[0];*

  • float SensorRead = ((high << 8) | low);*

  • float Temperatur = SensorRead / 16;*

  • return Temperatur;*
    }

bekomme immer die Fehlermeldung
sketch_oct15c:14: error: invalid suffix "x2" on integer constant

Nehm die mal C-Lektüre zu Hand im Bezug auf mehrdimensionale Arrays. Nur weil jemand da die Idee hatte, daraus ein typedef zu machen (was bei Arduino sogar teilweise Probleme machen soll), heißt es nicht, dass es die elegante Lösung ist. Finde dort wird auch zu viel verschleiert, man muss schon wissen dass es ein typedef war. Wenn sowas dann aber in externen Libs versteckt ist, ist das nur hinderlich

// komplett weglassen, braucht man nicht!
//typedef uint8_t DeviceAddress[8];

const uint8_t ds18b20_max_devs = 5;
const uint8_t SENSOR1 = 0;
const uint8_t SENSOR2 = 1;
const uint8_t SENSOR3 = 2;
const uint8_t SENSOR4 = 3;
const uint8_t SENSOR5 = 4;
// könnte man auch mit enum noch verkürzen


uint8_t ds18b20_dev[ds18b20_max_devs][8];

// ..
void setup()
{
ds18b20_dev[SENSOR1][] = {0x28, /** ..... */0x92};
// ...
}

ok vielen dank ! werds mal ausprobieren !

ja, c-lektüre, wäre gut.........
aber zu Arrays hab ich auch schon einiges gelesen, aber bleibt irgendwie nicht hängen (;
gibt da teilbereiche, die mir sehr gut liegen und andere leider gar nicht (;

aber eine frage hab ich noch.....(nur zum verständnis)....

warum ging das:
typedef uint8_t DeviceAddress[8];

DeviceAddress sensor2 = { 0x10, 0x47, 0x27, 0xD9, 0x02, 0x08, 0x00, 0x07 };

das aber nicht:
typedef uint8_t DeviceAddress[8];

DeviceAddress sensor1 = {0x28, 0xFF, 0x40, 0xA4, 0x64, 0x15, 00x2, 0x92};

bei dem hab ich die fehlermeldung bekommen.........

Ich bekomme die gleiche Fehlermeldung leider immernoch + ein paar andere.

Muss ich die denn in ein mehrdimensionales Array packen ?

Vielen Dank noch mal !

Ich bin anscheinend doch nicht zu blöd, wenigstens ein bischen mit Array umzugehen, das Problem lag woanders...........

Habe diesen Sketch zur Ermittlung der Adressen verwendet:

AAAAAAABER !:

00x2

Der Fehler sollte offensichtlich sein

Mit mehrdimensionalen Arrays hat das erstmal gar nichts zu tun. Aber sich ein Array aus DeviceAddress anzulegen ist auch gar kein Problem