Lektion 7 Digitale Sensoren

Lektion 7 Digitale Sensoren Titelbild

Digitale Sensoren

Lernziele

  • Du weißt, was Ultraschall ist
  • Du kannst Entfernungen messen
  • Du kannst mit einem Bewegungsmelder umgehen
  • Digitale Sensoren sind verständlich
245.png

Auch Entfernungen spielen in unserem Alltag eine wichtige Rolle. Es ist immer gut zu wissen, wie weit der Baum vor einem noch entfernt ist, damit man nicht ungehindert gegen ihn donnert. Sicher könnte man die Entfernung einfach abschätzen und einfach rechtzeitig einen Bogen schlagen, aber was wäre dass denn für eine unkomplizierte Lösung? So würde das ja gar keinen Spaß machen. Dazu kommt das der Entfernungssensor ein gutes Beispiel für einen simplen digitalen Sensor ist.

Grundlagen

Der Name des Sensors verrät schon viel über seine Funktionsweise. Ultraschall ist der gesamte Schallbereich, der eine so hohe Frequenz hat, dass wir Menschen den Schall nicht hören können. Fledermäuse benutzen diese Technik, um nicht gegen Hindernisse zu fliegen und sich zu orientieren oder ihre Beute zu orten. Der HC-SR04, so ist der eigentliche Name des Ultraschallsensors, benutzt dieselbe Technik und ist sehr einfach aufgebaut. Es gibt vier Pins von denen zwei den Sensor mit Strom und Ground versorgen. Die beiden mittleren Pins werden echo und trigger genannt. Mit dem trigger-Pin können wir selbst eine Schalwelle erzeugen (rot) und können dann mit dem echo-Pin messen, wann die reflektierte Schallwelle wieder am Sensor ankommt. Daraus können wir dann die Entfernung von dem Objekt ermitteln, das die Schallwelle reflektiert hat.

246.png

Doch von der Theorie wollen wir wieder zurück zur Praxis kommen!

<img src=""http://codetrainer.de/public/uploads/372.png" class="img img-responsive"/>

Anschlüsse am Arduino Anschlüsse am Sensor
5v VCC 13 trigger 12 echo d GND GND
int trigPin = 13;
int echoPin = 12;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  long dauer, entfernung;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  dauer = pulseIn(echoPin, HIGH);
  entfernung = (dauer/2) / 25;
  Serial.println(entfernung);
  delay(500);
}

Wenn ihr das Programm jetzt ausführt, werden dir im Seriellen Monitor die Enterfernungswerte in Zentimeter angezeigt. Wichtig ist, dass du daran denkst, dass es auch ein Objekt geben muss, von dem die Schallwellen reflektiert werden können.

Schritt für Schritt

In Zeile 1 und 2 legen wir fest, welche Pins trigPin und echoPin sein sollen, in dem wir als Variablen die Pins dafür abspeichern. Wenn du andere Pins benutzen willst, musst du diese Angaben auch ändern. Da wir für den trigPin Pin 13 und für echoPin Pin 12 benutzen, müssen wir das natürlich auch angeben.

In Zeile 6 und 7 legen wir in der Setup-Funktion fest, welche Funktionen die einzelnen Pins haben. Den Pin, der an Trig angeschlossen ist, müssen wir als Output festlegen. Dazu benutzen wir die schon häufig benutzte Funktion pinMode(trigPin, OUTPUT);. Warum das Ganze? Mit diesem Pin signalisieren wir dem Sensor, dass eine neue Schallwelle erzeugt werden soll, deswegen müssen wir auch den Stromfluss kontrollieren. Mit dem echo-Pin gibt der Sensor an, ob die Schallwelle zurück gekommen ist, deswegen muss dieser Pin am Arduino natürlich als Input gesetzt werden.

In der loop()-Funktion werden zuerst zwei neue Variablen definiert. Diesen haben den Typ eines Long, das heißt in den Variablen können nicht nur ganze Zahlen, sondern auch Kommazahlen gespeichert werden. Das ist für die späteren Messungen sehr wichtig, denn dafür brauchen wir sehr genaue Werte.

