Skip to Content

Wie man den HC-SR501 PIR-Bewegungssensor mit Arduino verwendet

Wie man den HC-SR501 PIR-Bewegungssensor mit Arduino verwendet

In diesem Tutorial lernst du, wie der HC-SR501 PIR-Bewegungssensor funktioniert und wie du ihn mit Arduino verwenden kannst. Passive Infrarot-(PIR)-Sensoren findest du überall; sie werden nicht nur für Sicherheitszwecke eingesetzt, sondern auch in den meisten automatisch aktivierten Beleuchtungssystemen.

In diesem Artikel habe ich einen Schaltplan und Beispielcodes eingefügt, damit du mit deinem Sensor experimentieren kannst. Nach jedem Beispiel erkläre ich, wie der Code funktioniert, sodass du ihn problemlos an deine Bedürfnisse anpassen kannst.

Zuerst zeige ich dir, wie du den HC-SR501 als eigenständige Einheit verwenden kannst. Danach verbinden wir ihn mit einem Arduino UNO und ich zeige dir, wie du ihn als einfaches Alarmsystem nutzen kannst.

Dieses Tutorial konzentriert sich auf den HC-SR501 Sensor, aber du kannst den bereitgestellten Code auch für ähnliche Sensoren wie den HC-SR505 oder AM312 verwenden. Der Hauptunterschied ist, dass diese günstigeren Sensoren eine geringere Erkennungsreichweite haben und keinen Potentiometer zur Einstellung der Empfindlichkeit und Verzögerungszeit besitzen.

Materialien

Hardware-Komponenten

HC-SR501HC-SR501 PIR motion sensor× 1Amazon
Arduino Uno Rev 3Arduino Uno Rev3× 1Amazon
Breadboard× 1Amazon
Jumper wires× 10Amazon
resistorResistor assortment× 1Amazon
red-ledLEDs× 1Amazon
buzzerPassive buzzer× 1Amazon
USB cable type A/B× 1Amazon

Software

Arduino IDEArduino IDE

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Wie funktioniert ein PIR-Bewegungssensor?

PIR-Bewegungssensoren bestehen aus zwei Hauptteilen: einem pyroelektrischen Sensorelement und einer Fresnel-Linse. Das pyroelektrische Sensorelement kann Infrarotstrahlung erkennen. Alle Objekte mit einer Temperatur über dem absoluten Nullpunkt (0 Kelvin / -273,15 °C) senden Wärmeenergie in Form von Infrarotstrahlung aus, einschließlich menschlicher Körper.

HC-SR501-PIR-Motion-Sensor-working-principle
Funktion des PIR-Bewegungssensors

Ein pyroelektrischer Sensor hat zwei rechteckige Öffnungen aus einem Material, das Infrarotstrahlung durchlässt. Dahinter befinden sich zwei separate Infrarotsensorelektroden, von denen eine für ein positives Ausgangssignal und die andere für ein negatives Ausgangssignal zuständig ist. Der Grund dafür ist, dass wir eine Änderung der IR-Werte und nicht die Umgebungs-IR-Werte erfassen wollen. Die beiden Elektroden sind so verschaltet, dass sie sich gegenseitig aufheben. Wenn eine Hälfte mehr oder weniger IR-Strahlung sieht als die andere, schwingt der Ausgang auf HIGH oder LOW.

Der integrierte Signalverarbeitungs-IC verarbeitet dieses Signal und schaltet den Ausgangspin des Sensors entsprechend auf HIGH oder LOW.

HC-SR501-PIR-Motion-Sensor-pyroelectric-element
Gehäuse des PIR-Bewegungssensors

Die weiße Kuppel vor dem Sensorelement ist eine Fresnel-Linse. Diese Linse bündelt die Infrarotstrahlung auf den Sensor.

HC-SR501-PIR-Motion-Sensor-fresnel-lens-working-principle
Fresnel-Linse des PIR-Bewegungssensors

HC-SR501 PIR-Bewegungssensor

Der HC-SR501 PIR-Bewegungssensor basiert auf dem BISS0001 Micro Power PIR Motion Detector IC. Dieser IC wurde speziell zur Signalverarbeitung von PIR-Bewegungssensoren entwickelt.

Wenn du die Fresnel-Linse entfernst, siehst du das RE200B pyroelektrische Sensorelement. Auf der Platine findest du außerdem einen eingebauten Spannungsregler. Das bedeutet, dass du die Platine mit einer großen Gleichspannungsspannung versorgen kannst, typischerweise werden 5 V verwendet.

Die Spezifikationen des HC-SR501 sind in der folgenden Tabelle aufgeführt, beachte, dass es kleine Unterschiede zwischen den Herstellern geben kann.

