Zwei DHT22-Sensoren auslesen (Verständnisfrage)

Hallo,

wie man mit einem Arduino zwei oder mehr Sensoren (DHT22) ausliest, habe ich herausbekommen. Leider verstehe ich nicht, was da im Programm abgeht und hoffe, dass mir das hier jemand erklären kann, bzw. ein Stichwort nennen kann, damit ich weiter googeln kann.

Ich benutze eine Library von Adafruit und der Schnippsel sieht so aus:

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 7     // what pin we're connected to
#define DHTPIN2 6     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
// NOTE: For working with a faster chip, like an Arduino Due or Teensy, you
// might need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It's a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// Example to initialize DHT sensor for Arduino Due:
//DHT dht(DHTPIN, DHTTYPE, 30);

void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");

  dht.begin();
  dht2.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);

 /*   // zum Testen deaktiviert
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  */

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);

  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hi);
  Serial.println(" *F");

// Sensor 2 auslesen und ausgeben

  h = dht2.readHumidity();
  // Read temperature as Celsius
  t = dht2.readTemperature();
  // Read temperature as Fahrenheit
  f = dht2.readTemperature(true);


  hi = dht2.computeHeatIndex(f, h);

  Serial.print("Hum2: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temp2: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat ind 2: ");
  Serial.print(hi);
  Serial.println(" *F");
}

Kann mir jemand sagen, was in Code-Zeile 5 und 6 gemacht wird?

DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);

Da kein Schlüsselwort verwendet wird, fällt es mir schwer, danach zu googeln.

BTW: Obiges Programm funktioniert. Ich habe zwar im Moment nur einen Sensor, aber ich kann ihn an Pin 6 und 7 anschließen und erhalte jeweils sinnvolle Werte und für den freien Pin wird "0" angezeigt.

Du definierst hier etwas.

Ganz oben bindest du ja eine Libary ein (DHT.h)

und diese Libary ist allgemein für alle DHT's gemacht worden. Damit du jetzt dein Modell damit betreiben kannst musst du definieren WO und WAS angeschlossen ist.

Im Setup siehts du, dass die Serielle Schnittstelle mit Serial.begin() initialisiert wird.

Gleich darauf werden deine beiden Sensoren initialisiert. Und damit die Libary / Arduino weiß wie er das initialisieren soll bei nachfolgenden Abfragen musst du diese initialisieren mit den oben eingefügten Bedingungen.

DHT ist ein commando aus der DHT.h-Libary

und du erzeugst damit also 2 "Pipelines". Später kannst du dann über die 1 "Pipeline" Commandos übergeben, z.B.: dht.computeHeatIndex(bla,bla);

ähnlich wie:

Serial.print("bla");

ich glaube fachlich war das nicht ganz korrekt aber hoffe den wesentlichen Kern für dich verständlich zu machen :)

Gruß

Bleiente: Kann mir jemand sagen, was in Code-Zeile 5 und 6 gemacht wird?

DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);

Da kein Schlüsselwort verwendet wird, fällt es mir schwer, danach zu googeln.

Noch weiter oben bindest Du per "#include" eine Library ein, die eine Objekt-Klasse mit dem Objekttyp "DHT" zur Verfügung stellt.

Mit Deinen beiden Zeilen erzeugst Du nun zwei Objekt-Instanzen dieses Typs: Das eine Objekt vom Typ DHT bekommt den Namen "dht" zugewiesen und das zweite den Namen "dht2". In Klammern dahinter stehen die Parameter, die die Constructor-Funktion beim Erzeugen des Objekts verwenden soll.

Objektorientierte C++-Programmierung mit Objekt-Klassen siehe beispielsweise http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Klassen#Deklaration_erfolgt_in_einer_Header-Datei (Oder irgendein anderes Tutorial über objektorientierte Programmierung mit C++)

Deklaration und Implementierung Deiner DHT-Objektklasse findest Du in den Dateien der Library: DHT.h und DHT.cpp

Danke Leute. Jetzt habe ich ein paar Stichwörter, einen Link und eine grobe Erklärung. Ich werde mal genauer nachlesen, was es mit Objekten auf sich hat und wie das funktioniert. Das habe ich zwar vor Jahren schon mal überflogen, aber mangels praktischer Anwendung nie vertieft und wieder vergessen. Da ich in der letzten Zeit ein bisschen mit Arduinos herumspiele, bleibt es nun hoffentlich hängen.