In Zeile 12 bis 16 wird der Sensor zuerst initialisiert und dann wird die Schallwelle erzeugt. Dazu schalten wir zuerst den trigPin aus, um ganz sicher zu gehen, dass dieser aus ist und warten zwei Mikrosekunden. Es gibt nicht nur die delay()-Funktion, sondern auch delayMicroseconds()-Funktion. Mit der delay()-Funktion wird das Programm solange pausiert, wie Millisekunden angeben werden und bei delayMicroseconds()-Funktion wird das Programm solange angehalten, wie Mikrosekunden angegeben werden. Eine Millisekunde besteht aus 1000 Mikrosekunden. In Zeile 14 bis 16 wird dann der trigPin angeschaltet und für 10 Mikrosekunden fließt Strom, bis der Pin wieder ausgeschaltet wird.

In Zeile 18 warten wir solange, bis die reflektierte Schallwelle zurück kommt. Dafür benutzen wir die Funktion dauer = pulseIn(echoPin, HIGH);. Diese lässt sich wie folgt übersetzen: Warte solange, bis bei Pin echoPin ein Stromfluss gemessen wird und gebe dann diesen Zeitraum zurück. Das heißt, diese Funktion macht nichts Anderes, als solange zu warten, bis auf den angegeben Pin, in diesem Fall echoPin, das Ereignis HIGH, also Strom fließt, angezeigt wird und die Wartezeit zurück gibt. In der Variable dauer haben wir jetzt die Wartezeit gespeichert und aus dieser lässt sich jetzt die Entfernung berechnen. Das Ganze machen wir in Zeile 19. Zuerst teilen wir die dauer durch zwei geteilt, momentan setzt sich diese noch aus unser erzeugten Schallwelle und der reflektierten Schallwelle zusammen. Im nächsten Schritt müssen wir den Wert noch durch 29.1 teilen, um von der dauer auf die Entfernung in Zentimeter zukommen. Im letzten Schritt wird dann einfach nur die Entfernung ausgeben und eine kleine Wartezeit eingebaut, danach fängt alles wieder von vorne an.

Digitale Sensoren sind kompliziertere Schaltelemente als beispielsweise eine LED oder ein Button. Sie lassen sich aber auch vielseitiger einsetzen. Wichtig ist, dass gewusst wird, worauf diese Sensoren ansprechen.

Der Bewegungssensor

Der PIR ist ein Sensor, der Infrarotstrahlung erfassen und somit Bewegungen erkennen kann. Das Tolle daran ist, dass dieser Sensor so auch Bewegungen registrieren kann, wenn gar kein Licht vorhanden ist. Infrarotstrahlung ist nämlich nichts Anderes als Wärmestrahlung. Da die meisten Lebewesen irgendwie Wärme ausstrahlen, können wir mit diesem Sensor prüfen, ob verdeckt operierende Geheimagenten-Ninjas in unsere Umgebung spionieren.

250.png

Bevor wir den Sensor anschließen und programmieren, wäre es sehr hilfreich zu wissen, wie dieser überhaupt funktioniert. Oder glaubst du, da würden kleine Wesen drin sitzen, die 24/7 nach Bewegung Ausschau halten und das im Zweifelsfall an den Arduino mitteilen? Nein, das gibt es, zum Glück, nicht! Der Sensor misst wie viele Infrarotstrahlen aus den unterschiedlichen Gegenden zu ihm kommen. Das kann der Sensor messen, da diese den Stromfluss in dem Sensor beeinflussen. Wir müssen uns zum Glück nicht um das Auslesen dieser Messungen kümmern. Der Sensor macht das von alleine. Aber wie wird jetzt die Bewegung gemessen? Bewegung (von Menschen) verändert die Menge der Infrarotstrahlen, die der Sensor misst. Das heißt, wenn sich von dem einen auf den anderen Moment etwas ändert, hat der Sensor eine Bewegung erkannt und teilt das mit. Gleichzeitig ist der Sensor aber schon so schlau, das er kleine Veränderungen im Zimmer, zum Beispiel einen langsamen Anstieg der Temperatur, einfach ignoriert, da das sehr vermutlich keine bewegenden Menschen sind. Aber wie bekommen wir jetzt konkret mit, wenn der Sensor gemessen hat, dass sich etwas bewegt? Über den Data Pin kann der Sensor nur das Signal 'keinen Strom' oder 'Strom' senden. Eine Bewegung wird dann erkannt, wenn nach 'keinen Strom', Strom durch den Sensor fließt. Also auf 0 eine 1 bei der Messung folgt.