HC-SR501 Spezifikationen

Betriebsspannung4,5 – 20 V
Ruhe-Stromaufnahme50 μA
AusgangspegelHIGH 3,3 V / LOW 0 V
TriggerL Einzel-Trigger / H Wiederholungs-Trigger
Verzögerungszeit3 – 300 s
Blockierzeit2,5 s (Standard)
TriggerL Einzel-Trigger / H Wiederholungs-Trigger
Messbereich3 – 7 m maximal
2 mm
Messwinkel< 110° Kegelwinkel
Platinengröße32,5 x 24 mm
Befestigungslöcher2 mm, 28,5 mm Abstand
Fresnel-Linsengröße15 mm x 23 mm Durchmesser
Betriebstemperatur-15 – 70 °C
KostenCheck price

Für weitere Informationen kannst du die untenstehenden Datenblätter ansehen:

Einstellung des HC-SR501

Auf der Rückseite der Platine findest du zwei Potentiometer und einen Jumper, mit denen du verschiedene Parameter einstellen kannst:

HC-SR501-Pinout-Annotation
HC-SR501 Board Pinbelegung

Empfindlichkeit (Reichweite) einstellen

Der HC-SR501 hat eine maximale Erkennungsreichweite von 7 Metern. Du kannst die Erkennungsreichweite einstellen, indem du den Empfindlichkeitspotentiometer im Uhrzeigersinn (CW) oder gegen den Uhrzeigersinn (CCW) drehst (siehe Bild oben). Eine Drehung im Uhrzeigersinn erhöht die Reichweite auf maximal 7 Meter, eine Drehung gegen den Uhrzeigersinn verringert sie auf mindestens 3 Meter.

Verzögerungszeit einstellen (Tx)

Mit diesem Potentiometer kannst du einstellen, wie lange der Ausgang nach der Bewegungserkennung auf HIGH bleibt. Minimum sind 3 Sekunden, maximal 300 Sekunden (5 Minuten). Drehe den Potentiometer im Uhrzeigersinn, um die Verzögerung zu erhöhen, gegen den Uhrzeigersinn, um sie zu verringern.

Trigger-Auswahl-Jumper

Der (gelbe) Jumper kann verwendet werden, um einen der beiden Trigger-Modi auszuwählen. Er kann auf entweder L (Einzel-Trigger) oder H (Wiederholungs-Trigger) gesetzt werden:

  • Einzel-Trigger – Der Ausgang schaltet auf HIGH, sobald Bewegung erkannt wird. Er bleibt für die durch den Potentiometer eingestellte Zeit HIGH. Bewegungen während dieser Zeit werden nicht verarbeitet und starten den Timer nicht neu.
  • Wiederholungs-Trigger – Jedes Mal, wenn Bewegung erkannt wird, wird der Verzögerungstimer neu gestartet.

Der Unterschied zwischen Einzel- und Wiederholungs-Trigger-Modus ist in der folgenden Abbildung dargestellt.

Difference-between-single-and-repeating-trigger-HC-SR501
Unterschied zwischen Einzel- und Wiederholungs-Trigger-Modus. Die Pfeile zeigen die eingestellte Verzögerungszeit an.

Hinzufügen eines Thermistors und/oder LDR zum HC-SR501

Wie im Bild unten zu sehen, hat der HC-SR501 Lötpads für zwei zusätzliche Bauteile. Diese Pads sind typischerweise mit ‘RL’ und ‘RT’ beschriftet.

HC-SR501-RL-and-RT-solder-pads
HC-SR501 Lötpads
  • RL – Hier kannst du einen light dependent resistor (LDR) oder Fotowiderstand hinzufügen, der bei starkem Umgebungslicht einen niedrigen Widerstand hat. Dadurch ist der Detektor nur dann aktiv, wenn der Erkennungsbereich ausreichend dunkel ist.
  • RT – Dieses Pad ist für einen thermistor. Dadurch wird die Empfindlichkeit des Sensors weniger abhängig von der Umgebungstemperatur.

Leider geben die Datenblätter keine weiteren Informationen, daher bin ich mir nicht ganz sicher, welche Bauteilwerte du verwenden solltest.

Verwendung des HC-SR501 PIR-Bewegungssensors als eigenständige Einheit

Für die meisten Anwendungen kannst du den HC-SR501 einfach als eigenständige Einheit verwenden. Du kannst das Ausgangssignal nutzen, um z.B. Relais und LEDs zu steuern.

