Slimme personnencounter met Android-app: Lasers en LDR's
Onderdelen en benodigdheden
| Arduino UNO | 1 |
| HC-06 Bluetooth-module | 1 |
| Breadboard (standaard) | 2 |
| Fotoweerstand (LDR) | 3 |
| Lasermodule | 3 |
| Buzzer | 1 |
| RGB LED-module | 1 |
| LED (standaard) | 3 |
| Weerstand 1k ohm | 3 |
| Weerstand 221 ohm | 3 |
| Batterij | 1 |
| Draadjes (standaard) | 1 set |
Apps en online diensten
- Arduino IDE
- MIT App Inventor
Over dit project
Beschrijving
Een personnencounter is een apparaat dat het aantal personen dat een ingang passeert detecteert. Ik wilde een personnencounter bouwen om mijn kamer te beveiligen tijdens een tweewekelijkse vakantie. Ook wilde ik het als alarm gebruiken dat onbevoegde toegang waarschuwt. Een laser is de beste optie om nauwkeurig te tellen met een LDR vanwege de snelheid, dus ik koos voor lasers met LDR's. Mijn kamer heeft drie mogelijke ingangen (twee deuren en een raam), dus ik gebruikte drie lasers en drie LDR's.
Ik realiseerde me dat ik het apparaat op afstand moest kunnen bedienen om te kiezen welke laser actief is of of het alarm aanstaat. Daardoor voegde ik een HC-06 Bluetooth-module toe om te communiceren met een zelfgemaakte Android-app. De app toont het aantal personen dat de gekozen ingang binnenkomt.


Een app maken
Er zijn veel manieren om een Android-app te maken, zoals het converteren van HTML naar Java of programmeren in Python. MIT App Inventor is de makkelijkste manier dankzij de drag-and-drop-structuur, maar let op: het is nog niet compatibel met iOS.
De app heet "People Counter!" en heeft twee schermen: Screen1 en Screen2.
Screen1 (Startscherm)
Dit is het startscherm om door te gaan naar het hoofdscherm. Eerst moet het wachtwoord (ingesteld in MIT App Inventor) correct worden ingevoerd. Het standaardwachtwoord is "counter".


Screen2 (Hoofdscherm)
Dit is het hoofdscherm en menu om de Arduino te besturen. Hier worden de resultaten van de personnencounter weergegeven. Je kunt kiezen welke laser aanstaat, of het alarm actief is, en de teller op nul zetten.


Hoe een personnencounter maken met lasers en LDR's
Een laser (Light Amplification by Stimulated Emission of Radiation) zendt een lichtbundel in een zeer rechte lijn. Een LDR (Light Dependent Resistor) detecteert gemakkelijk een toename van lichtintensiteit wanneer de laser er direct op gericht is. Bij een obstakel tussen laser en LDR daalt de intensiteit. Door elke daling binnen het optimale bereik te tellen, ontstaat een personnencounter. Uit mijn experimenten blijkt het optimale bereik tussen 150 en 350 te liggen.

Aansluitingen
- Arduino Uno - Modules
- Pin 2 --------- Laser_Module_1
- Pin 3 --------- Laser_Module_2
- Pin 4 --------- Laser_Module_3
- Pin 5 --------- Buzzer
- Pin 6 --------- HC-06 Bluetooth Module (TX)
- Pin 7 --------- HC-06 Bluetooth Module (RX)
- Pin 8 --------- Control_Led_1
- Pin 12 --------- Control_Led_2
- Pin 13 --------- Control_Led_3
- Pin 9 --------- RGB_Module (R)
- Pin 10 --------- RGB_Module (G)
- Pin 11 --------- RGB_Module (B)
- A0 ----------- LDR_1
- A1 ----------- LDR_2
- A2 ----------- LDR_3

Zorg ervoor dat de lasers direct naar de LDR's wijzen voordat je alle verbindingen afrondt. Na testen heb ik het apparaat in drie delen verdeeld voor de drie ingangen. Sindsdien heb ik geen twijfels meer over de beveiliging van mijn kamer.
Code
// PeopleCounter_with_Lasers.ino
// Maak een personnencounter met lasers op een Android-apparaat
// door Kutluhan Aktar
#include
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);
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);
}
}
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);
delay(2000);
Control.print("AT+PSWD"); Control.println(Password);
delay(2000);
Control.print("AT+UART"); Control.println(Uart);
delay(2000);
Serial.println("Taak voltooid.");
}
Schematisch
Productieproces
- Temperatuur-gecontroleerde Ventilator: DIY Relais Systeem Voor Media Kast Koeling
- Gebaren-gecontroleerde Robot Aangedreven door Raspberry Pi
- Bouw een WiFi-gecontroleerde Robot met Raspberry Pi & Android Smartphone
- 3D RGB Arduclock – Bluetooth LED Tijdstuk met Real-Time Clock
- NeoPixel LED-strip via Wi-Fi besturen: ESP8266-project met Android-app
- Bouw een Android-bestuurd extern voertuig met Raspberry Pi Motor Shield
- LED's bedienen met Alexa via Raspberry Pi – Eenvoudige stapsgewijze handleiding
- Riviergezondheidsmonitor: Arduino-gebaseerd Waterkwaliteitssysteem
- Interactieve Joystick Game met Arduino en LED Feedback
- Ontwerp een PM2.5 & PM10 Luchtkwaliteit Detector App voor Windows 10 UWP
- Valentijnscadeau: DIY Dagen-samen-teller