Nr.07 Bewegungsmelder HC-SR501

Inhaltsverzeichnis

Der Bewegungsmelder HC-SR501

Bewegungsmelder sind aus unserem Alltag nicht wegzudenken:

Aufgabe: Ein Piezo-Lautsprecher soll piepen, sobald eine Bewegung registriert wird.

Lerninhalt: Spannung eines Bewegungsmelder (HC-SR501) auslesen und für eine Ausgabe verwenden.

Erklärungen zum Bewegungsmelder

Der Bewegungsmelder HC-SR501, auch PIR Sensor (Passive Infrared Sensor) genannt, ist sehr einfach konstruiert. Sobald er eine Bewegung detektiert, gibt er auf einem Pin eine Spannung von 5 Volt aus. Diese muss nur ausgelesen und vom Mikrocontroller verarbeitet werden.

Die Dauer des Ausgangssignals (linker Regler) und die Sensibilität (rechter Regler) kann über Drehregler eingestellt werden (Bild rechts).

hcsr501-potentiometer
Bewegungsmelder hc-sr501 ohne kappe

Die Kunststofflinse ist nur leicht gesteckt. Wenn man sie abhebt kann man den Infrarotdetektor erkennen und man sieht anhand der Beschriftung unter der Linse, wie der Sensor verkabelt werden muss: GND ( – ), OUT (Ausgang des Signals), VCC ( + ).

Auf dem lnken Bild sieht man am oberen Rand die Bezeichnungen der Kontakte.

1) Jumper ist wie auf dem Bild ganz außen: Das Ausgangssignal wird nachdem eine Bewegung detektiert wurde für eine gewisse Zeit aufrecht erhalten und danach auf jeden Fall wieder deaktiviert, auch wenn im Aktionsbereich des Bewegungsmelders noch eine Bewegung detektiert werden könnte. Nach einer gewissen Zeit wird das Ausgangssignal erneut erzeugt.

2) Der Jumper ist leicht nach innen versetzt. Das Ausgangssignal bleibt pausenlos aktiv, so lange vom Bewegungsmelder eine Bewegung detektiert wird.

hc-sr501 jumperposition

Hinweis: Die neuste Version des Bewegungsmelder verzichtet auf die Jumperbrücke. Der Sensor kann über die Potentiometer direkt kalibriert werden.

Schaltpläne

Beachte bei der Verkabelung dass die beiden Potentiometer nach vorn zeigen.

Der Programmcode

Arduino UNO

// Das Wort "Piezo“ steht jetzt für den Wert 5.
int Piezo = 5;     

// Das Wort "Bewegungsmelder“ steht jetzt für den Wert 7.
int Bewegungsmelder = 7;  

// Das Wort "Bewegungsstatus“ steht jetzt zunächst für den Wert 0. 
// Später wird unter dieser Variable gespeichert, ob eine Bewegung erkannt wird oder nicht.
int Bewegungsstatus = 0; 

// Hier beginnt das setup.
void setup()  
{
  // Der Pin mit dem Piezo (Pin 5) ist jetzt ein Ausgang.
  pinMode(Piezo, OUTPUT); 
 
  // Der Pin mit dem Bewegungsmelder (Pin 7) ist jetzt ein Eingang.
  pinMode(Bewegungsmelder, INPUT);  
}

// Der loop-Teil beginnt
void loop()                                 
{                                           
  // Hier wird der Pin 7 ausgelesen. Das Ergebnis wird in der Variablen "Bewegungsstatus“ 
  // mit dem Wert „HIGH“ für 5 Volt oder „LOW“ für 0 Volt gespeichert.
  Bewegungsstatus = digitalRead(Bewegungsmelder);  

  // Wenn eine Bewegung erkannt wird (das Signal ist HIGH) dann soll der Piezo piepsen.
  if (Bewegungsstatus == HIGH)              
  {                                         
    digitalWrite(Piezo, HIGH);              
    delay(5000);                            //...und zwar für für 5 Sekunden.
    digitalWrite(Piezo, LOW);               //...danach wird er ausgeschaltet.
  }   

  // ansonsten, wenn das erkannte Signal LOW ist
  else                                     
  {            
    //...soll der Piezo-Lautsprecher aus sein.
    digitalWrite(Piezo, LOW);              
  }                                         
}  
// Mit dieser letzten Klammer wird der loop-Teil geschlossen.

Wemos D1 Mini

// Das Wort "Piezo“ steht jetzt für den Wert D3.
int Piezo = D3;     

// Das Wort "Bewegungsmelder“ steht jetzt für den Wert D1.
int Bewegungsmelder = D1;  

// Das Wort "Bewegungsstatus“ steht jetzt zunächst für den Wert 0. 
// Später wird unter dieser Variable gespeichert, ob eine Bewegung erkannt wird oder nicht.
int Bewegungsstatus = 0; 

// Hier beginnt das setup.
void setup()  
{
  // Der Pin mit dem Piezo (Pin D3) ist jetzt ein Ausgang.
  pinMode(Piezo, OUTPUT); 
 
  // Der Pin mit dem Bewegungsmelder (Pin D1) ist jetzt ein Eingang.
  pinMode(Bewegungsmelder, INPUT);  
}

