Intelligenter Personenzähler mit Android-App-Steuerung per Bluetooth
Komponenten und Materialien
| Arduino UNO | × | 1 |
| HC-06 Bluetooth Modul | × | 1 |
| Breadboard (generic) | × | 2 |
| Fotowiderstand (LDR) | × | 3 |
| Lasermodul | × | 3 |
| Summer (Buzzer) | × | 1 |
| RGB LED Modul | × | 1 |
| LED (generic) | × | 3 |
| Widerstand 1k Ohm | × | 3 |
| Widerstand 221 Ohm | × | 3 |
| Batterie | × | 1 |
| Jumper Kabel (generic) | × | 1 |
Apps und Online-Dienste
- Arduino IDE
- MIT App Inventor
Über dieses Projekt
Beschreibung
Ein Personenzähler erkennt die Anzahl der Personen, die einen Eingang passieren. Ich wollte mein Zimmer während eines zweiwöchigen Urlaubs sichern und gleichzeitig einen Alarm für unbefugtes Betreten haben. Laserstrahlen mit LDRs eignen sich ideal zum präzisen Zählen aufgrund ihrer Geradlinigkeit. Da mein Zimmer drei Zugänge hat (zwei Türen, ein Fenster), setzte ich drei Laser-LDR-Paare ein.
Für die Fernsteuerung – welche Lasern aktiv sind, ob Alarm an/aus – ergänzte ich ein HC-06 Bluetooth-Modul und eine selbst erstellte Android-App. Die App zeigt zudem die Personenanzahl pro Eingang an.


App-Erstellung mit MIT App Inventor
Es gibt viele Wege, Android-Apps zu erstellen (HTML→Java, Python, etc.). Der MIT App Inventor ist per Drag-and-Drop am einfachsten, unterstützt aber (noch) kein iOS.
Die App "People Counter!" hat zwei Screens:
Screen 1 – Startbildschirm
Zuerst muss das im App Inventor gesetzte Passwort eingegeben werden (Standard: "counter").


Screen 2 – Hauptsteuerung
Hier wird der Arduino gesteuert und die Zählerstände angezeigt. Man wählt, welcher Laser aktiv ist, ob Alarm an/aus, sieht die Zählergebnisse und kann diese auf Null setzen.


Funktionsweise: Laser & LDR als Personenzähler
Ein Laser sendet Licht gebündelt in gerader Linie. Ein LDR (lichtabhängiger Widerstand) detektiert die Lichtintensität. Wird der Strahl unterbrochen, sinkt die Intensität. Zählt man jeden Abfall im optimalen Bereich, hat man einen Personenzähler. Meine Versuche ergaben einen optimalen Schwellenbereich zwischen 150 und 350 (analoge Werte).

Verkabelung
- Pin 2 – Laser Modul 1
- Pin 3 – Laser Modul 2
- Pin 4 – Laser Modul 3
- Pin 5 – Summer
- Pin 6 – HC-06 TX
- Pin 7 – HC-06 RX
- Pin 8 – Kontroll-LED 1
- Pin 12 – Kontroll-LED 2
- Pin 13 – Kontroll-LED 3
- Pin 9 – RGB Modul (R)
- Pin 10 – RGB Modul (G)
- Pin 11 – RGB Modul (B)
- A0 – LDR 1
- A1 – LDR 2
- A2 – LDR 3

