Wie der HC-SR501 sind auch der HC-SR505, der AM312 und der SR602 pyroelektrische Infrarotsensoren (abgekürzt „PIR”[1]Manchmal wird das »P« in »PIR« auch als »passiv« interpretiert – der Sensor empfängt lediglich Infrarotstrahlung bzw. Wärme, die von einem sich bewegenden … Continue reading) – zur Funktionsweise siehe die kurzen Hinweise im Beitrag zum HC-SR501 und ausführlich in Wikipedia. Die Sensoren sind aber deutlich kleiner als der HC-SR501 – der Durchmesser der Kunststoffkappen ist nur etwa halb so groß.
Dadurch und wegen kleinerer und weniger umfangreich bestückter Platinen sind die Sensoren auf einen kürzeren Entfernungsbereich von 3 bis max. 5 Metern ausgelegt und bieten etwas weniger Funktionsmöglichkeiten: Auslösedauer und Empfindlichkeit sind fest vorgegeben, und sie unterstützen nur wiederholtes Auslösen (repeatable trigger).
Dafür sind die Pins so angebracht, dass die Sensoren direkt auf einem Breadboard eingesteckt werden können – beim HC-SR501 muss man mit einer passenden Buchsenleiste die Pins „verlängern” oder den Sensor mit Dupont-Kabeln und ggf. einer Halterung anschließen. Alle Sensoren haben einen 3-Pin-Anschluss und liefern beim Erkennen einer Bewegung einen HIGH-Pegel am Ausgabepin.
Im März 2021 wurde dieser Beitrag um die Angaben zum Sensor SR602 ergänzt – sowohl bei den technischen Daten als auch zum Einsatz des Sensors am Ende des Beitrags.
Daten der Bewegungssensoren
Sensor: | HC-SR501 | HC-SR505 | AM312 | SR602 |
---|---|---|---|---|
Versorgungs- spannung: |
5-12 V (max. 20 V) | 4,5-12 V (max. 20 V) | 2,7-12 V (typisch 3 V) | 3,3-15 V |
Ausgabesignal HIGH/LOW: | 3,3 / 0 V | 3,3 / 0 V | 2 / 0 V | 3,3 / 0 V |
Auslösedauer: | regelbar von ca. 2 s – >7 min | ca. 8 s ±30% | 2,3 s | ca. 2,5 s |
Blockadezeit: | ca. 2,5 s[2]Es gibt auch HC-SR501-Module mit einer Blockadezeit (Sperrzeit) von 0,2 s. | ? | 2,3 s | 2 s |
Auslösen: | wiederholt oder einmalig | wiederholt | wiederholt | wiederholt |
Reichweite: | regelbar von ca. 4-7 m | ca. 3 m | ca. 3-5 m | ca. 3
,5 m (empfohlen; max. 5 m) |
Erfassungskegel: | ca. 110° | <100° | ca. 130° | <100° |
Durchmesser der Kappe: | ca. 23 mm | ca. 10 mm + 1 mm Rand |
ca. 13,5 mm | ca. 10 mm (im oberen Teil 9 mm) |
Alle Sensoren arbeiten in einem Temperaturbereich von -20 bis +60°C, der HC-SR501 und HC-SR505 bis +70°C.[3]Man findet auch +80°C als Obergrenze der Arbeitstemperatur – je nach Quelle.
Bei Direktbestellung in China liegen die Preise jeweils deutlich unter 1 €, wobei der HC-SR501 ein paar Cent günstiger als die kleinen Sensoren ist. Im deutschen Versandhandel beginnen die Einzelpreise bei etwa 2 € (jeweils plus Versandkosten).
Datenblätter
- HC-SR501: PDF bei Adafruit; siehe auch den Beitrag hier im Blog
- HC-SR505: PDF bei Rapid Electronics
- AM312: PDF bei roboter-bausatz.de
- SR602: forum.mhetlive.com/topic/46/mh-et-live-sr-602-pyroelectric-human-infrared-sensor-module
Das Bild oberhalb des Inhaltsverzeichnisses zeigt die Sensoren im Größenvergleich mit einem 1-Cent-Stück, eine Ansicht von oben auf die Kappen (mit den Fresnel-Linsen) gibt das Beitragsbild.
Auslösung
Wird eine Bewegung erkannt, löst der Sensor aus – das Ausgabesignal wird auf HIGH gesetzt. Dort bleibt es eine gewisse Zeit (oben in der Tabelle »Auslösedauer« genannt; auch Verzögerungszeit bzw. englisch delay time) und geht danach wieder auf LOW. Danach ist der Sensor eine kurze Zeit gesperrt (Sperr- oder Blockadezeit; Angaben locked / lock time / blockade time in den Datenblättern) – in dieser Zeit erkennt er keine Bewegungen.
- »Wiederholtes« Auslösen (repeatable trigger) bedeutet, dass beim Erkennen einer weiteren Bewegung während der Auslösedauer die Zeit neu zu laufen beginnt – wiederholte Bewegungen führen also zu einer Verlängerung der Auslösedauer, und der Sensor liefert entsprechend lange ein HIGH-Signal.
- »Einmaliges« Auslösen (single trigger) bedeutet, dass nach dem Erkennen einer Bewegung das Ausgabesignal genau für die Auslösedauer auf HIGH geht und danach auf LOW. Neue Bewegungen werden erst wieder registriert, nachdem die anschließende Blockade- oder Sperrzeit abgelaufen ist.
Sowohl AM312 als auch HC-SR505 und SR602 arbeiten mit wiederholtem Auslösen. Der Signalpin geht also erst dann wieder auf LOW, wenn ein paar Sekunden lang (2 bzw. 8 Sekunden) keine Bewegung erkannt wurde. Da die Auslösedauer nur sehr kurz ist, ist es bei diesen Sensoren sinnvoll, die Schaltlogik (z.B. An- und Ausschalten einer Lampe über ein Relais) einem Mikrocontroller zu überlassen. Mit dem großen Sensor HC-SR501 kann man wegen der einstellbaren Länge der Auslösedauer bis zu mehreren Minuten bei einfachen Schaltungen auf den Controller verzichten.
Anschlusspins des HC-SR505 und AM312
Die Sensoren haben drei Anschluss-Pins: Außen liegen die Versorgungspins (Masse und Spannung), in der Mitte der Ausgabepin.
Grundsätzlich sind die beiden Sensoren austauschbar. Beim Verkabeln muss man aber beachten, dass bei gleicher Ausrichtung der Steckerleiste die Anschlüsse von Masse (GND, –) und Spannung (Vin, +) vertauscht sind; der Signalpin (OUT) ist jeweils der mittlere.
- Beim HC-SR505 ist die Reihenfolge [– OUT +],
- beim AM312 [+ OUT –].
Außerdem reichen dem AM312 3,3 Volt, der HC-SR505 benötigt 5 Volt (Details oben in der Tabelle und in den Datenblättern).