// Der loop-Teil beginnt
void loop()                                 
{                                           
  // Hier wird der Pin D1 ausgelesen. Das Ergebnis wird in der Variablen "Bewegungsstatus“ 
  // mit dem Wert „HIGH“ für 5 Volt oder „LOW“ für 0 Volt gespeichert.
  Bewegungsstatus = digitalRead(Bewegungsmelder);  

  // Wenn eine Bewegung erkannt wird (das Signal ist HIGH) dann soll der Piezo piepsen.
  if (Bewegungsstatus == HIGH)              
  {                                         
    digitalWrite(Piezo, HIGH);              
    delay(5000);                            //...und zwar für für 5 Sekunden.
    digitalWrite(Piezo, LOW);               //...danach wird er ausgeschaltet.
  }   

  // ansonsten, wenn das erkannte Signal LOW ist
  else                                     
  {            
    //...soll der Piezo-Lautsprecher aus sein.
    digitalWrite(Piezo, LOW);              
  }                                         
}  
// Mit dieser letzten Klammer wird der letztenoop-Teil geschlossen.

ESP32-Wroom

Beim ESP32-Wroom gibt es im setup-Teil eine Besonderheit:
Der pinMode des Bewegungsmelders muss mit INPUT_PULLDOWN definiert werden.

// Das Wort "Piezo“ steht jetzt für den Wert 22.
int Piezo = 22;     

// Das Wort "Bewegungsmelder“ steht jetzt für den Wert 23.
int Bewegungsmelder = 23;  

// Das Wort "Bewegungsstatus“ steht jetzt zunächst für den Wert 0. 
// Später wird unter dieser Variable gespeichert, ob eine Bewegung erkannt wird oder nicht.
int Bewegungsstatus = 0; 

// Hier beginnt das setup.
void setup()  
{
  // Der Pin mit dem Piezo (Pin 22) ist jetzt ein Ausgang.
  pinMode(Piezo, OUTPUT); 
 
  // Der Pin mit dem Bewegungsmelder (Pin 23) ist jetzt ein Eingang.
  // INPUT_PULLDOWN: der interne Widerstand wird auf LOW gezogen
  pinMode(Bewegungsmelder, INPUT_PULLDOWN);  
}

// Der loop-Teil beginnt
void loop()                                 
{                                           
  // Hier wird der Pin 23 ausgelesen. Das Ergebnis wird in der Variablen "Bewegungsstatus“ 
  // mit dem Wert „HIGH“ für 5 Volt oder „LOW“ für 0 Volt gespeichert.
  Bewegungsstatus = digitalRead(Bewegungsmelder);  

  // Wenn eine Bewegung erkannt wird (das Signal ist HIGH) dann soll der Piezo piepsen.
  if (Bewegungsstatus == HIGH)              
  {                                         
    digitalWrite(Piezo, HIGH);              
    delay(5000);                            //...und zwar für für 5 Sekunden.
    digitalWrite(Piezo, LOW);               //...danach wird er ausgeschaltet.
  }   

  // ansonsten, wenn das erkannte Signal LOW ist
  else                                     
  {            
    //...soll der Piezo-Lautsprecher aus sein.
    digitalWrite(Piezo, LOW);              
  }                                         
}  
// Mit dieser letzten Klammer wird der loop-Teil geschlossen.

NodeMCU

// Das Wort "Piezo“ steht jetzt für den Wert D1.
int Piezo = D1;     

// Das Wort "Bewegungsmelder“ steht jetzt für den Wert D2.
int Bewegungsmelder = D2;  

// Das Wort "Bewegungsstatus“ steht jetzt zunächst für den Wert 0. 
// Später wird unter dieser Variable gespeichert, ob eine Bewegung erkannt wird oder nicht.
int Bewegungsstatus = 0; 

// Hier beginnt das setup.
void setup()  
{
  // Der Pin mit dem Piezo (Pin D1) ist jetzt ein Ausgang.
  pinMode(Piezo, OUTPUT); 
 
  // Der Pin mit dem Bewegungsmelder (Pin D2) ist jetzt ein Eingang.
  pinMode(Bewegungsmelder, INPUT);  
}

// Der loop-Teil beginnt
void loop()                                 
{                                           
  // Hier wird der Pin D2 ausgelesen. Das Ergebnis wird in der Variablen "Bewegungsstatus“ 
  // mit dem Wert „HIGH“ für 5 Volt oder „LOW“ für 0 Volt gespeichert.
  Bewegungsstatus = digitalRead(Bewegungsmelder);  

  // Wenn eine Bewegung erkannt wird (das Signal ist HIGH) dann soll der Piezo piepsen.
  if (Bewegungsstatus == HIGH)              
  {                                         
    digitalWrite(Piezo, HIGH);              
    delay(5000);                            //...und zwar für für 5 Sekunden.
    digitalWrite(Piezo, LOW);               //...danach wird er ausgeschaltet.
  }   

  // ansonsten, wenn das erkannte Signal LOW ist
  else                                     
  {            
    //...soll der Piezo-Lautsprecher aus sein.
    digitalWrite(Piezo, LOW);              
  }                                         
}  
// Mit dieser letzten Klammer wird der loop-Teil geschlossen.

Cover und Case aus dem 3D-Drucker

3D-Druck: Für den Bewegungsmelder gibt es bei Thingiverse diverse Cover und Case zum ausdrucken:

https://www.thingiverse.com/thing:2386494

https://www.thingiverse.com/thing:291270

https://www.thingiverse.com/thing:1168896

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE