Der HC-SR501 ist ein sog. PIR-Bewegungssensor – „PIR” steht dabei für pyro-elektrischer (auch: passiver) Infrarot-Sensor (engl.: pyroelectric infrared sensor) und ist der am häufigsten eingesetzte Typ von Bewegungssensoren. Wie der Name sagt, reagiert er auf Infrarotstrahlung – also Wärme – von Objekten, die sich am Sensor vorbei bewegen. Über dem eigentlichen Sensor ist eine Halbkugel aus transparentem Kunststoff angebracht, die in mehrere Facetten, sog. Fresnel-Linsen, unterteilt ist. Das bewirkt, dass ein relativ großer Bereich vor dem Sensor überwacht werden kann – lt. Datenblatt bei dem hier verwendeten Sensor vom Typ HC-SR501 ein kegelförmiger Bereich von maximal 110° bis zu einer Entfernung von 6-7 Metern. Eine genaue Beschreibung der Funktionsweise findet sich bei Wikipedia, Adafruit stellt ein PDF in englischer Sprache bereit, in dem Funktion, Aufbau und Anwendung beschrieben werden.
Anschlüsse des HC-SR501

Neben den Anschlüssen für Spannung und Masse wird am ESP32 oder Arduino nur ein Digital-Pin benötigt. Stellt der Sensor eine Bewegung fest, liefert der Pin ein HIGH-Signal. Da sonst keine Informationen übermittelt werden können, muss auch keine Bibliothek installiert werden.
Nach dem Anschalten braucht der Sensor etwa eine halbe bis eine Minute, um sich zu kalibrieren.
Folgende Anschlüsse und Einstellmöglichkeiten sind vorhanden – je nach Hersteller beschriftet oder unbeschriftet:
- VCC – Spannungsversorgung
5 Volt werden zum Betrieb des HC-SR501 empfohlen; im Web werden 4,5 – 12 Volt, tlw. auch 20 V als Grenzen genannt.
An einem Arduino(-Nachbau) mit seinen standardmäßigen 5 Volt funktioniert der Sensor also wie erwartet. Am ESP32 muss man darauf achten, den 5V-Pin – oft mit „VIN” beschriftet – zu nutzen. (Beim Betrieb mit 3,3 Volt setzt mein Sensor den Ausgabe-Pin alle paar Sekunden kurz auf HIGH, egal ob sich vor dem Sensor etwas bewegt oder nicht.) - OUT – Ausgabe
Der mittlere Pin gibt LOW (0 V; keine Bewegung) oder HIGH (3,3 V; Bewegung erkannt) aus. - GND – Masse
- Potentiometer P1 – Ausschaltverzögerung
- Potentiometer P2 – Empfindlichkeit
- Jumper J – einmalige oder laufende Erkennung
P1 – Ausschaltverzögerung
Mit dem Potentiometer P1 (links im Bild) stellt man ein, wie lange der Ausgabepin nach dem Erkennen einer Bewegung ein HIGH-Signal ausgibt. Minimal (linker Anschlag) sind es bei meinem Modul ca. 1,7 Sekunden, auf ungefährer Mittelstellung gut 200 und maximal 430 Sekunden, also gut 7 Minuten. In Datenblättern zum HC-SR501 habe ich Werte zwischen 5 und 300 (auch 250) Sekunden gefunden. Da muss man also ausprobieren, was das eigene Modul macht. Exakte Zeiten lassen sich mit dem Potentiometer kaum einstellen. Will man das erreichen, muss man sich per Programmlogik selbst darum kümmern, wie lange z.B. ein Lichtsignal oder ein Relais geschaltet werden soll.
P2 – Empfindlichkeit
Mit dem anderen Potentiometer stellt man die Empfindlichkeit (Sensitivität) ein; durch Drehen im Uhrzeigersinn wird sie erhöht. Bei meinen Versuchen im kleinen Rahmen (kurze Entfernungen im Innenbereich) habe ich keine Auswirkungen festgestellt.
Jumper