Die Verkabelung ist sehr einfach, wie im Bild unten zu sehen. Verbinde einfach VCC und GND mit einer Batterie und eine rote LED zwischen den Ausgangspin und Masse. Die Ausgangsspannung beträgt 3,3 V, daher habe ich einen 68 Ω Vorwiderstand in Reihe mit der LED hinzugefügt.

HC-SR501-PIR-motion-sensor-with-LED-wiring-diagram-schematic
HC-SR501 PIR-Bewegungssensor mit LED-Schaltplan

Beachte, dass du nach dem Einschalten des Sensors 30 – 60 Sekunden warten musst, bis der Sensor initialisiert ist. Während dieser Zeit kann die LED ein paar Mal blinken. Nach einer Minute kannst du deine Hand vor den Sensor bewegen und die LED sollte aufleuchten.

Mit diesem Aufbau kannst du die Funktionalität des Sensors leicht testen. Es ist auch ein guter Moment, um mit den Einstellungen für Empfindlichkeit, Zeitverzögerung und den beiden Trigger-Modi zu experimentieren.

Verkabelung – Anschluss des HC-SR501 PIR-Bewegungssensors an Arduino UNO

Indem du den Bewegungssensor an einen Mikrocontroller wie den Arduino UNO anschließt, kannst du damit alle möglichen Dinge steuern: LEDs, Relais, Motoren, Summer usw.

Im Schaltplan unten siehst du, wie du ihn an den Arduino anschließt. Du kannst den Sensor mit einem der allgemeinen Ein-/Ausgabe-Pins (GPIO) des Arduino auslesen. In diesem Beispiel habe ich ihn an den digitalen Pin 2 angeschlossen. Die Pins VCC und GND sind mit 5 V bzw. Masse verbunden.

HC-SR501-PIR-motion-sensor-with-Arduino-UNO-wiring-diagram-schematic
HC-SR501 PIR-Bewegungssensor mit Arduino-Schaltplan

Die Anschlüsse sind auch in der folgenden Tabelle aufgeführt:

HC-SR501 PIR-Bewegungssensor Anschlüsse

HC-SR501 PIR-BewegungssensorArduino
VCC5 V
OUTPin 2
GNDGND

Sobald du den Sensor verkabelt hast, ist der nächste Schritt, Beispielcode hochzuladen.

HC-SR501 PIR-Bewegungssensor mit Arduino UNO Beispielcode

Mit dem folgenden Beispielcode kannst du den Sensor auslesen und die eingebaute LED des Arduino (verbunden mit Pin 13) steuern. Dieser Code kann auch verwendet werden, um einfache Relais zu steuern, um z.B. ein größeres Licht ein- oder auszuschalten.

Damit der Code richtig funktioniert, solltest du den Trigger-Modus-Jumper auf ‘H’ (Wiederholungs-Trigger-Modus) setzen. Stelle außerdem den Zeitverzögerungspotentiometer auf den niedrigsten Wert, indem du ihn ganz gegen den Uhrzeigersinn drehst.

Der Code liest den Zustand des Sensors (HIGH oder LOW) aus und schaltet die eingebaute LED entsprechend ein oder aus. Außerdem wird eine Nachricht an den Serial Monitor gesendet, den du unter Tools findest oder mit (Strg+Shift+M) öffnen kannst.

/* Example code for HC-SR501 PIR motion sensor with Arduino. 
   More info: www.www.makerguides.com */

// Define connection pins:
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

