Sicherheitsgeräte von Pilz


Google-Suche auf MEINE-SCHALTUNG.de :





Dauerkalender


DHT11 - Messung mit 2 Sensoren


In der folgenden Schaltung werden an Arduino zwei DHT11-Sensoren angeschlossen. Die Sensoren liefern über eine Leitung zwei Werte: Temperatur und Luftfeuchtigkeit. Grundsätzlich ist es kein Problem festzustellen, ob ein Sensor ausgefallen ist oder nicht. Mit einem Sensor ist es jedoch nicht möglich, nachzuvollziehen, ob die Messwerte richtig sind. Deswegen kommt in der Schaltung ein zweiter Sensor ins Spiel. Beide Sensoren werden kalibriert und sich gegenseitig überwachen. Weichen beide Messwerte zu stark voneinander ab, wird eine Störmeldung ausgegeben. Die einzelne Werte von beiden Sensoren werden auf einem 20x4 Display angezeigt. Zusätzlich wird aus den beiden Messwerten gebildeter Mittelwert ausgegeben.

DHT11

DHT11

DHT11

LCD - Display

Das LCD-Display, das 4 Zeilen je 20 Zeichen für Ausgabe zur Verfügung stellt, wird über i2C-Bus angesprochen. Hierzu wird ein Interface zwischen Display und Arduino angeschlossen. Das Modul FC-113 macht dann die I2C - Kommunikation zwischen beiden Geräten möglich. Der Vorteil dieser Lösung ist, dass für die Display-Ausgabe nur zwei Leitungen benötigt werden.

Display

Display Frontansicht

LCD mit Interface

LCD mit angelötetem I2C-Interface

LCD 20x4

Spannungsregler

Das Display verbraucht ca. 40 mA. Würde Arduino mit einem Netzteil arbeiten, könnte man das Display an den Anschluss 5V des Arduino anschließen. In diesem Fall sorgt ein Spannungsregler für Stromversorgung. Es ist selbst gebauter Regler, der auf dem Spannungsregler LM317 basiert. Er liefert bei Bedarf 1,5 A. An die 5 VDC, die der Regler liefert, werden neben dem Display auch die beiden Sensoren angeschlossen. Externe Spannung, mit der der Regler und Arduino versorgt werden, beträgt 9 VDC.

Spannungsregler mit LM317

Spannungsregler mit LM317

LM317

Arduino

Das Auslesen und Verarbeitung der Messwert sowie die Display-Ausgabe koordiniert Arduino. Es werden vier seiner Anschlüsse in Anspruch genommen. Die Pins SCL und SDA werden für den I2C-Bus abkommandiert. Über die Pins D2 und D3 kommuniziert Arduino mit den beiden Sensoren. Dabei erfolgt diese Kommunikation in beiden Richtungen. Zunächst werden von Arduino die Daten angefordert, danach schaltet er auf Empfang und liest die ankommenden Signale aus.

Arduino Mega

Arduino Mega2560 (Nachbau)

Schaltplan

Schaltplan

Schaltplan

Testschaltung

Testschaltung

Testschaltung

Das Programm (Sketch)

Damit das Programm funktioniert, müssen zwei Bibliotheken installiert werden. Sie übernehmen die Kommunikation mit dem Display und beiden Sensoren. Die Bibliothek "DHT.h" kümmert sich um die Kommunikation mit den beiden Sensoren, die Bibliothek „LiquidCrystal_I2C.h“ für die mit dem Display. Beide Bibliotheken können mit dem Bibliotheksverwalter installiert werden. Mit "DHT.h" kann auch der Sensor DHT22 angesprochen werden. Mit „LiquidCrystal_I2C.h“ kann z.B. auch das Display 16x2 gesteuert werden. Infos im Internet mit Beispiel-Programmen:

https://github.com/adafruit/DHT-sensor-library
und
https://www.arduino.cc/en/Reference/LiquidCrystal

Anzumerken ist, dass für viele gleiche Aufgaben im Internet mehrere Bibliotheken verfügbar sind.
Das Hauptprogramm ist auf drei Blöcke unterteilt. Die Abarbeitung jedes Blocks hängt von dem Wert der Variable „Fehler“ ab. Das Durchlaufen des Hauptprogramms erfolgt alle 1.5 Sek. Sofern kein Fehler vorliegt (Fehler = 0), werden beide Sensoren nacheinander ausgelesen und die Ergebnisse auf dem Display angezeigt. Anschließend wird von den Werten der Temperatur und Feuchtigkeit ein Mittelwert gebildet, der ebenfalls auf das Display kommt.
Parallel dazu werden die ankommenden Daten überprüft. Tauchen z.B. Kommunikationsprobleme auf, ein der Sensoren ist defekt oder nicht vorhanden, wird ein Fehler generiert (Fehler = 1).
Anschließend wird die Abweichung der Werte voneinander untersucht. In dem Beispiel betrifft diese Untersuchung nur die Temperatur. Ist der Unterschied zwischen den beiden Temperaturwerten größer als 1°, wird ebenfalls ein Fehler generiert (Fehler=2). Bevor die ausgelesenen Werte untersucht werden, werden sie kalibriert. Es zeigte sich, dass der Messunterschied (Temperatur) zwischen beiden Sensoren streckenweise den Wert von 2.5°C überstieg. Auch die Reaktionszeiten der Sensoren weisen deutliche Unterschiede auf. Zum Experimentieren sind sie trotz dessen durchaus geeignet.
Im Fall eines Fehlers erscheint auf dem Display entsprechende Meldung.

