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?
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.
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.
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.