Der Jumper (auf dem Bild oben der gelbe Stecker in der rechten oberen Ecke des Moduls) regelt, wie der Sensor auf wiederholte Bewegungen reagiert. Ist er wie im Bild gesetzt, d.h. der Pin oben in der Ecke und sein Nachbar sind verbunden (hier rot markiert), geht der Ausgabepin nach Erkennen einer Bewegung auf HIGH und wechselt nach der mit dem Potentiometer eingestellten Zeit auf LOW. Auch wenn weitere Bewegungen stattfinden, bleibt er dann eine kurze Zeit (ca. 3 Sekunden) auf LOW und geht erst anschließend wieder auf HIGH.
Ist der Jumper auf den mittleren und unteren Pin gesteckt (grün markierte Position; der Pin oben in der Ecke ist frei), berücksichtigt der Sensor erneute Bewegungen. Der Ausgabepin bleibt so lange auf HIGH, wie Bewegungen erkannt werden und geht dann nach Ablauf der Wartezeit auf LOW. [1]So beschreibt es auch die Seite components101.com und bezeichnet den ersten Modus (Ausschalten nach Ablauf der Zeit und ggf. erneutes Anschalten nach einer kurzen Pause) als „Repeatable (H) … Continue reading
Mit anderen Worten (t ist die durch das Potentiometer P1 eingestellte Zeit):
- Jumper in oberer Position – HIGH-Signal genau für t Sekunden nach der ersten Bewegung, dann LOW; beim Erkennen weiterer Bewegung nach einer kurzen Pause erneut auf HIGH
- Jumper in unterer Position – dauerhaftes HIGH-Signal ab der ersten bis t Sekunden nach der letzten Bewegung (i.d.R. also mehr als t Sekunden)
Testaufbau
Zum Testen habe ich einen einfachen Aufbau gewählt: Der PIR-Sensor schaltet eine LED. Man kann den Wert des Ausgabe-Pins unverändert weitergeben, um damit die LED ein- oder auszuschalten:
digitalWrite(LED_PIN, digitalRead(PIR_PIN));
Ginge es nur um das Schalten der LED (oder z.B. eines Relais), könnte man ganz auf den Mikrocontroller verzichten und die LED direkt mit dem Ausgabepin des HC-SR501-Sensors verbinden.
Die Schaltung ist trivial und lässt sich statt mit einem ESP32 genauso mit einem Arduino umsetzen – man sucht sich zwei Digital-Pins aus und passt im Sketch die Angaben für PIR_PIN
und LED_PIN
entsprechend an.
Programm
Wie oben erwähnt, muss für diesen Sensor keine Bibliothek installiert werden, da nur eine einfache Ausgabe über einen Digitalpin erfolgt.
Um zu sehen, was beim Verstellen der Potentiometer oder beim Umstecken des Jumpers passiert, gibt das Programm die jeweilige Zeitdauer, die der Ausgabe-Pin auf LOW oder HIGH steht, über den seriellen Monitor der Arduino-IDE aus.
/* Test des PIR-Bewegungsmelders HC-SR501 * * 2019-10-26 Heiko (unsinnsbasis.de) */ #define PIR_PIN 25 #define LED_PIN 14 boolean bewegung; unsigned long zeit; // Start-Zeit eines Schaltzyklus void setup() { pinMode(PIR_PIN, INPUT); pinMode(LED_PIN, OUTPUT); bewegung = false; Serial.begin(115200); // Arduino: 9600 } void loop() { // Ausgabe des Sensors direkt zur Steuerung der LED verwenden digitalWrite(LED_PIN, digitalRead(PIR_PIN)); // neue Bewegung entdeckt: Ausschalt-Dauer ausgeben if (digitalRead(PIR_PIN) && !bewegung) { bewegung = true; Serial.print("aus: "); Serial.print((float)(millis()-zeit)/1000.0); Serial.println(" s"); zeit = millis(); } // Bewegung wurde beendet: Zeitdauer ausgeben if (!digitalRead(PIR_PIN) && bewegung) { bewegung = false; Serial.print("EIN: "); Serial.print((float)(millis()-zeit)/1000.0); Serial.println(" s"); zeit = millis(); } delay(100); }
Material
- Breadboard
- ESP32 (oder Arduino)
- PIR-Sensor HC-SR501
- 1 (einfarbige) LED
- 1 Widerstand (330 oder 220 Ω)
- ein paar Jumperkabel und/oder Steckbrücken
Verbindungen
Statt der hier verwendeten GPIO-Pins 14 und 25 können natürlich auch andere passende Pins des ESP32 (oder eines Arduino) genutzt werden, wenn im Programm die Angaben für PIR_PIN
und LED_PIN
angepasst werden.
- LED: Kathode über Widerstand an Masse/GND
- LED: Anode an GPIO 14
- PIR-Sensor: OUT an GPIO 25
- PIR-Sensor: GND an Masse/GND
- PIR-Sensor: VCC an +5V (Pin VIN/5V o.ä. am ESP32)
Diagramm