Wichtig: Vor dem endgültigen Anschluss sicherstellen, dass die Laser genau auf die LDRs zielen.
Nach Tests teilte ich das Gerät in drei Einheiten für die drei Eingänge auf. Seitdem keine Sicherheitsbedenken mehr.
Code
PeopleCounter_with_Lasers.ino (Arduino)
/////////////////////////////////////////////
// Create a People Counter with Lasers
// on an Android Device
// by Kutluhan Aktar
/////////////////////////////////////////////
// Zweck: Personenzähler mit Lasern & LDRs, gesteuert per Android-App.
// LDR-Bein mit 1k Ohm an GND.
// Laser exakt auf LDRs ausrichten.
// Optimalen LDR-Schwellwert für Genauigkeit einstellen.
#include <SoftwareSerial.h>
int LaserPin_1 = 2;
int LaserPin_2 = 3;
int LaserPin_3 = 4;
int BuzzerPin = 5;
int Control_RX = 6;
int Control_TX = 7;
int RedPin = 9;
int GreenPin = 10;
int BluePin = 11;
int Control_Led_1 = 8;
int Control_Led_2 = 12;
int Control_Led_3 = 13;
int LDR_1 = A0;
int LDR_2 = A1;
int LDR_3 = A2;
int LDR_1_Read, LDR_2_Read, LDR_3_Read;
int Counter = 0;
volatile boolean Alarm_is_Activated = false;
volatile boolean Alarm_Initial = false;
volatile boolean Counter_Detect = false;
SoftwareSerial Control(Control_RX, Control_TX);
String Name = "Control";
int Password = 1111;
String Uart = "9600,0,0";
void setup() {
Serial.begin(9600);
Control.begin(9600);
// Change_BluetoothModule_Defaults(); // Optional: Bluetooth-Defaults ändern
pinMode(LaserPin_1, OUTPUT);
pinMode(LaserPin_2, OUTPUT);
pinMode(LaserPin_3, OUTPUT);
pinMode(RedPin, OUTPUT);
pinMode(GreenPin, OUTPUT);
pinMode(BluePin, OUTPUT);
pinMode(Control_Led_1, OUTPUT);
pinMode(Control_Led_2, OUTPUT);
pinMode(Control_Led_3, OUTPUT);
}
void loop() {
get_Data_From_LDR();
if (Control.available()) {
char c = Control.read();
Serial.println(c);
Commands(c);
}
Set_Alarm();
Set_Counter();
}
void Commands(char i) {
switch (i) {
case '1': Control.print(Counter); break;
case '2': Alarm_is_Activated = true; break;
case '3': Alarm_is_Activated = false; break;
case '4': digitalWrite(LaserPin_1, HIGH); digitalWrite(Control_Led_1, HIGH); break;
case '5': digitalWrite(LaserPin_1, LOW); digitalWrite(Control_Led_1, LOW); break;
case '6': digitalWrite(LaserPin_2, HIGH); digitalWrite(Control_Led_2, HIGH); break;
case '7': digitalWrite(LaserPin_2, LOW); digitalWrite(Control_Led_2, LOW); break;
case '8': digitalWrite(LaserPin_3, HIGH); digitalWrite(Control_Led_3, HIGH); break;
case '9': digitalWrite(LaserPin_3, LOW); digitalWrite(Control_Led_3, LOW); break;
case 'r': Counter = 0; break;
}
}
void get_Data_From_LDR() {
LDR_1_Read = analogRead(LDR_1);
LDR_2_Read = analogRead(LDR_2);
LDR_3_Read = analogRead(LDR_3);
}
void Set_Counter() {
if (LDR_1_Read < 150 || LDR_2_Read < 150 || LDR_3_Read < 150) {
Counter_Detect = true;
} else {
Counter_Detect = false;
}
if (Counter_Detect) {
Counter++;
delay(500); // Entprellung / Erkennungszeit
}
}
void Set_Alarm() {
if (Alarm_is_Activated) {
if (LDR_1_Read < 150 || LDR_2_Read < 150 || LDR_3_Read < 150) {
Alarm_Initial = true;
} else {
Alarm_Initial = false;
}
if (Alarm_Initial) {
tone(BuzzerPin, 500);
Color_Change(255, 0, 0); delay(50);
Color_Change(0, 255, 0); delay(50);
Color_Change(0, 0, 255); delay(50);
Color_Change(255, 255, 0); delay(50);
Color_Change(80, 0, 80); delay(50);
Color_Change(0, 255, 255); delay(50);
Color_Change(255, 255, 255); delay(50);
}
}
if (!Alarm_is_Activated || !Alarm_Initial) {
noTone(BuzzerPin);
Color_Change(0, 0, 0);
}
}
void Color_Change(int red, int green, int blue) {
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
analogWrite(RedPin, red);
analogWrite(GreenPin, green);
analogWrite(BluePin, blue);
}
void Change_BluetoothModule_Defaults() {
Control.print("AT+NAME"); Control.println(Name);
Serial.print("Name geändert: "); Serial.println(Name); delay(2000);
Control.print("AT+PSWD"); Control.println(Password);
Serial.print("Passwort geändert: "); Serial.println(Password); delay(2000);
Control.print("AT+UART"); Control.println(Uart);
Serial.print("Baudrate gesetzt: "); Serial.println(Uart); delay(2000);
Serial.println("Aufgabe abgeschlossen.");
}
Schaltplan & Dateien

App-Dateien: peoplecounter_J375iBnBF8.aia (MIT App Inventor Projekt), peoplecounter_uBf7MU4A1c.apk (Android App)
Herstellungsprozess
- Temperaturgesteuerter Lüfter: DIY Relais-System für Medienmöbel-Kühlung
- Gesten-gesteuerter Roboter mit Raspberry Pi
- WLAN-gesteuerter Roboter mit Raspberry Pi & Android Smartphone bauen
- 3D RGB Arduclock – Bluetooth-LED-Uhr mit Echtzeituhr
- NeoPixel LED-Strip per WLAN steuern: ESP8266-Projekt mit Android-App
- Android-gesteuertes Roboterfahrzeug mit Raspberry Pi Motor Shield
- LEDs mit Alexa über Raspberry Pi steuern – Einfache Schritt-für-Schritt-Anleitung
- River Health Monitor: Arduino-basiertes Wasserqualitäts-Messsystem
- Interaktives Joystick-Spiel mit Arduino & LED-Feedback
- Valentinstags-Geschenk: DIY Tage-zusammen-Zähler