// ***************************************************************************************
// Temperatur und Feuchtigkeit mit zwei Sensoren
// Arduino und DHT11
// Arduino Mega 2560, IDE 1.8.13
// ***************************************************************************************

#include "DHT.h"                     // Bibliothek DHT
#include <LiquidCrystal_I2C.h>       // Bibliothek LCD-Display     
#define DHTPIN_1 2                   // Pin Nummer des Sensors 1
#define DHTPIN_2 3                   // Pin Nummer des Sensors 2
#define DHTTYPE DHT11                // Sensor Typ
                                                    
DHT dht1(DHTPIN_1, DHTTYPE);
DHT dht2(DHTPIN_2, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,20,4);
float Feuchtigkeit = 0;
float Temperatur = 0;
int Fehler = 0;                      // Fehler = 1: Sensor ausgefallen
                                     // Fehler = 2: Falsche Messwerte

void Ausgabe (int x,int y,float Wert, int Nachkomma) {
    lcd.setCursor(x,y);
    lcd.print (Wert,Nachkomma);
}

                                     // Setup ............................................
void setup() {
    lcd.init();                      // Display initialisieren 
    lcd.backlight();                 // Hintergrundbeleuchtung  
    dht1.begin();                    // Sensor 1
    dht2.begin();                    // Sensor 2
}
                                     // Hauptprogramm ....................................
void loop() {

    switch (Fehler) {
        case 0 : {
            lcd.setCursor(2,0); 
            lcd.print ("Temperatur in *C");            
            lcd.setCursor(2,2); 
            lcd.print ("Feuchtigkeit in %");
                                                           
            float Temperatur_1 = dht1.readTemperature();  // Sensor 1 auslesen ...........
            float Feuchtigkeit_1 = dht1.readHumidity();
            if (isnan(Feuchtigkeit_1) || isnan(Temperatur_1)) {       
                Fehler = 1;                               // Sensor 1 ausgefallen ........
                lcd.clear();
                break; }   
                         
            Temperatur_1 = Temperatur_1 - 0.9;            // Kalibirierung ...............
            Ausgabe (1,1,Temperatur_1,1);                 // LCD - Ausgabe ...............
            Ausgabe (3,3,Feuchtigkeit_1,0);
            
            float Temperatur_2 = dht2.readTemperature();  // Sensor 2 auslesen ...........
            float Feuchtigkeit_2 = dht2.readHumidity();
            if (isnan(Feuchtigkeit_2) || isnan(Temperatur_2)) {       
                Fehler = 1;                               // Sensor 2 ausgefallen ........
                lcd.clear();
                break; }

            Temperatur_2 = Temperatur_2 + 1.7;            // Kalibirierung ...............
            Ausgabe (8,1,Temperatur_2,1);
            Ausgabe (9,3,Feuchtigkeit_2,0);

            if ((abs(Temperatur_1 - Temperatur_2) > 1)){  // Unterschied ausrechnen ......
              Fehler = 2;                                 // Unterschied zu groß .........
              lcd.clear();
              break; }

            float T = (Temperatur_1 + Temperatur_2) / 2;  // Mittelwerte ausrechnen ......
            Ausgabe (15,1,T,1);
            float H = (Feuchtigkeit_1 + Feuchtigkeit_2) / 2;
            Ausgabe (15,3,H,0);
            break; }
            
        case 1 : {
          lcd.setCursor(6,0);                             // Fehler 1 melden .............
          lcd.print("FEHLER");
          lcd.setCursor(1,2);
          lcd.print("Ein Sensor ist");      
          lcd.setCursor(7,3);
          lcd.print("ausgefallen.");
          break;
        }
        case 2 : {
          lcd.setCursor(6,0);                             // Fehler 2 melden .............
          lcd.print("FEHLER");
          lcd.setCursor(0,2);
          lcd.print("Messwerte ausserhalb");      
          lcd.setCursor(2,3);
          lcd.print("Toleranzbereichs.");
          break;
        }        
    }
    delay (1500);
}
// ***************************************************************************************
    

Kurzvideo

Kurzvideo


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz