versch. Arrays/Sensoren dynamisch ansprechen [DallasTemperature]

Hallo,

Ich arbeite mit mehreren Maxim (Dallas) DS18B20, Temperatur sensoren.
Diese werden anfangs alle mit einem jeweiligen Array initialisiert, welcher ihre BUS Identifikationsnummer beinhalten.

Dieser Bus kann ca 128 geräte aufnehmen.
Nun möchte ich nich für jeden einzeln eine Ausgabe programmieren sondern diese eben dynamisch gestalten. Dabei kommt mir die Frage auf wie ich das am besten anstelle.

Vielleicht mit einem Mehrdimensionalen Array?

Ich habe hier schon einem einen Lösungsansatz, welcher vielleicht etwas klarheit schafft, wo mein Problem liegt.

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

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

DeviceAddress thermo0 = { 0x28, 0xA0, 0x02, 0xB4, 0x04, 0x00, 0x00, 0xC0 };
DeviceAddress thermo1 = { 0x28, 0x08, 0x43, 0xB4, 0x04, 0x00, 0x00, 0x19 };
DeviceAddress thermo2 = { 0x28, 0xC4, 0x2B, 0xB4, 0x04, 0x00, 0x00, 0xD4 };
DeviceAddress thermo3 = { 0x28, 0xF6, 0x9E, 0xB4, 0x04, 0x00, 0x00, 0xCA };
DeviceAddress thermo4 = { 0x28, 0x9E, 0x13, 0xB4, 0x04, 0x00, 0x00, 0x8F };
DeviceAddress thermo5 = { 0x28, 0xB1, 0xAA, 0xB4, 0x04, 0x00, 0x00, 0xA1 };
DeviceAddress thermo6 = { 0x28, 0x49, 0x2C, 0xB4, 0x04, 0x00, 0x00, 0x25 };
DeviceAddress thermo7 = { 0x28, 0x59, 0x11, 0xB4, 0x04, 0x00, 0x00, 0x16 };
DeviceAddress thermo8 = { 0x28, 0xE3, 0x01, 0xB4, 0x04, 0x00, 0x00, 0xA2 };
DeviceAddress thermo9 = { 0x28, 0xBB, 0xC6, 0xB4, 0x04, 0x00, 0x00, 0x5E };