void setup() {
  // Configure the pins as input or output:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    digitalWrite(ledPin, LOW); // Turn off the on-board LED.

    // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

Du solltest folgende Ausgabe im Serial Monitor sehen:

HC-SR501 PIR motion sensor Serial Monitor output
PIR-Sensor-Ausgabe im Serial Monitor

Code-Erklärung:

Der Code ist recht einfach und du benötigst keine Arduino-Bibliotheken, um diesen Sensor zu verwenden.

Das Sketch beginnt mit der Definition des PIR-Sensor-Pins und des LED-Pins. Ich habe sie an Arduino Pin 2 bzw. 13 (eingebaute LED) angeschlossen.

Die Anweisung #define wird verwendet, um einem konstanten Wert einen Namen zu geben. Der Compiler ersetzt alle Verweise auf diese Konstante durch den definierten Wert, wenn das Programm kompiliert wird. Also überall, wo du pirPinerwähnst, ersetzt der Compiler es beim Kompilieren durch den Wert 2.

Ich habe auch zwei Variablen erstellt, val und motionState, die jeweils ein integer und ein boolean (true/false) sind. Die Variable val speichert den Ausgang des PIR-Sensors (HIGH oder LOW) und motionState wird auf true gesetzt, wenn Bewegung erkannt wird, und auf false, wenn keine Bewegung vorliegt.

// Define connection pins:
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

Im setup()werden die Pins mit der Funktion pinMode(pin,mode)als Eingang oder Ausgang gesetzt. Der pirPin ist ein Eingang und der ledPin ein Ausgang. Außerdem wird die serielle Kommunikation mit einer Baudrate von 9600 gestartet. Achte darauf, dass der Serial Monitor ebenfalls auf 9600 eingestellt ist.

void setup() {
  // Configure the pins as input or output:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

Im loop()lese ich zuerst den Sensor mit der Funktion digitalRead(pin)aus. Diese Funktion gibt HIGH oder LOW zurück.

  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

Wenn der Sensor-Ausgang/val HIGH ist, schalte ich die LED mit der Funktion digitalWrite(pin,value)ein.

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

Anschließend wird motionState auf true gesetzt und die Nachricht „Motion detected!“ an den Serial Monitor gesendet. Ich prüfe zuerst den aktuellen motionState, damit die Nachricht nur einmal pro Bewegungsevent ausgegeben wird.

Wenn keine Bewegung mehr vor dem Sensor ist, wird valauf LOW gesetzt, die LED ausgeschaltet und die Nachricht „Motion ended!“ an den Serial Monitor gesendet.

Erstelle ein Alarmsystem mit PIR-Bewegungssensor und Summer

Mit einigen einfachen Änderungen kannst du ein Alarmsystem mit dem HC-SR501 und einem piezoelectric buzzer bauen. Ich habe den Summer mit einem 100 Ω Widerstand zwischen digitalem Pin 5 und Masse angeschlossen. Du kannst den Summer wahrscheinlich auch ohne Widerstand verwenden (dann ist er lauter), aber der Klang ist dann nicht so angenehm.

HC-SR501-PIR-motion-sensor-with-buzzer-and-Arduino-UNO-wiring-diagram-schematic
HC-SR501 PIR-Bewegungssensor mit Arduino UNO und Summer Schaltplan.

Der Code unten ist größtenteils derselbe wie im vorherigen Beispiel. Ich habe nur eine Funktion hinzugefügt, um den piependen Alarmton zu erzeugen. Du kannst die Tonhöhe des Summers ändern, indem du den Eingabeparameter der alarm(duration,frequency) Funktion änderst.

/* Example code to create an alarm system with HC-SR501 PIR motion sensor, buzzer and Arduino. 
   More info: www.www.makerguides.com */

// Define connection pins:
#define buzzerPin 5
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

void setup() {
  // Configure the pins as input or output:
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.
    alarm(500, 1000);  // Call the alarm(duration, frequency) function.
    delay(150);

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    digitalWrite(ledPin, LOW); // Turn off the on-board LED.
    noTone(buzzerPin); // Make sure no tone is played when no motion is detected.
    delay(150);

    // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

// Function to create a tone with parameters duration and frequency:
void alarm(long duration, int freq) {
  tone(buzzerPin, freq);
  delay(duration);
  noTone(buzzerPin);
}

Wichtige Hinweise beim Entwerfen eines PIR-Sensorsystems

Wie bei anderen PIR-Sensoren braucht auch der HC-SR501 etwas Zeit, um sich zu initialisieren und an die Infrarotwerte im Raum anzupassen. Das dauert etwa 1 Minute nach dem Einschalten. Versuche, während dieser Zeit keine Bewegung vor dem Sensor zu verursachen.

Wind und eine Lichtquelle in der Nähe des Sensors können Störungen verursachen, versuche daher, dein Setup entsprechend anzupassen. Beachte auch, dass du den Sensor waagerecht montieren solltest, da die meisten Bewegungen in der horizontalen Ebene stattfinden (z.B. Gehen).

Neben der Verzögerungszeit (Tx) hat der Sensor auch eine „Blockierzeit“ (Ti). Standardmäßig beträgt die Blockierzeit 2,5 Sekunden und sie ist nicht leicht änderbar (siehe BISS0001 Datenblatt). Jedes Mal, wenn der Ausgang von HIGH auf LOW wechselt, beginnt die Blockierzeit. Während dieser Zeit erkennt der Sensor keine Bewegung.

Beim Entwerfen eines Systems mit dem HC-SR501 musst du diese Verzögerungszeiten berücksichtigen.

Fazit

In diesem Artikel habe ich dir gezeigt, wie der HC-SR501 PIR-Bewegungssensor funktioniert und wie du ihn mit Arduino verwenden kannst. Ich hoffe, du fandest es nützlich und informativ. Wenn du Fragen, Vorschläge hast oder denkst, dass in diesem Tutorial etwas fehlt, hinterlasse bitte unten einen Kommentar.