Programm: Display bei Inaktivität dunkel schalten
Das Beispielprogramm zeigt auf einem Display (OLED mit Treiberchip SSD1306; Anschluss per I2C-Schnittstelle) jede Sekunde einen Text an – um das Beispiel kurz zu halten, einen Fülltext, normalerweise wären das z.B. Datum und Uhrzeit oder Messwerte eines Sensors.
Zu diesem Zweck wird in der Variablen t_now
die aktuelle Uhrzeit (bzw. die Anzahl Sekunden seit Programmstart) gespeichert, t_last
ist die Sekunde, in der das Display zuletzt aktualisiert wurde, und t_motion
ist die Sekunde, in der die letzte Bewegung registriert wurde.
Am Anfang des Hauptprogramms (loop()
-Schleife) wird abgefragt, ob eine neue Sekunde begonnen hat – hier kann man auch ein anderes Intervall programmieren. Dann lautet die Anweisung nicht
if (t_now != t_last) {
sondern z.B. bei einer Aktualisierung alle 5 Sekunden
if (t_now >= t_last + 5) {
Wurde eine Bewegung erkannt (der Sensor-Ausgabepin ist auf HIGH
-Pegel), wird der Zeitpunkt aktualisiert und das Display als „aktiv” gekennzeichnet (Variable b_display_off
ist dann false
).
Falls das Display aktiv ist, wird der gewünschte Text ausgegeben und der Zeitpunkt der letzten Ausgabe aktualisiert. Wurde keine Bewegung erkannt, wird außerdem geprüft, ob der Zeitpunkt der letzten erkannten Bewegung länger als die definierte Wartezeit her ist. Falls ja, wird das in der Variablen b_display_off
gespeichert und das Display gelöscht. (Ein richtiges Abschalten ist nicht möglich – es wird stattdessen ein leerer Displaypuffer angezeigt.)
/* Anzeige von Dummy-Text auf OLED-Display
* (Typ SSD1306 128*64 Pixel)
*
* PIR-Sensor SR505 prüft, ob Bewegung in der Nähe
* stattfindet; bei einer gewissen Zeit Ruhe wird das
* Display gelöscht (wie ein Bildschirmschoner)
*
* 2021-01-20 Heiko (unsinnsbasis.de)
*/
// Bibliothek für das Display
// bindet auch <Adafruit_GFX.h>, <SPI.h>, <Wire.h> ein
#include <Adafruit_SSD1306.h>
// Digitalpin für den Bewegungssensor
#define SR505_PIN 13 // entspricht D7
// Zeitspanne von Inaktivität bis zum "Abschalten" des Displays
// 900 Sekunden = 15 min
#define NO_ACTIVITY_SECS 900
// I2C-Adresse des Displays (0x3C oder 0x3D)
#define DISPLAY_I2C_ADDRESS 0x3C
// Auflösung des SSD1306-OLED-Displays
#define DISPLAY_WIDTH 128 // Breite in Pixeln
#define DISPLAY_HEIGHT 64 // Höhe in Pixeln
// Datenstruktur für das Display
// - Verbindung per I2C (Standard-Pins SCL, SDA)
// - Display hat keinen Reset-Pin
Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1);
// Bitrate für die Datenübertragung zum seriellen Monitor
// (ESP: z.B. 115200, Arduino: zwingend 9600)
#define BITRATE 115200 // Arduino: 9600
unsigned long t_motion; // Zeitpunkt der letzten erkannten Bewegung
// Anzeigen eines Leer-Textes
void display_text() {
display.clearDisplay();
display.setTextColor(WHITE); // helle Schrift, dunkler Grund
display.setTextSize(2); // doppelt hohe Schrift
display.setCursor(0, 0);
display.print("Lorem ipsum dolor sit amet, consectetur adipisici elit");
display.display();
}
//----------------------------------------
void setup() {
// Übertragungsrate zum seriellen Monitor setzen
Serial.begin(BITRATE);
delay(500); // kurz warten, bis ser. Monitor bereit
// Digitalpin für den Bewegungssensor
pinMode(SR505_PIN, INPUT);
// Display initialisieren
// im Fehlerfall Meldung ausgeben und Programm nicht
// fortsetzen (leere Dauerschleife))
if(!display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_I2C_ADDRESS)) {
Serial.println("SSD1306 nicht gefunden");
for(;;);
}
// Zeitpunkt der letzten Bewegung initialisieren
t_motion = millis() / 1000;
}
//----------------------------------------
void loop() {
unsigned long t_now; // Sekunden seit Programmstart
// Sekunde, in der die letzte Ausgabe war
static unsigned long t_last {0};
// Flag, ob Display "ruhen" soll
static bool b_display_off {false};
t_now = millis() / 1000;
if (t_now != t_last) {
// neue Sekunde, also Textanzeige aktualisieren,
// wenn das Display nicht im Ruhemodus ist
if (!b_display_off)
display_text();
t_last = t_now;
// bei Bedarf (Fehlersuche?) den Pegel des Sensors ausgeben
// Serial.println(digitalRead(SR505_PIN) ? "HIGH" : "LOW");
// außerdem prüfen, ob eine Bewegung erkannt wurde
if (digitalRead(SR505_PIN) == HIGH) {
t_motion = t_now; // ja, also Zeitpunkt merken
b_display_off = false;
} else {
// wenn seit längerem keine Bewegung erkannt -> Displaypuffer
// löschen und anzeigen
if ((t_motion + NO_ACTIVITY_SECS) < t_now) {
b_display_off = true;
display.clearDisplay();
display.display();
}
}
}
delay(100);
}
Diagramm: Aufbau der Schaltung
Die Schaltung habe ich mit einem ESP8266 NodeMCU aufgebaut. Für andere Controller muss man nur wissen, welche Pins standardmäßig für die I2C-Schnittstelle des Displays zum Einsatz kommen; außerdem wird ein beliebiger freier Digitalpin für den Sensor-Output benötigt, der auch im Programm definiert werden muss:
// Digitalpin für den Bewegungssensor
#define SR505_PIN 13 // entspricht D7
Im Diagramm werden folgende Pins genutzt:
- Ausgabe des Sensors HC-SR505 oder AM312 (mittlerer Pin) an GPIO 13 (D7; gelb)[4]Im Diagramm wird für die Bewegungssensoren das Symbol für den großen HC-SR501-Sensor genutzt; für die kleineren Sensoren habe ich bisher kein passendes Symbol gefunden.
- SCL des Displays an GPIO 5 (D1) des ESP8266 (Standard-Pin für I2C-SCL; blau)
- SDA des Displays an GPIO 4 (D2) des ESP8266 (Standard-Pin für I2C-SDA; weiß)
- zu beachten ist, dass der Sensor HC-SR505 (und der „große” HC-SR501) mit 5 Volt arbeiten (Pin
VIN
des ESP8266; beim ESP32 ist er manchmal auch mit »V5
« beschriftet), für den AM312 reichen 3,3 Volt - das OLED-Display arbeitet mit der jeweiligen Standard-Spannung des Mikrocontrollers, am ESP8266 und ESP32 also mit 3,3 Volt, am Arduino mit 5 Volt
SR602 – der kleinste der Kleinen
Der SR602 (auch unter den Namen HC-SR602 und MH-SR602 zu finden) ist ein besonders kleiner Sensor mit einem Durchmesser und einer Höhe der Linsenkappe von 10 mm. Zur Höhe über dem Breadboard kommen etwa 3,5 mm für die Plastik-Ummantelung der Anschlusspins und die Dicke der Platine, insgesamt ist der Sensor also nur knapp 14 mm hoch. Zum Vergleich: Der AM312 hat eine Höhe von ca. 22 mm, der HC-SR505 von ca. 36 mm über dem Breadboard oder einer Platine; jeweils zzgl. etwa 6 Millimeter Länge der Anschlusspins. Die Platine des SR602 hat einen Durchmesser von ca. 18 mm.
Die Auslösedauer beträgt standardmäßig 2,5 s und kann durch das Einlöten eines passenden SMD-Widerstands auf der Unterseite der Sensorplatine auf bis zu eine Stunde verlängert werden (im Bild der rechte mit »000« beschriftete Widerstand; zu den Widerstandswerten siehe die Angaben im Datenblatt). Mein Fall sind so feine Lötarbeiten nicht – ich würde das per Programmlogik auf dem Mikrocontroller lösen; grundsätzlich kann so ein Sensor aber natürlich auch ohne Mikrocontroller arbeiten, um z.B. für eine bestimmte Zeit ein Relais zu schalten.
Auch die Empfindlichkeit kann man per Widerstand (linke Bildseite, ebenfalls mit »000« beschriftet) beeinflussen – hierzu habe ich aber keine Details gefunden.[5]Generell ist es nicht ganz leicht, per Suchmaschine ein Datenblatt mit ausführlichen Informationen zu finden. Das oben verlinkte Datenblatt findet man in ähnlicher Form z.B. auf Händler-Seiten … Continue reading Im Datenblatt wird auch erwähnt, dass man durch Einlöten einer F3-Fotodiode an den mit »S+« und »S–« markierten Lötpunkten den Sensor auf Nachtbetrieb umstellen kann, d.h. tagsüber bzw. oberhalb einer bestimmten Umgebungshelligkeit löst er dann nicht mehr aus.
Die Sperrzeit und der Auslösemodus »wiederholt« (repeatable trigger) sind nicht konfigurierbar.
Der Ausgabepin (mit »OUT« oder »O« beschriftet) muss über einen Widerstand von 4,7-10 kΩ mit einem Digitalpin des Controllers verbunden werden – der Widerstand ist bei den anderen Bewegungssensoren nicht nötig. Im Datenblatt zum SR602 ist er aber explizit aufgeführt – also habe ich den Sensor nicht ohne getestet. Die Pin-Belegung unterscheidet sich beim SR602 von den anderen beiden Miniatur-Sensoren: in der Mitte liegt die Versorgungsspannung, außen Masse und das Ausgabesignal.
Fußnoten
1↑ | Manchmal wird das »P« in »PIR« auch als »passiv« interpretiert – der Sensor empfängt lediglich Infrarotstrahlung bzw. Wärme, die von einem sich bewegenden Objekt in der Nähe abgegeben wird, sendet aber selber keine Signale aus (wie es z.B. Fotoreflektoren machen, die Infrarotlicht mit einer IR-LED abstrahlen und mit einem Fotowiderstand die Menge reflektierten Lichts messen, um Bewegung oder Entfernungsänderungen zu erkennen). |
---|---|
2↑ | Es gibt auch HC-SR501-Module mit einer Blockadezeit (Sperrzeit) von 0,2 s. |
3↑ | Man findet auch +80°C als Obergrenze der Arbeitstemperatur – je nach Quelle. |
4↑ | Im Diagramm wird für die Bewegungssensoren das Symbol für den großen HC-SR501-Sensor genutzt; für die kleineren Sensoren habe ich bisher kein passendes Symbol gefunden. |
5↑ | Generell ist es nicht ganz leicht, per Suchmaschine ein Datenblatt mit ausführlichen Informationen zu finden. Das oben verlinkte Datenblatt findet man in ähnlicher Form z.B. auf Händler-Seiten hier und hier. |
Themenverwandte Beiträge
Mit den Funktionen der Bibliothek »Preferences« kann man im Flash-Speicher des ESP32 Daten zur Progr...
Typische 7-Segment-Anzeigen bestehen aus sieben LEDs (meist plus einer weiteren für den Dezimalpunkt...
Wer seine CDs auf dem Rechner oder Smartphone abspielen möchte, wird sie über kurz oder lang digital...
Der TEMT6000 ist ein Lichtsensor, der seine Messwerte analog ausgibt. Er besteht im wesentlichen aus...