Internet der Dinge trifft Maker: Genuino MKR1000

Seite 2: Wetterfühlig

Inhaltsverzeichnis

Der MKR1000 kann sich nun mit dem Internet verbinden. Was noch fehlt, ist Sensorik. Im nachfolgenden Beispielsszenario kommt ein Temperatur- & Feuchtigkeitssensor des Typs DHT11, DHT22 oder DHT21 zum Einsatz. DHT steht für Digital Humidity and Temperature.

Die Temperaturmessung des Sensors funktioniert über einen Thermistor, das heißt einen temperaturabhängigen Widerstand mit großer Empfindlichkeit, der aus Keramik oder ähnlichem Material besteht. Zur Feuchtigkeitsmessung befindet sich ein Substrat zwischen zwei elektrisch geladenen Platten. Die Feuchtigkeit gelangt über die Poren der Sensoraußenhülle zum Substrat, dessen Leitfähigkeit sich entsprechend ändert. Eine Logik im Sensor ermittelt Feuchtigkeit und Temperatur.

DHT22-Sensor am Genuino/Arduino MKR1000 (Abb. 2)

Beim in Abbildung 2 gezeigten Versuchsaufbau ist ein DHT22-Sensor mit vier Pins zu sehen, wobei Pin 3 unbelegt bleibt. Zwischen dem Spannungseingang (Pin 1, ganz links) und dem Signaleingang (Pin 2) empfiehlt sich ein Pull-up-Widerstand mit 5 bis 10 kOhm. Pin 4 liegt an Erde (GND).

Einige DHT22-Bausteine besitzen nur drei Pins und haben den Pull-up-Widerstand bereits auf dem Board. Der DHT22 ist zwar teurer als sein kleinerer Bruder DHT11, dafür aber auch leistungsfähiger. Während der DHT22 den Feuchtigkeitsbereich von 0-100% mit einer Abweichung von +- 2% erfasst, deckt der DHT11 etwa 10-90% mit +-5% Genauigkeit ab. Temperaturen misst der DHT11 von 0 bis 50 Grad Celsius bei einer Abweichung von bis zu 2 Grad. Der DHT22 schafft dagegen -40 bis 125 Grad Celsius mit einer Fehlertoleranz von maximal 0.5 Grad. Im Vorteil ist der DHT11 dagegen mit seiner Messfrequenz von 1 Hz im Vergleich zu 0.5 Hz des DHT22.

Erwartungsgemäß ist keine Eigenentwicklung eines DHTxx-Treibers notwendig. Eine passende Open-Source-Bibliothek gibt es auf der GitHub-Seite von Adafruit. Nach dem Download der Bibliothek bleibt nur noch die Integration in die Arduino-IDE.

Der Rest des Sketches ist selbsterklärend. Dass der Sensor ein sehr genaues Timing benötigt, macht die Programmierung etwas diffiziler. Darum kümmert sich aber zum Glück die DHT-Bibliothek.

In jedem Messzyklus greift der Sketch auf den Sensor zu, fragt die momentane Temperatur in Grad Celsius sowie die Feuchtigkeit in Prozent ab und gibt die Daten neben einem Hitzeindex auf dem seriellen Monitor aus.

/**************************************************
Nutzer anderer Sensoren müssen statt DHT22
entweder DHT21 oder DHT11 eintragen:
***************************************************/
#include "DHT.h" // Bibliothek verwenden
#define HUMSENSORTYPE DHT22 // Genutzt wird DHT22
// am Digital-Pin 6
// des MKR1000
#define HUMSENSORPIN 6
// Zeit zwischen Messungen
const int waitingTimeBetweenMeasures = 5000;
DHT humiditySensor(HUMSENSORPIN, HUMSENSORTYPE);
void setup() {
Serial.begin(9600); // Seriellen Monitor initialisieren
humiditySensor.begin(); // Start der Messung
}
void loop() {
// Notwendiges Pausieren zwischen Messungen:
delay(waitingTimeBetweenMeasures);
  // Lesen der Daten dauert etwa eine Viertel Sekunde:
float humidity = humiditySensor.readHumidity();
float temperature = humiditySensor.readTemperature();

// Folgende Prüfung empfiehlt Adafruit:
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Fehler beim Lesen des Sensors!");
return;
}
  // Hitzeindikator in Celsius. Für Fahrenheit,       
// einfach den Parameter false weglassen:
float heatIndexInCelsius =
humiditySensor.computeHeatIndex(temperature,
humidity, false);
  Serial.print("Feuchtigkeit: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Temperatur: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Hitzeindikator: ");
Serial.print(heatIndexInCelsius);
Serial.println(" in Celsius");
}