Datenblätter und Links
Der Shop, bei dem ich das HC-SR501-Modul gekauft habe, hat außer den kurzen Infos auf der Produktseite kein Datenblatt o.ä. verlinkt, sodass ich auf eine Web-Suche angewiesen war.
- PIR Motion Sensor – ausführliches PDF von Adafruit; Beschreibung der Technik und Anwendungsbeispiele; Produktseite mit weiteren Links
- Produktbeschreibung bei components101.com
- Datenblatt bei AZ-Delivery
Es gibt auch verschiedene kleinere PIR-Bewegungssensoren mit ähnlicher Funktionalität. Ein paar davon sind im Beitrag »Miniatur-Bewegungssensoren HC-SR505 und AM312« beschrieben.
Themenverwandte Beiträge
Der LM35DZ ist ein einfacher und preisgünstiger Temperatursensor. Er misst Temperaturen zwischen 0 u...
Die Sensoren DS18B20, DHT22 und DHT11 sind drei Temperatur- (und Luftfeuchtigkeits-)Sensoren, die mi...
I2C ist ein serieller Datenbus, über den ein Mikrocontroller mit nur zwei Steuerleitungen mehrere ve...
Der MH-Z19B ist ein CO2-Sensor, mit dem man eine CO2-Ampel selbst realisieren kann. Durch die Corona...
Fußnoten
1↑ | So beschreibt es auch die Seite components101.com und bezeichnet den ersten Modus (Ausschalten nach Ablauf der Zeit und ggf. erneutes Anschalten nach einer kurzen Pause) als „Repeatable (H) mode”, den zweiten Modus (Ausschalten erst, wenn keine Bewegung mehr erkannt wird) als „Non-Repeatable (L) mode”. Im PDF von Adafruit wird die Funktionsweise des Jumpers etwas anders beschrieben (ab Seite 14 unten; im Versuchsaufbau wird eine LED an- und ausgeschaltet): „(…) make sure that the jumper is placed in the L position as shown below. Now set up the testing board again. You may notice that when connecting up the PIR sensor as above , the LED does not stay on when moving in front of it but actually turns on and off every second or so. That is called ‘non-retriggering’. Now change the jumper so that it is in the H position. If you set up the test, you will notice that now the LED does stay on the entire time that something is moving. That is called ‘retriggering’.” Möglicherweise ist die Formulierung „the LED (…) actually turns on and off every second or so” auch missverständlich – immerhin lassen sich relativ zügige An-/Aus-Wechsel erreichen, wenn man die Zeitverzögerung auf die kleinste Stufe stellt – auch dann dauern die jeweiligen Phasen aber mehrere Sekunden. |
---|