int i;

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit 
  sensors.setResolution(thermo0, 10);
  sensors.setResolution(thermo1, 10);
  sensors.setResolution(thermo2, 10);
  sensors.setResolution(thermo3, 10);
  sensors.setResolution(thermo4, 10);
  sensors.setResolution(thermo5, 10);
  sensors.setResolution(thermo6, 10);
  sensors.setResolution(thermo7, 10);
  sensors.setResolution(thermo8, 10);
  sensors.setResolution(thermo9, 10);

}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{ 
  delay(2000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();
  for(i = 0; i<10; i++){
  char b[7] = "thermo";
  b[6] = i;
  int t = 0;
  b = t;
  Serial.print("Device "%d" :", i);
  printTemperature(t);
  Serial.print("\n\r");
  }
}

Debug Konsole spuckt folgendes aus:

arduino_ds18b20_temperature_sensor.pde: In function 'void loop()':
arduino_ds18b20_temperature_sensor:69: error: incompatible types in assignment of 'int' to 'char [7]'
arduino_ds18b20_temperature_sensor:70: error: 'd' was not declared in this scope
arduino_ds18b20_temperature_sensor:71: error: invalid conversion from 'int' to 'uint8_t*'
arduino_ds18b20_temperature_sensor:71: error: initializing argument 1 of 'void printTemperature(uint8_t*)'

schonmal vielen dank für eure Hilfe! :slight_smile:

mrlowalowa:
Nun möchte ich nich für jeden einzeln eine Ausgabe programmieren sondern diese eben dynamisch gestalten. Dabei kommt mir die Frage auf wie ich das am besten anstelle.

Hm, ich verstehe nicht ganz, was Du möchtest.

Vielleicht möchtest Du nur die Temperaturen in einer Schleife ausgeben, sowas wie:

void loop(void)
{ 
  delay(2000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();
  for(i = 0; i<10; i++){
    Serial.print("thermo");
    Serial.print(i);
    Serial.print(": ");
    Serial.println(sensors.getTempCByIndex(i));
  }
}

Ansonsten mal genauer beschreiben, vielleicht fällt dann jemandem was ein.

oder meinst du so ?

declariere erst: float Temperatur[10];

und dann beim einlesen:

sensors.requestTemperatures();
Temperatur[0] = sensors.getTempC(Sensor0); Temperatur[1] = sensors.getTempC(Sensor1); delay(100);
Temperatur[2] = sensors.getTempC(Sensor2); Temperatur[3] = sensors.getTempC(Sensor3); delay(100);

und so weiter. Dann hast du alle Temperaturen in einem array stehen und kannst diese dann anhand des Index ausgeben.

Maverick1509 hat mich glaub ich am besten verstanden. ^^

jurs hat mich auch verstanden aber klappt das ja leider nicht, da ich mit int i nicht auf den Array mit der Nummer zugreifen kann, welche dann in die andere Funktion umgeleitet wird.

Wusste garnicht, dass man einem array ganze Funktionen zuordnen kann. Das probiere ich gleich einmal aus.
Wenn ich dann eure beiden kombiniere ist es quasi perfekt.

So läuft i nämlich immer durch und ruft gleichzeitig die passende Temperatur dazu auf.

Was ich eigentlich versucht hatte war einen Namen eines Arrays zu modifizieren. Quasi Name = termo

abrufen = Name "+"(erweitern um) i
Was dann eben thermo0 oder thermo1 etc ergeben sollte. Und das sollte dann nicht nur einen Namen ergeben, sondern den "Array" repräsentieren. dabei fällt mir gerade auf, dass die device Adressen garkeine Arrays sind aufgrund des fehlenden []...

Ich probiere jedoch nun mal mavericks lösungsansatz durch :slight_smile:

Für weitere Ideen bin ich gerne offen und danke schonmal!

mrlowalowa:
Wusste garnicht, dass man einem array ganze Funktionen zuordnen kann. Das probiere ich gleich einmal aus.
Wenn ich dann eure beiden kombiniere ist es quasi perfekt.

So läuft i nämlich immer durch und ruft gleichzeitig die passende Temperatur dazu auf.

Man kann einem Array keine Funktion zuordnen. Was "sensors.getTempCByIndex(i)" macht, ist eine spezielle Methode der Klasse DallasTemperature zu verwenden. Diese Methode braucht keine Adresse des Sensors, sondern verwendet einfach einen Index. Der Index entspricht dem "i-ten" Sensor in Deiner One-Wire-Kette, angefangen bei 0.

Mario.

Hey cool,

Hab die Funktion gerade auch per zufall gefunden, während ich in den beispiel Sketches geforstet habe.

Den Beispiel Code kurzerhand in das hier abgewandelt und ich bekomme das was ich wollte:

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

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 7

// 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);
int i;

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  for(i = 0; i<11; i++){
    Serial.print("Temperature for the device");
    Serial.print(i);
    Serial.print (" (index ");
    Serial.print(i);
    Serial.print(") is: ");
    Serial.println(sensors.getTempCByIndex(i));
  } 
  Serial.println("");
  
  delay(1000);
}

Die frage ist nur, ob der index immer bleibt? wenn ich jetzt zum Beispiel zu jedem sensor mit einem kabel einzeln hingehe(sternförmig) und am datenpin die Sternformation endet.. wie weiß ich dann welcher Sensor welchen index hat?

Oder sollte ich einfach versuchen ein kette zubilden. Das letzte Glied ist dann sozusagen der höchste Index?

mkl0815:
Man kann einem Array keine Funktion zuordnen.

Doch, kann man. Arrays aus function pointern:

Serenifly:

mkl0815:
Man kann einem Array keine Funktion zuordnen.

Doch, kann man. Arrays aus function pointern:

The Function Pointer Tutorials - Syntax

Das stimmt, hilft aber bei einem Anfänger kaum und stiftet nur noch mehr Verwirrung. Zumal das Aufrufen von Methoden einer Klasse über den "." oder "->" Operator ja nix mit Arrays zu tun hat.