Problem mit der DHT lib --> einfach zu langsam! "adafruit"

hallo leute :slight_smile: da bin ich mal wieder und hab nen kleinens problem seit langer zeit^^

da ich 6 von dht22 sensoren besitze und die betreiben will.. habe ich die lib von adafruit genommen die es mir ganz einfach ermöglicht mehrere sensoren anzusprechen:

  float h1 = SENSOR1.readHumidity();  
  float t1 = SENSOR1.readTemperature();
  
  float h2 = SENSOR2.readHumidity();
  float t2 = SENSOR2.readTemperature();
  
  float h3 = SENSOR3.readHumidity();
  float t3 = SENSOR3.readTemperature();

  float h4 = SENSOR4.readHumidity();
  float t4 = SENSOR4.readTemperature();
  
  float h5 = SENSOR5.readHumidity();
  float t5 = SENSOR5.readTemperature();
  
  float h6 = SENSOR6.readHumidity();
  float t6 = SENSOR6.readTemperature();

bei der lib von: Arduino Playground - DHTLib kann ich erkennen das sie schneller arbeitet als die von adafruit! doch leider verstehe ich nicht wie ich mehrere sensoren auslesen kann.

kann mir da einer ein beispiel mit 2 sensoren machen?

dankeschön :slight_smile:

Bei dieser Bibliothek hast Du nur ein Objekt:

dht DHT;

liest daraus vom entsprechenden Pin:

int err = DHT.read22(DHT22_PIN);

worauf Du auf die Werte zugreifen kannst:

Serial.print(DHT.humidity);

Sobald Du das nächste Mal liest (mittels read22()-Methode), werden die Werte überschrieben mit den neu gelesenen Werten (die von einen anderen Sensor an einem anderen Pin kommen können).

ja das hab ich vollkommen verstanden!! aber wenn ich jetzt 6 sensoren habe... wie mach ich das dann???

Der DHT22_PIN war als Beispiel für irgendeinen Pin angeführt. Dieser Platzhalter muss einfach für jeden der 6 Sensoren angepasst werden. Da die Sensoren keine Adressen besitzen, muss für jeden Sensor ein eigener Pin eingesetzt werden.

mir gehts um das:

Serial.print(DHT.humidity);

was muss ich da schreiben wenn ich den 4. sensor anzeigen lassen will?

AndiIsl:
mir gehts um das:

Serial.print(DHT.humidity);

was muss ich da schreiben wenn ich den 4. sensor anzeigen lassen will?

DHT.humidity enthält den Wert der letzten Abfrage. Vor der nächsten Abfrage musst Du ihn also sichern.
Wenn Du nacheinander alle Sensoren abprüfen willst, dann mach es z.B. so:

#define DHT22_PIN1  5  // Sensor 1 an Pin 5
#define DHT22_PIN2  6  // Sensor 2 an Pin 6
#define DHT22_PIN3  7  // Sensor 3 an Pin 7
#define DHT22_PIN4  8  // Sensor 4 an Pin 8

#define ERR_VAL -1000.0

dht DHT;

double hum1;
double hum2;
double hum3;
double hum4;
double temp1;
double temp2;
double temp3;
double temp4;

void setup()
{
  ...
}

void loop()
{
  readSensors();

  // Die Werte der Sensoren sind nun in den Variablen gespeichert
  // und können weiterverarbeitet werden

  ...
}

void readSensors()
{
  // Alle vier Sensoren auslesen und Werte speichern
  if (DHT.read22(DHT22_PIN1) = DHTLIB_OK)
  {
    hum1 = DHT.humidity;
    temp1 = DHT.temperature;
  }
  else
  {
    hum1 = ERR_VAL;
    temp1 = ERR_VAL;
  }
  if (DHT.read22(DHT22_PIN2) = DHTLIB_OK)
  {
    hum2 = DHT.humidity;
    temp2 = DHT.temperature;
  }
  else
  {
    hum2 = ERR_VAL;
    temp2 = ERR_VAL;
  }
  if (DHT.read22(DHT22_PIN3) = DHTLIB_OK)
  {
    hum3 = DHT.humidity;
    temp3 = DHT.temperature;
  }
  else
  {
    hum3 = ERR_VAL;
    temp3 = ERR_VAL;
  }
  if (DHT.read22(DHT22_PIN4) = DHTLIB_OK)
  {
    hum4 = DHT.humidity;
    temp4 = DHT.temperature;
  }
  else
  {
    hum4 = ERR_VAL;
    temp4 = ERR_VAL;
  }
}