Anschließen

381.png
Anschlüsse am Arduino Anschlüsse am Breadboard
5V VCC
Digitaler Pin 7 Data
GND GND
13 langes Bein LED
GND kurzes Bein LED

Folgender Quellcode kann zum einfachen Auslesen des Sensors genutzt werden:

int led = 13;
int pirSensor = 7;
int bewegungsstatus = 0;

void setup(){
  pinMode(led, OUTPUT);
  pinMode(pirSensor, INPUT);
}

void loop(){
  bewegungsstatus=digitalRead(pirSensor);

  if (bewegungsstatus == HIGH)  {
    digitalWrite(led, HIGH);
  }
  else{
   digitalWrite(led, LOW);
  }
}

Als erstes definieren wir in Zeile 1 bis 3 die Variablen. In diesem Beispiel gibt es drei Stück:

  • led ist der PIN der LED, den wir zur Anzeige nutzen möchten.
  • pirSensor ist der Pin, an dem der Bewegungssensor angeschlossen ist
  • bewegungsstatus Hier speichern wir den Status des Bewegungssensors, um damit weiter zu arbeiten.

In der setup()-Funktion in den Zeilen 7 und 8 definieren wir den Bewegungssensor pirSensor als Eingabe und die LED als Ausgabe. In der loop()-Funktion ab Zeile 11 fragen wir mit bewegungsstatus=digitalRead(pirSensor); den Zustand des Bewegungssensors ab und speichern diesen in der Variablen bewegungsstatus

Im darauf folgendem if-Block überprüfen wir, ob der bewegungsstatus 1 oder 0 ist. Wenn dieser 1 ist, gab es eine Bewegung und wir schalten die LED auf dem Board mit digitalWrite(led, HIGH) an. Wenn es keine Bewegung gab, schalten wir die LED mit digitalWrite(led, LOW) wieder aus. Jedes Mal, wenn es jetzt eine Bewegung gab, sollte die LED für einen kurzen Zeitraum aufleuchten, das liegt daran, dass der Sensor nach jeder Bewegung erst einmal ein wenig Zeit braucht, um sich wieder an die Umgebung zu gewöhnen und weil während der Zeit immer Strom auf dem Data Pin ist und deswegen die LED während der Zeit aufleuchtet.

DHT11

373.png

Alle bisherigen Sensoren haben sehr simpel mit dem Arduino kommuniziert, mit dem DHT11 wird das ein wenig komplizierter. Diese Sensor übermittelt nicht nur eine Sache, sondern gleichzeitig die Temperatur und Feuchtigkeit. Diese gesamte Kommunikation läuft über den 2. Pin von links, welcher auch Data genannt wird. Wir könnten auch ein sehr langes und kompliziertes Programm schreiben zum selber Auslesen des DHT11, aber wir machen es uns hier ein wenig einfacher und benutzen dafür "nur" eine Bibliothek. Eine Bibliothek umfasst Funktionen, die nicht in unserem normalen Gebrauch integriert sind. Das liegt unter anderem daran, dass wir zwar sehr häufig die digitalRead()-Funktion brauchen, aber nicht jeder unsere selbst geschrieben Funktion notenRechner12Klasse() braucht.

Zum Glück können Bibliotheken einfach hinzugefügt werden. Zuerst müsst ihr folgende Datei herunterladen und entpacken: http://dht.jpkit.eu/dht.zip. Diesen Ordner müsst ihr dann in euren Libraries-Ordner entpacken. Unter Windows befindet der sich meistens in Eigene Dokumente->Arduino->Libraries und unter Linux/MacOSX $BenutzerName->sketchbook->libraries. Danach müsst ihr die IDE noch einmal neustarten, um die neue Bibliothek benutzen zu können.

374.png
Anschlüsse am Arduino Anschlüsse DHT11
5V VCC
8 DATA
GND GND
#include <dht11.h>
int dht11Pin = 8;
dht11 DHT11;

void setup(){
  Serial.begin(9600);
}

