mehrere Sensoren per Struct initialisieren

Hallo Leute.

Bin nicht ganz sicher, ob der Titel korrekt mein Problem beschreibt, also hier noch mal mit Worten:
Ich möchte mehrere Sensoren (hier zunächst mal einfache DHTxx) zusammengefasst initialisieren und später abfragen. Das Ganze ist eher als Übung zum Lernen gedacht, da ich noch immer regelmäßig über Datentypen, Zeiger und Konstrukte stolpere.
Hier zunächst mein aktueller Stand:

#include "DHT.h"

struct dht_t{char label[7]; char type[7]; byte pin;};

dht_t dht[]={
  {"dht01","DHT11",2},
  {"dht02","DHT22",3}
};

#define DHTANZAHL (sizeof(dht)/sizeof(dht[0]))

//DHT dht1; //Originalaufruf
DHT dht[1].label;  //mein Versuch, soll später in einer Schleife laufen

void setup()
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
  Serial.println();
  Serial.print("Anzahl: ");Serial.println(DHTANZAHL);
  for (int i=0; i<DHTANZAHL; i++){
    Serial.print("Label:  ");Serial.println(dht[i].label);
    Serial.print("Typ:    ");Serial.println(dht[i].type);
    Serial.print("Pin:    ");Serial.println(dht[i].pin);
  }
  //  dht.setup(2); // Original
  dht[1].label.setup(dht[1].pin);  //mein Versuch, soll später in der Schleife laufen
}

void loop()
{
  //hier die Abfrage per Schleife...
}

Die Deklarationen scheinen schon mal (Dank Jurs!) gelungen zu sein, zumindest sehe ich im Seriellen Monitor das, was ich erwartet habe.
Allerdings bin ich wohl doch etwas zu blauäugig rangegangen, was mir die folgende Fehlermeldung unmißverständlich klar macht:

DHT_Struc.ino:13:11: error: expected initializer before '.' token
DHT_Struc.ino: In function 'void setup()':
DHT_Struc.ino:28:16: error: request for member 'setup' in 'dht[1].dht_t::label', which is of non-class type 'char [7]'
Fehler beim Kompilieren.

Einfaches Ersetzen durch zusammengbastelte Strings ist wohl nicht, wäre ja auch zu schön gewesen.
Kann mir jemand auf die Sprünge helfen?

Besten Dank, eMeS.

Du versuchst dht zweimal zu deklarieren, das geht schon mal garnicht. Die Namen müssen unterschiedlich sein.

Ich weiß nicht, ob in C++ eine statische Initialisierung eines Arrays mit Objekten funktioniert. Dazu müßtest Du ein array deklarieren, und einen Konstruktor benutzen, der die Parameter übernimmt.
DHT dht[3] = {DHT(...), DHT(...), DHT(...)}; //oder so ähnlich, mein C++ ist ziemlich eingerostet
Wobei ... die Parameter sind, die der (ein) Konstruktor DHT::DHT erwartet. Vermutlich mußt Du einen passenden Konstruktor selbst schreiben und zur Klasse DHT hinzufügen.

Möglicherweise muß die Deklaration und Initialisierung in eine *.cpp Datei, damit die IDE nicht versucht, darin irgendwas zu ändern, so wie es bei *.ino Dateien macht.

eMeS:
Kann mir jemand auf die Sprünge helfen?

Arrays können grundsätzlich nur aus GLEICHARTIGEN Elementen bestehen.

Bei Dir beispielsweise aus gleichartigen struct-Strukturen, die aus rein aus Strings und Bytes bestehen:

dht_t dht[]={
  {"dht01","DHT11",2},
  {"dht02","DHT22",3}
};

Ein Haufen an Strings und Bytes ist allerdings (glaube ich) nicht das, was Du eigentlich haben möchtest.

Vielleicht möchtest Du eher sowas mit einem Array aus Sensor-Objekten:

#include "DHT.h"

DHT sensors[]={
  DHT(2, DHT11),
  DHT(3, DHT22),
}; 
#define DHTANZAHL (sizeof(sensors)/sizeof(sensors[0]))

void setup() {
  Serial.begin(9600);
  for (int i=0;i<DHTANZAHL;i++) sensors[i].begin();
}


void loop() {
  for (int i=0; i<DHTANZAHL; i++)
  {
    Serial.print("Index:   ");Serial.println(i);
    float hum = sensors[i].readHumidity();
    Serial.print("Feuchte: ");Serial.println(hum);
    float temp = sensors[i].readTemperature();
    Serial.print("Temp:    ");Serial.println(temp);
  }
  delay(2000);
}
class Dummy
{
  private: 
  int id;
  
  public:
  Dummy(int id):id(id){}  
  void setup()
  {
    Serial.println(id);
  }
};


typedef struct
{
  char name[10];
  Dummy obj;
} Struktur;

Struktur benamteobjekte[] =
{
  {"Eins",Dummy(1)},  
  {"Zwei",Dummy(2)},  
  {"Drei",Dummy(3)},  
};






void setup() 
{
  Serial.begin(9600);
  for(int i = 0; i<3; i++)
  {
    Serial.print(benamteobjekte[i].name);
    Serial.print(" ");
    benamteobjekte[i].obj.setup();  
  }

}

void loop() {}

Vielen Dank für Eure gewohnt schnelle Hilfe, wobei ich gestehen muß, das ich bisher lediglich die von Jurs auf Anhieb deuten und verstehen konnte. Funktioniert bestens! DrDietrich's und vor allem die von combie muß ich mir ganz in Ruhe zu Gemüte führen. Werde ich aber auf jeden Fall tun, versprochen.
Nochmals vielen Dank Euch Dreien und weiterhin frohes Schaffe.

Gruß eMeS

eMeS:
Vielen Dank für Eure gewohnt schnelle Hilfe,

Wenn Du wieder mal Hilfe brauchst (und bekommst), tust Du zumindest mir einen Gefallen, wenn Du den Thread „zumachst“. Ändere z. B. den Betreff des ersten Postings so, dass er [erled] oder so enthält.

Gruß

Gregor

Gemach mein Freund, ganz soweit sind wir noch nicht. Zumindest für mich ist hier noch nichts erledigt. Gesteh mir bitte noch etwas Denkzeit zu.

Gruß eMeS

eMeS:
Gemach mein Freund, ganz soweit sind wir noch nicht ....

Ups, sorry, da hatte ich wohl zu hektisch quergelesen. Na denn ... viel Erfolg weiterhin :slight_smile:

Gruß

Gregor