Temperatursensor eine Adresse zuweisen

Hier habe ich einen skript der auf dem Display 2 Temperaturen anzeigt:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

#define ONE_WIRE_BUS 10
LiquidCrystal lcd(12, 11, 5, 4, 3, 2, 1);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
lcd.begin(16, 2);
sensors.begin();
}

void loop() {
sensors.requestTemperatures();
lcd.setCursor(0, 0);
lcd.print("T1: ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("C");

lcd.setCursor(0, 1);
lcd.print("T2: ");
lcd.print(sensors.getTempCByIndex(1));
lcd.print("C");
}

Mein Problem ist das wenn ich die Temperatursensoren (ds18b20) vertausche das den bei T1 die temp. von sensor 2 und bei T2 die von sensor 1.Und wenn ich nur einen drin lasse denn zeigt er bei beiden die temperatur vom dringelassenen.
Ich möchte aber das ich die Sensoren beliebig vertauschen kann und sie sich jeweils anpassen(T1 immer sensor1, T2 immer sensor2).Und wenn ich einen rausziehe das denn dort 0.00 steht.

Dafür muss ich denk ich mal den Sensoren eine adresse zuteilen, doch wie mache ich das?

Mfg

strohhirn

Jeder DS18b20 hat eine eindeutige 64-bit Seriennummer. Dadurch kannst Du jeden einzelnden Sensor am Bus abfragen.
genaueres kann ich Dir im Moment nicht sagen.

http://www.arduino.cc/playground/Learning/OneWire

Grüße Uwe

Danke Uwe, aber das hilft mir leider nicht weiter.
Das sagt mir nichts, da ich mich noch nicht so gut mit arduino und der ganzen Technik auskenne.

Hallo,

mit

DeviceAddress fuehler;
sensors.getAddress(fuehler, 0);

bekommst du eindeutige Adresse des 1. Fühlers heraus. Am einfachsten ermittelst du sie probehalber und gibst sie aus.

Dann greifst du nicht über den Index sondern über die Adresse zu

sensors.getTempF(fuehler)

Mit dieser Routine kannst du testen, ob der Sensor angeschlossen ist

sensors.isConnected(fuehler);

Hallo Bernd,
ich glaube das stimmt nicht ganz, ich hab andere Erfahrungen gemacht.
Wenn ein Sensor defekt ist und du diesen wechselst, dann ist Sensor1 auf einmal nicht mehr Sensor1,
sondern die werden am OneWire Bus anders geordnet.
So ist jedenfalls meine Erfahrung.
Deshalb hab ich es anders gemacht, nämlich die Adressen fest zugeordnet:

DeviceAddress Sensor0 = {0x28, 0x08, 0xF9, 0xDE, 0x02, 0x00, 0x00, 0xB1};
DeviceAddress Sensor1 = {0x28, 0xE8, 0x7F, 0xDA, 0x02, 0x00, 0x00, 0xC1};
DeviceAddress Sensor2 = {0x28, 0x58, 0x75, 0xDA, 0x02, 0x00, 0x00, 0x7B};

So kriegt man mit dem Befehl Temperatur[0] = sensors.getTempC(Sensor0);

immer bei Temperatur[0] die Temperatur von Sensor0 egal wo er angesteckt ist.

gruß

Hallo Maverick,

das habe ich doch geschrieben, aber man muss ja erst die Adressen einmalig ermitteln, bevor man sie im Programm einbauen kann. Und das sollte meine 1. Routine machen. Oder hast du von deinem Lieferanten eine Liste der Adressen bekommen?

Richtig ist natürlich die Funktion getTempC und nicht getTempF

Bernd

Vielen Dank Bernd und maverick1509,
aber was ist denn jetzt richtig und wo muss ich das einfügen?Vor den setup teil oder im setup teil oder im loop teil?

Hallo,
als erstes mußt du die Adresse deiner Fühler auslesen z.B. hiermit

#include <OneWire.h>
OneWire  ds(12);  // Connect your 1-wire device to pin 12
void setup(void) {
  Serial.begin(9600);
  discoverOneWireDevices();
}
void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  Serial.print("Looking for 1-Wire devices...\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rFound \'1-Wire\' device with address:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC is not valid!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rThat's it.\r\n");
  ds.reset_search();
  return;
}

void loop(void) {
  // nothing to see here
}

und dann in deinem Programm die Adresse wie eine Variable deklarieren z.B.

DeviceAddress Sensor0 = {0x28, 0x08, 0xF9, 0xDE, 0x02, 0x00, 0x00, 0xB1};
DeviceAddress Sensor1 = {0x28, 0xE8, 0x7F, 0xDA, 0x02, 0x00, 0x00, 0xC1};
float Temperatur[2];

dann kannst du später im Programm mit
Temperatur[0] = sensors.getTempC(Sensor0);
Temperatur[1] = sensors.getTempC(Sensor1);
die beiden Temperaturen ermitteln und ausgeben.