DIY-Projekt
Messstation mit Begrüßung
Diese Projektseite ist für eine kleine Messstation mit Begrüßungsfunktion vorbereitet. Die Station kann später Messwerte anzeigen und beim Einschalten oder bei Annäherung eine kurze Begrüßung ausgeben.
Aufbau
Verwendet wurden unter anderem:
- Arduino Uno oder kompatibler Mikrocontroller
- Temperatur- und Luftfeuchtigkeitssensor DHT11
- Ultraschallsensor HC-SR04
- LCD mit I2C-Anschluss 20×4 (vierzeilig)
- farbige Dupont-Kabel, ein Steckbrett
- zwei LEDs verschiedener Farben (grün/blau) und passende Vorwiderstände
- Kippschalter (rechts unter der grünen LED) und optional einen Netzschalter (im Bild unten, blau leuchtend)
- ein passendes Gehäuse mit Öffnung in der Rückseite für DHT11 und Kabeldurchführung
- Stromversorgung über USB A-B Kabel
Das Innenleben im Rohbau: Kabelsalat inklusive.
Verkabelung
| Bauteil | Leitung | Kabelfarbe | Arduino | |
|---|---|---|---|---|
| DHT11 | VCC | gelb | 5V | |
| DHT11 | DAT | weiß | D2 | |
| DHT11 | GND | violett | GND gemeinsam mit HC-SR04 | |
| HC-SR04 Ultraschall | VCC | grün | 5V | |
| HC-SR04 | Trigger | gelb | D7 | |
| HC-SR04 | Echo | rot | D6 | |
| HC-SR04 | GND | — | GND gemeinsam mit DHT11 | |
| LCD I2C | SCL | orange | A5 | |
| LCD I2C | SDA | grün | A4 | |
| LCD I2C | VCC | rot | 5V | |
| LCD I2C | GND | braun | GND | |
| Piezo | Plus | rot | D5 | |
| Piezo | Minus | blau | GND über Kippschalter | |
| LED grün / Status-LED | Plus | grün | 3,3V | |
| LED grün / Status-LED | Minus | braun | GND | |
| LED blau / Alarm synchron zum Piezo | Plus | rot | D9 | |
| LED blau / Alarm synchron zum Piezo | Minus | schwarz | GND über denselben Kippschalter wie Piezo |
Funktion und Wirkung
In dieser Messstation passieren mehrere Dinge weitgehend unabhängig voneinander.
Zuerst misst der Ultraschallsensor HC-SR04 die Entfernung zu einem Objekt vor dem Sensor. Das zurückkehrende Echo-Signal wird vom Arduino ausgewertet und mit einer hinterlegten Formel in eine Entfernung umgerechnet. Diese Entfernung wird anschließend auf dem LCD-Display in Zentimetern angezeigt.
Ähnlich wie bei einem Parksensor am Auto gibt ein Piezo einen Piepton aus, der schneller wird, je kleiner die gemessene Entfernung ist. Im selben Takt blinkt die blaue LED. Piepton und blaue LED lassen sich über einen Kippschalter deaktivieren.
Ab einer unterschrittenen Distanz, hier 60 cm, wird zusätzlich eine Begrüßung, zum Beispiel „Hallo Dayer“, in den Zeilen 1 und 2 des Displays eingeblendet.
Unabhängig davon misst der DHT11-Sensor Temperatur und Luftfeuchtigkeit. Diese Werte werden in den Zeilen 3 und 4 des Displays angezeigt.
Hinweis: In der obigen Schaltskizze ist nur ein zweizeiliges LCD dargestellt. Für die Messstation wird tatsächlich ein vierzeiliges 20×4-LCD mit I2C-Anschluss verwendet.
Zuerst misst der Ultraschallsensor HC-SR04 die Entfernung zu einem Objekt vor dem Sensor. Das zurückkehrende Echo-Signal wird vom Arduino ausgewertet und mit einer hinterlegten Formel in eine Entfernung umgerechnet. Diese Entfernung wird anschließend auf dem LCD-Display in Zentimetern angezeigt.
Ähnlich wie bei einem Parksensor am Auto gibt ein Piezo einen Piepton aus, der schneller wird, je kleiner die gemessene Entfernung ist. Im selben Takt blinkt die blaue LED. Piepton und blaue LED lassen sich über einen Kippschalter deaktivieren.
Ab einer unterschrittenen Distanz, hier 60 cm, wird zusätzlich eine Begrüßung, zum Beispiel „Hallo Dayer“, in den Zeilen 1 und 2 des Displays eingeblendet.
Unabhängig davon misst der DHT11-Sensor Temperatur und Luftfeuchtigkeit. Diese Werte werden in den Zeilen 3 und 4 des Displays angezeigt.
Hinweis: In der obigen Schaltskizze ist nur ein zweizeiliges LCD dargestellt. Für die Messstation wird tatsächlich ein vierzeiliges 20×4-LCD mit I2C-Anschluss verwendet.
Arduino-Code
Bereinigte Version des verwendeten Sketches:
// Messstation mit Begrüßung, Ultraschall, DHT11 und LCD 20x4
#include <DHT.h> // DHT-Bibliothek laden
#include <LiquidCrystal_I2C.h> // LCD-I2C-Bibliothek laden
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD-Adresse, 20 Zeichen, 4 Zeilen
#define DHTPIN 2 // DHT11-Datenleitung an Pin D2
#define DHTTYPE DHT11 // Es handelt sich um den DHT11-Sensor
DHT dht(DHTPIN, DHTTYPE); // Sensor-Objekt anlegen
int trigger = 7; // Trigger-Pin des Ultraschallsensors
int echo = 6; // Echo-Pin des Ultraschallsensors
int LED = 9; // blaue Alarm-LED
int piezo = 5; // Piezo-Signalgeber
long dauer = 0; // Dauer des Echo-Signals
long entfernung = 0; // berechnete Entfernung in Zentimetern
void setup() {
Serial.begin(9600); // seriellen Monitor starten
dht.begin(); // DHT11-Sensor starten
lcd.init(); // LCD starten
lcd.backlight(); // Hintergrundbeleuchtung einschalten
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(LED, OUTPUT);
pinMode(piezo, OUTPUT);
}
void loop() {
// Ultraschallsensor kurz anstoßen
digitalWrite(trigger, LOW);
delayMicroseconds(5);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
// Echo auswerten und Entfernung berechnen
dauer = pulseIn(echo, HIGH);
entfernung = (dauer / 2) * 0.03432;
// Temperatur und Luftfeuchtigkeit auslesen
float Luftfeuchtigkeit = dht.readHumidity();
float Temperatur = dht.readTemperature();
if (entfernung >= 500 || entfernung <= 0) {
Serial.println("Kein Messwert");
// obere Displayzeilen leeren
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
digitalWrite(LED, LOW);
noTone(piezo);
delay(300);
} else {
Serial.print(entfernung);
Serial.println(" cm");
// Entfernung in der zweiten Displayzeile anzeigen
lcd.setCursor(0, 1);
lcd.print("Entfernung: ");
lcd.print(entfernung);
lcd.print(" cm ");
// Begrüßung ab 60 cm Abstand
if (entfernung <= 60) {
lcd.setCursor(0, 0);
lcd.print(" Hallo Dayer ");
} else {
lcd.setCursor(0, 0);
lcd.print(" ");
}
// Piepton und blaue LED werden schneller, je kleiner die Entfernung ist
if (entfernung <= 150) {
digitalWrite(LED, HIGH);
tone(piezo, 1000);
delay(entfernung * 3);
digitalWrite(LED, LOW);
noTone(piezo);
delay(entfernung * 3);
} else {
digitalWrite(LED, LOW);
noTone(piezo);
delay(300);
}
}
// Werte auch im seriellen Monitor ausgeben
Serial.print("Luftfeuchtigkeit: ");
Serial.print(Luftfeuchtigkeit);
Serial.println(" %");
Serial.print("Temperatur: ");
Serial.print(Temperatur);
Serial.println(" Grad Celsius");
// dritte Displayzeile: Luftfeuchtigkeit
lcd.setCursor(0, 2);
lcd.print("Luftfeucht: ");
lcd.print(Luftfeuchtigkeit);
lcd.print(" % ");
// vierte Displayzeile: Temperatur mit Gradzeichen
lcd.setCursor(0, 3);
lcd.print("Temperatur: ");
lcd.print(Temperatur);
lcd.print(" ");
lcd.write(223); // Gradzeichen auf dem LCD
lcd.print("C ");
}