void loop(){
  int checkSensor = DHT11.read(dht11Pin);

  Serial.println("\n");
  Serial.println("Sensor wird ausgelesen ");
  if(checkSensor ==  DHTLIB_OK){
    Serial.println("Die Messung kann beginnen");
  }
  else if(checkSensor == DHTLIB_ERROR_CHECKSUM){
    Serial.println("Es gab ein Fehler mit Kontrolsumme");
  }
  else if(checkSensor == DHTLIB_ERROR_TIMEOUT){
    Serial.println("Es gab ein Fehler mit Zeitlichen Komunikation");
  }
  else{
    Serial.println("Unbekannter Fehler");
  }

  Serial.print("Feuchtigkeit: ");
  Serial.println((int)DHT11.humidity, 2);
  Serial.print("Temperatur: ");
  Serial.println((int)DHT11.temperature, 2);
  delay(5000);
}

Nach dem Ausführen des Programmes sollte jetzt im Seriellen Monitor die Temperatur und Feuchtigkeit ausgegeben werden. Wenn bei euch keine Werte stehen, solltet ihr noch einmal die Verkabelung kontrollieren.

Schritt für Schritt

In Zeile importieren wir zuerst die Bibliothek für den DHT11. #include . Bei dht11.h handelt es sich um den Dateinamen und ist nicht bei jeder Bibliothek gleich. In Zeile 2 speichern wir den Pin für die Kommunikation mit dem DHT11 in die Variablen dht11Pin und da wir den Pin 8 benutzen, legen wir auch diesen fest. In der 3. Zeile legen wir noch fest, dass wir die DHT11 Library mit DHT11 ansprechen. Das ist wichtig, damit das Programm weiß, wann die Bibliothek angesprochen wird.

In der setup()-Funktion starten wir nur in Zeile 6 die Serielle Kommunikation. Um den Rest kümmert sich die eingebundene Bibliothek.

Der Hauptteil des Programms findet wieder in der loop()-Funktion statt. In Zeile 10 werden in der Variablen checkSensor zum ersten Mal die Sensordaten ausgelesen. Wir können dabei nicht einfach die Funktion benutzen, sondern müssen zuerst sagen, woher wir diese haben. Dazu nehmen wir einfach den Namen der Bibliothek und stellen ihn mit einem . vor die Funktion. Das könnte beispielsweise so aussehen: variable = Bibliothek.funktion(wert1, wert2);. Mit DHT11.read(dht11Pin); bekommen wir den momentanen Status des Sensors und legen gleichzeitig auch noch fest, an welchen Pin wir den DHT11 mit dem Arduino verbunden haben. In Zeile 13 bis 25 kontrollieren wir mit einer if-Bedingung, wie der Status des Sensors ist und übersetzen das in eine für Menschen lesbare Form. Die Bezeichnung der Fehlermeldungen werden von der Bibliothek festgelegt.

In Zeile 27 bis 31 werden die gemessenen Werte menschenfreundlich ausgegeben werden. Dazu müssen wir diesmal keine Funktion benutzen, sondern können diese Werte ähnlich wie die Funktion abrufen und benutzten dafür einfach Bibliothek.Wert;. In diesem Fall müssen wir nur wissen, dass wir den Feuchtigskeitswert mit .humidity und den den Temperaturwert mit .temperature bekommen. Da wir aber eine menschenfreundliche Ausgabe haben wollen, müssen zuerst noch den Wert umwandeln. Normalerweise werden Temperatur und Feuchtigkeit nicht als Dezimalzahl, sondern als Binärzahl ausgegeben. Um daraus eine Binärzahl zu machen, benutzen wir (int)101;, in diesem Fall würde es 5 ausgeben. Das (int) wandelt also den nachfolgenden Wert in eine Dezimalzahl um, welche dann einfach für Menschen zu lesen ist.

Sehr gut! Temperatur und Feuchtigkeit zu messen, sollte jetzt kein Problem mehr darstellen.

Aufgaben

  1. Was ist eine Bibliothek?
  2. Wie werden Bibliotheken benutzt? (Mit konkreten Code Beispielen)
  3. Baue mit 3 LEDs und dem Ultraschallsensor eine Schaltung, bei der unterschiedliche LEDs bei unterschiedlichen Entfernungen angezeigt werden.
  4. Baue eine binäre Temperaturanzeige mit LEDs. Versuche dich zusammen mit anderen daran.

Noch Fragen oder Feedback?

Bevor du eine Frage stellen kannst musst du dich zuerst Anmelden oder Regestrieren!