Du meinst sicher

  if (DHT.read22(DHT22_PIN1) [b]==[/b] DHTLIB_OK)

statt des Zuweisungsoperators =

Eleganter im Sinne der Objekt-Orientierten Programmierung wäre sicher, pro Pin ein dht Objekt zu haben, aber so ist es vermutlich kompakter...

Wenn ich das Adafruit Beispiel richtig lese, ist das dort auch so gemacht:
Die Library dort heisst DHT.h und definiert die Klasse DHT.
Von dieser Klasse wird für jeden Pin ein Objekt gebildet:

DHT dht01(DHT22_PIN1, DHT22);
DHT dht02(DHT22_PIN2, DHT22);

...

michael_x:
Du meinst sicher

  if (DHT.read22(DHT22_PIN1) [b]==[/b] DHTLIB_OK)

statt des Zuweisungsoperators =

Uuups!

Klar meinte ich ==
Da merkt man wieder, dass Pascal meine primäre Programmiersprache ist XD

@michael_x

könntest du mir ein beispiel mit 2 dht sensoren schreiben? ich finde deine möglichkeit einfach übersichtlicher als die mit dem ganzen if...!

so wies bei adafruit ist gefällts mir auch extrem gut.

danke schonmal.

Du kannst Dir auch einfach in deinem Sketch eine Hilfsfunktion schreiben:

bool readSensor(uint8_t pin, double *humidity, double *temperature)
{
  if (DHT.read22(pin) == DHTLIB_OK)
  {
    *humidity = DHT.humidity;
    *temperature = DHT.temperature;
    return true;
  }
  else
    return false;
}

Das Auslesen erfolgt dann so:

  ...
  double h1;
  double t1;
  double h2;
  double t2;
  
  readSensor(5, &h1, &t1);
  readSensor(8, &h2, &t2);
  ...

bzw. wenn Du prüfen möchtest ob das Auslesen erfolgreich war:

  ...
  if (readSensor(5, &h1, &t1))
  {
    // Daten weiterverarbeiten
  }
  else
  {
    // Fehler
  }
  ...

@AndiIsl:
Wenn ich mir den Thread nochmal von vorne anschaue, sehe ich, dass du doch so angefangen hast, mit der Adafruit library und 6 Objekten.
Ich finde auch, dass das übersichtlicher ist, als bei einem Objekt dynamisch die Pin Nummer zu übergeben, wie es wohl die Playground Version vorsieht.

Aber die adafruit Version ist ja " einfach zu langsam! " oder ?

Da hast du nun 3 Möglichkeiten:
A) Adafruit ist schnell genug für 6 * Feuchte und Temperatur
B) du nimmst MaFu's Beispiele für die playground Variante
C) du vergleichst beide libraries und findest raus, was an der einen oder anderen dir nicht gefällt, oder ob sie sich eigentlich gar nicht wesentlich unterscheiden, und baust dir dann was eigenes ( wobei es da wieder zig Unter-Varianten gibt )

die adafruit variante braucht 750 ms pro sensor...

die vom playground braucht grade mal 20ms.. zumindest sind da einfach die delays auf maximal 20ms...

Abgesehen davon, dass du langfristig evtl. mit 3*6 Werten / Tag auskommst ...

Jetzt würde mich doch Variante C interessieren : wie kommts ?

also ich möchte die werte schon so aktuell wie möglich haben.. also nicht nur pro tag n paar mal^^

aus welchem grund:

http://www.lygodactylus-williamsi.galaxyfighter.de/wetterpanel/

http://www.lygodactylus-williamsi.galaxyfighter.de/terratemp/

das terrarium soll komplett gesteuert werden! luftfeuchte, licht, sonnen aufgang und untergang, alles online abgespeichert und auch die sollwerte von einer sql datenbank werden geholt..

auch die kleinen aufzuchtbecken werden somit gesteuert...

Na gut, 3*6 Werte pro Tag war etwas provozierend, zugegeben.
Aber selbst das beeindruckende wetterpanel - Beispiel kommt mit 8 ( 3h ) Datensätzen pro Tag aus.

Ob ein einzelner Sesnorwert nun in 20 msec gemessen wird oder fast 1 sec braucht, ist eigentlich egal, aber grundsätzlich schon interessant...