DHT-lib include path in eigener libary klappt nicht

Hallo zusammen

Ich habe mir ein eigene klasse geschrieben:

#include "Arduino.h"
#include "DHT.h"   //<--- ERROR beim compilieren!!!
class Sensor {
  public:
    void begin(void);
    uint16_t LDR1(void);
  private:
}; 




Sensor.cpp
#include "Arduino.h"
#include "DHT.h"  
#include "Sensor.h"


void Sensor::begin(void) { DHT.begin(); }
uint16_t Sensor::LDR1(void) {
   DHT.read22();
}

Die Sensor-Klasse beinhaltet die Kommunikation mit dem DTH22 und anderen Sensoren.
Leider jammert nun die Arduino IDE beim compilieren, sie fände den Eintrag in meiner Sensor.h Datei #include “DHT.h” nicht.

Was ist der richtige Pfad, falls ich die includes in meiner eigenen classe verwenden möchte?

Gruss,
Markus

Wo liegt die DHT.h? Im gleichen Verzeichnis oder in dem globalen Lib Ordner?

#include <DHT.h>

Meine eigenen Lib daten (.h und .cpp) liegen im gleichen Order wie die Arduino .ino datei. Diese Files hab eich alle auf meine lokalen Server-Folder.

Die DHT.h und alle Arduino eigenen Libs sind im Arduino IDE "libaries" Folder. Also sowas wie C:\Programme\Arduino\libaries\DHT...

War da nicht was, daß alle benutzten Bibliotheken im Sketch (.ino) angegeben werden sollten?

DrDiettrich:
War da nicht was, daß alle benutzten Bibliotheken im Sketch (.ino) angegeben werden sollten?

Wo steht das? Ist nicht C-Style! Respektive wenn ich die IDE wechsle, geht das dann immer noch so?

Das Tuturial bei Arduino verwendet leider keine Libraries in einer eignen Library:
https://www.arduino.cc/en/Hacking/LibraryTutorial

Das ist eine Arduino Eigenheit. Nicht Standard C. Das ist der Grund weshalb man z.B. SPI oder Wire inkludieren muss auch wenn das eine Library schon macht.

Wieso willst du DHT.h überhaupt im Header inkludieren? Das hat da gar nichts verloren, wenn die Klasse da nicht bekannt sein muss.

Serenifly: Wieso willst du DHT.h überhaupt im Header inkludieren? Das hat da gar nichts verloren, wenn die Klasse da nicht bekannt sein muss.

Doch, oben in meinem Beispielcode habe ich die DHT innerhalb der Sensor-Klasse. Ich möchte aus dem Arduino-Loop nur Sensor.LDR1() aufrufen. Klar, der Code oben für LDR1() methode ist nicht fertig, die Werte sollen dann weiter verarbeitet werden. Aber leider kennt der Compiler DHT nicht...

Normal sollte das so aussehen:

Sensor.h

class Sensor {
  public:
    void begin(void);
    uint16_t LDR1(void);
  private:
};

Sensor.cpp

#include "Sensor.h"
#include "Arduino.h"
#include "DHT.h" 


void Sensor::begin(void) { DHT.begin(); }
uint16_t Sensor::LDR1(void) {
   DHT.read22();
}

Wobei deine Lese Methode auch einen Wert zurückgeben muss. Das return fehlt. Das gibt aber keinen Compile-Fehler.

Dann in im Arduino Programm #include "Sensor.h" und eventuell nochmal #include "DHT.h". Letzteres liegt wie gesagt an der Arduino Software und wie diese Include Direktiven abarbeitet.

DHT.h brauchst du nur im Header, wenn schon im Header irgendwas als damit gemacht wird, z.B. eine Referenz auf ein DHT Objekt an eine Methode übergeben

Nicht getestet

Danke für eure Tipps. Inzwischen habe ich

void Sensor::begin(void) {  DHT.begin(); }

wobei ich DHT nicht iniitiert ist. Wohin kommt in meiner Library das

DHT dht(14, DHT22);

Der Compiler meldet mir:

error: 'Dht' was not declared in this scope
void Sensor::begin(void) {  Dht.begin(); }

DHT Dht dht sind drei völlig verschiedene Namen ;)

DHT ist eine Klasse, dht eine Instanz ( ein Element vom Typ DHT ) , und Dht gibt es leider nicht, jedenfalls nicht da wo der Compiler es braucht. Daher die Fehlermeldung.

Ich erbarme mich mal, weil du das mit deinen Kenntnissen nicht hinbekommen wirst. Du wirst vor allem am Konstruktor scheitern wenn du da einfach so wild rumprobierst.

Mir ist allerdings nicht klar, welche Library du hast. Ich nehme mal die von Adafruit:

Die scheint mit auf den ersten im Blick am besten zu sein. Da gibt es z.B. eine andere komische Version wo die Klasse dht heißt und das Objekt DHT. Genau falsch herum.

Damit geht es so:

Header:

#ifndef SENSOR_H
#define SENSOR_H

#include <DHT.h>

class Sensor
{
public:
  Sensor(uint8_t pin);
  void begin();
  float readTemp();
private:
  DHT dht;
};

#endif

Hier muss DHT.h im Header inkludiert werden weil die Klasse ein Objekt enthalten muss.

.cpp:

#include "Sensor.h"

Sensor::Sensor(uint8_t pin) : dht(pin, DHT22)
{
}

void Sensor::begin()
{
  dht.begin();
}

float Sensor::readTemp()
{
  return dht.readTemperature();
}

Wichtig ist das:

Sensor(uint8_t pin) : dht(pin, DHT22)

Damit wird beim Erstellen des Sensor Objekts auch das DHT Objekt erstellt. Im Konstruktor selbst kann man es nicht machen, da da schon “dht” existieren sollte. Kann es aber nicht, weil der DHT Konstruktor da erst die Parameter bekommen würde.

Und in der .ino braucht man das das #include nochmal. Sonst wird es im Header nicht gefunden:

#include <DHT.h>
#include "Sensor.h"

Sensor sensor(5);

void setup()
{
  sensor.begin();

  float t = sensor.readTemp();
}

void loop()
{
}

Besten Dank. Ich probiers diesen Abend aus.

Sensor::Sensor(uint8_t pin) : dht(pin, DHT22)

war mir nicht geläufig. Muss ich mich einlesen.

Läuft unter dem Stichwort "initializer list"

Das ist z.B. auch nötig um Konstanten oder Referenzen mit einem Konstruktor zu initialisieren. Referenzen müssen anders als Zeiger bei der Deklaration initialisiert werden. Ähnlich wie hier der Konstruktor deines Objekts sofort aufgerufen werden muss, da kein Default Konstruktor existiert.

Hier sind verschiedene Szenarien erklärt: http://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/