Arduino-Sicherheitssystem: Intelligente Bewegungserkennung & Alarm
Komponenten und Zubehör
| Arduino UNO | × | 1 |
| Ultraschallsensor HC-SR04 (generisch) | × | 1 |
| Servo (Tower Pro MG996R) | × | 1 |
| Summer (Piezo-Buzzer) | × | 1 |
| Steckbrett (Breadboard) | × | 1 |
| Male/Female Jumper-Kabel | × | 1 |
| Kunststoffgehäuse | × | 1 |
Benötigte Werkzeuge
- Messer
Apps und Online-Dienste
- Arduino IDE
- Processing IDE
Über dieses Projekt
Einführung
Dieses Projekt ist ein Arduino-basiertes Sicherheitssystem bestehend aus einem Arduino Uno, einem Servomotor, einem Ultraschallsensor und einem piezoelektrischen Summer.
Der Ultraschallsensor erfasst Objekte in seinem Erfassungsbereich und aktiviert den Summer. Die Sensordaten werden zusätzlich an die Processing IDE gesendet, die eine grafische Radar-Anzeige erstellt.
Der Servomotor dreht den Ultraschallsensor, um einen großen Bereich abzudecken (180° Schwenkbereich).
Dies ist ein relativ einfaches Projekt, das in etwa einer Stunde umsetzbar ist.
Verkabelung
- Trigger-Pin des Sensors → Arduino Pin 2
- Echo-Pin des Sensors → Arduino Pin 3
- VCC und GND des Sensors → 5V und GND
- Summer auf Steckbrett platzieren: Pluspol → Pin 10, Minuspol → GND
- Servo: Schwarz/braun → GND, Rot → 5V, Gelb/orange (Signal) → Pin 9
- Arduino 5V → VCC, GND → GND
Nach Abschluss der Verkabelung wird die gesamte Schaltung im Gehäuse untergebracht (siehe Abbildung). Dann folgt die Programmierung.
Code
Arduino Code (C/C++)
#include <Servo.h>
int tPin = 2;
int ePin = 3;
int buz = 10;
int d1, d2;
int i = 0;
int sdistance;
Servo myServo;
void setup() {
Serial.begin(9600);
pinMode(tPin, OUTPUT);
pinMode(ePin, INPUT);
pinMode(buz, OUTPUT);
myServo.attach(9);
}
void loop() {
// Vorwärts-Sweep 0° bis 180°
for (i = 0; i <= 180; i += 10) {
myServo.write(i);
delay(30);
d2 = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(d2);
Serial.print(".");
}
// Rückwärts-Sweep 180° bis 0°
for (i = 180; i > 0; i -= 10) {
myServo.write(i);
delay(30);
d2 = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(d2);
Serial.print(".");
}
}
int calculateDistance() {
digitalWrite(tPin, HIGH);
delayMicroseconds(10); // Korrigiert: 10 µs statt 1000 ms
digitalWrite(tPin, LOW);
d1 = pulseIn(ePin, HIGH);
d2 = d1 * 0.0171821306; // Umrechnung in cm
if (d2 < 10) {
digitalWrite(buz, HIGH);
} else {
digitalWrite(buz, LOW);
}
return d2;
}
Processing Code (Java) – Radar-Visualisierung
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String angle = "", distance = "", data = "", noObject;
float pixsDistance;
int iAngle, iDistance;
int index1 = 0, index2 = 0;
PFont orcFont;
void setup() {
size(1366, 768); // *** AN IHRE BILDSCHIRMAUFLÖSUNG ANPASSEN ***
smooth();
myPort = new Serial(this, "COM3", 9600); // COM-Port anpassen!
myPort.bufferUntil('.');
}
void draw() {
fill(98, 245, 31);
noStroke();
fill(0, 4);
rect(0, 0, width, height - height * 0.065);
fill(98, 245, 31);
drawRadar();
drawLine();
drawObject();
drawText();
}
void serialEvent(Serial myPort) {
data = myPort.readStringUntil('.');
data = data.substring(0, data.length() - 1);
index1 = data.indexOf(",");
angle = data.substring(0, index1);
distance = data.substring(index1 + 1, data.length());
iAngle = int(angle);
iDistance = int(distance);
}
void drawRadar() {
pushMatrix();
translate(width / 2, height - height * 0.074);
noFill();
strokeWeight(2);
stroke(98, 245, 31);
// Bogen-Linien
arc(0, 0, width - width * 0.0625, width - width * 0.0625, PI, TWO_PI);
arc(0, 0, width - width * 0.27, width - width * 0.27, PI, TWO_PI);
arc(0, 0, width - width * 0.479, width - width * 0.479, PI, TWO_PI);
arc(0, 0, width - width * 0.687, width - width * 0.687, PI, TWO_PI);
// Winkel-Linien
line(-width / 2, 0, width / 2, 0);
line(0, 0, (-width / 2) * cos(radians(30)), (-width / 2) * sin(radians(30)));
line(0, 0, (-width / 2) * cos(radians(60)), (-width / 2) * sin(radians(60)));
line(0, 0, (-width / 2) * cos(radians(90)), (-width / 2) * sin(radians(90)));
line(0, 0, (-width / 2) * cos(radians(120)), (-width / 2) * sin(radians(120)));
line(0, 0, (-width / 2) * cos(radians(150)), (-width / 2) * sin(radians(150)));
line((-width / 2) * cos(radians(30)), 0, width / 2, 0);
popMatrix();
}
void drawObject() {
pushMatrix();
translate(width / 2, height - height * 0.074);
strokeWeight(9);
stroke(255, 10, 10);
pixsDistance = iDistance * ((height - height * 0.1666) * 0.025);
if (iDistance < 40) { // Reichweite auf 40 cm begrenzt
line(pixsDistance * cos(radians(iAngle)), -pixsDistance * sin(radians(iAngle)),
(width - width * 0.505) * cos(radians(iAngle)), -(width - width * 0.505) * sin(radians(iAngle)));
}
popMatrix();
}
void drawLine() {
pushMatrix();
strokeWeight(9);
stroke(30, 250, 60);
translate(width / 2, height - height * 0.074);
line(0, 0, (height - height * 0.12) * cos(radians(iAngle)), -(height - height * 0.12) * sin(radians(iAngle)));
popMatrix();
}
void drawText() {
pushMatrix();
if (iDistance > 40) noObject = "Out of Range";
else noObject = "In Range";
fill(0, 0, 0);
noStroke();
rect(0, height - height * 0.0648, width, height);
fill(98, 245, 31);
textSize(25);
text("2cm", width - width * 0.3854, height - height * 0.0833);
text("4cm", width - width * 0.281, height - height * 0.0833);
text("6cm", width - width * 0.177, height - height * 0.0833);
text("10cm", width - width * 0.0729, height - height * 0.0833);
textSize(40);
text("Akshay6766", width - width * 0.875, height - height * 0.0277);
text("Angle: " + iAngle + " ", width - width * 0.48, height - height * 0.0277);
text("Distance: ", width - width * 0.26, height - height * 0.0277);
if (iDistance < 40) text(" " + iDistance + " cm", width - width * 0.225, height - height * 0.0277);
textSize(25);
fill(98, 245, 60);
// Winkel-Beschriftungen
translate((width - width * 0.4994) + width / 2 * cos(radians(30)), (height - height * 0.0907) - width / 2 * sin(radians(30)));
rotate(-radians(-60)); text("30", 0, 0); resetMatrix();
translate((width - width * 0.503) + width / 2 * cos(radians(60)), (height - height * 0.0888) - width / 2 * sin(radians(60)));
rotate(-radians(-30)); text("60", 0, 0); resetMatrix();
translate((width - width * 0.507) + width / 2 * cos(radians(90)), (height - height * 0.0833) - width / 2 * sin(radians(90)));
rotate(radians(0)); text("90", 0, 0); resetMatrix();
translate(width - width * 0.513 + width / 2 * cos(radians(120)), (height - height * 0.07129) - width / 2 * sin(radians(120)));
rotate(radians(-30)); text("120", 0, 0); resetMatrix();
translate((width - width * 0.5104) + width / 2 * cos(radians(150)), (height - height * 0.0574) - width / 2 * sin(radians(150)));
rotate(radians(-60)); text("150", 0, 0);
popMatrix();
}
Schaltplan
Herstellungsprozess
- TinyML Spracherkennung mit Edge Impulse auf Arduino Nano 33 BLE Sense
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- Arduino Iron Man bauen: Komponenten, Sensoren & Schritt-für-Schritt-Anleitung
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- DIY Arduino Luftbefeuchter-Steuerung mit Relais – Sichere Hochspannungs-Installation
- Echtzeit-Entfernungsmessung mit Arduino Sonar & Processing-Visualisierung
- MobBob: Eigenen Arduino-Roboter bauen, per Android-Smartphone steuern
- Audio-reaktive Schreibtischlampe mit Arduino Nano bauen
- NeoPixel-Matrix Pong auf Arduino Nano: Neon-Pong selbst bauen