Überwachungskamera: Unterschied zwischen den Versionen
(45 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 21: | Zeile 21: | ||
An dem Projekt arbeiten die Mechatronik-Studenten [[Benutzer:Kevin Mudczinski| Kevin Mudzcinski]] und [[Benutzer:Henry_Froese| Henry Fröse]]. | An dem Projekt arbeiten die Mechatronik-Studenten [[Benutzer:Kevin Mudczinski| Kevin Mudzcinski]] und [[Benutzer:Henry_Froese| Henry Fröse]]. | ||
<gallery widths="600" heights="340"> | |||
Datei:CAM Scene 1.jpg|600px|Abb. 1: Illustration Überwachungskamera | |||
</gallery> | |||
== Anforderungen == | == Anforderungen == | ||
Zeile 177: | Zeile 179: | ||
# Mittelring (Dient zur Fixierung der Bauteile ohne diese Anzukleben / Festzuschrauben), | # Mittelring (Dient zur Fixierung der Bauteile ohne diese Anzukleben / Festzuschrauben), | ||
# Rückseite (Bietet erhöhtes Volumen für die Verkabelung und Stromzufuhr) | # Rückseite (Bietet erhöhtes Volumen für die Verkabelung und Stromzufuhr) | ||
< | |||
<gallery widths="400" heights="400" > | |||
Datei:CAD_Camera_Front.png|400px|Abb. 4: CAD-Modell - Gehäuse Vorderseite | |||
Datei:CAD_Camera_Back.png|400px|Abb. 5: CAD-Modell - Gehäuse Rückseite | |||
</gallery> | |||
<br/> | |||
'''Halterung''' <br/> | '''Halterung''' <br/> | ||
Die Halterung kann in 2 Dimensionen Hoch/Runter und Links/Rechts bewegt werden. Hierbei dienen Schrauben zur Fixierung der Position, indem sie mittels "Quetschscheiben" die Bewegung verhindern. | Die Halterung kann in 2 Dimensionen Hoch/Runter und Links/Rechts bewegt werden. Hierbei dienen Schrauben zur Fixierung der Position, indem sie mittels "Quetschscheiben" die Bewegung verhindern. | ||
An der Rückseite bietet die Halterung eine Platte zur Befestigung mittels Schrauben für einen Gewindedurchmesser von 4mm in allen 4 Ecken. Die U-Förmige verbindung zwischen Kameragehäuse & Halterung sowie Wandmontageplatte und Halterung wurden seperat gedruckt, da die orientierung im 3D Drucker elementar wichtig für die Stabilität und Flexibilität dieses Bauteils ist. Ohne Die seperierung würde das Bauteil beim Zusammenbau brechen. | An der Rückseite bietet die Halterung eine Platte zur Befestigung mittels Schrauben für einen Gewindedurchmesser von 4mm in allen 4 Ecken. Die U-Förmige verbindung zwischen Kameragehäuse & Halterung sowie Wandmontageplatte und Halterung wurden seperat gedruckt, da die orientierung im 3D Drucker elementar wichtig für die Stabilität und Flexibilität dieses Bauteils ist. Ohne Die seperierung würde das Bauteil beim Zusammenbau brechen. | ||
< | |||
<gallery widths="400" heights="400" > | |||
Datei:CAD_Halter_Front.png|400px|Abb. 6: CAD-Modell - Halterung | |||
Datei:CAD_Camera_Komplett_Front.png|400px|Abb. 7: CAD-Modell - Kamera Vorderseite | |||
Datei:CAD_Camera_Komplett_Back.png|400px|Abb. 8: CAD-Modell - Kamera Rückseite | |||
</gallery> | |||
<br/> | |||
'''Schaltung''' <br/> | '''Schaltung''' <br/> | ||
Zum Einsatz kommt der Mikrokontroller ESP32-CAM, da dieser ab Werk einen Anschluss für eine Kamera sowie Bibliotheken zum auslesen dieser verfügt. | Zum Einsatz kommt der Mikrokontroller ESP32-CAM, da dieser ab Werk einen Anschluss für eine Kamera sowie Bibliotheken zum auslesen dieser verfügt. | ||
Zeile 187: | Zeile 202: | ||
Der Mikrokontroller besitzt keine Analogen-Pins für das Mikrofon. | Der Mikrokontroller besitzt keine Analogen-Pins für das Mikrofon. | ||
Aus diesem Grund sind das Mikrofon und der PIR an den digitalen Pins des Mikrokontrollers angeschlossen. Mittels Widerstand wird ein Schwellwert auf dem Mikrofon und PIR-Sensor eingestellt. | Aus diesem Grund sind das Mikrofon und der PIR an den digitalen Pins des Mikrokontrollers angeschlossen. Mittels Widerstand wird ein Schwellwert auf dem Mikrofon und PIR-Sensor eingestellt. | ||
Der Wifi-Chip ist ebenfalls auf dem | Der Wifi-Chip ist ebenfalls auf dem Mikrokontroller vorhanden, sodass kein extra Modul benötigt wird. | ||
< | |||
<gallery widths="400" heights="400" > | |||
Datei:Schaltung_Ueberwachungskamera.png|400px|Abb. 9: Schaltung | |||
Datei:Verkabelung_Ueberwachungskamera.png|400px|Abb. 10: Verkabelung | |||
</gallery> | |||
<br/> | |||
'''Code''' <br/> | '''Code''' <br/> | ||
Die Implementierung von Telegramm und das Verschicken von Bildern ist in Anlehnung an "[https://randomnerdtutorials.com/telegram-esp32-cam-photo-arduino/ Random Nerd Tutorial]" implementiert worden. | Die Implementierung von Telegramm und das Verschicken von Bildern ist in Anlehnung an "[https://randomnerdtutorials.com/telegram-esp32-cam-photo-arduino/ Random Nerd Tutorial]" implementiert worden. | ||
In "BOT_TOKEN" muss der Unique-Token des Erstellten Bots eingefügt werden. In "USER_CHAT_IDS" können eine beliebige Anzahl von Telegramm Accounts eingebunden werden, die ein Bild erhalten wollen. | In "BOT_TOKEN" muss der Unique-Token des Erstellten Bots eingefügt werden. In "USER_CHAT_IDS" können eine beliebige Anzahl von Telegramm Accounts eingebunden werden, die ein Bild erhalten wollen. | ||
Mit dem Befehl "/picture" kann ein manuell erstelltes Bild angefordert werden. | Mit dem Befehl "/picture" kann ein manuell erstelltes Bild angefordert werden. | ||
Mithilfe von den Variablen "motionState" und "micState" | Mithilfe von den Variablen "motionState" und "micState" kann verhindert werden, dass aufgrund des selben Eingangssignals 2 identische Bilder direkt hintereinander versendet werden. | ||
< | |||
<gallery widths="400" heights="400" > | |||
Datei:PAP_Ueberwachungskamera.png|400px|Abb. 11: Programmablaufsplan | |||
</gallery> | |||
<div style="width:1100px; height:800px; overflow:scroll; border: hidden"> | <div style="width:1100px; height:800px; overflow:scroll; border: hidden"> | ||
<syntaxhighlight lang="cpp" style="border: none; background-color: #EFF1C1; font-size:larger"> | <syntaxhighlight lang="cpp" style="border: none; background-color: #EFF1C1; font-size:larger"> | ||
//WIFI | // Dieses Projekt wurde in Anlehnung an | ||
// "https://randomnerdtutorials.com/telegram-esp32-cam-photo-arduino/" | |||
// implementiert. | |||
// WIFI | |||
#include <WiFi.h> | #include <WiFi.h> | ||
#include <WiFiClientSecure.h> | #include <WiFiClientSecure.h> | ||
//TELEGRAM | // TELEGRAM | ||
#include <UniversalTelegramBot.h> | #include <UniversalTelegramBot.h> | ||
#include <ArduinoJson.h> | #include <ArduinoJson.h> | ||
//CAMERA | // CAMERA | ||
#include "esp_camera.h" | #include "esp_camera.h" | ||
#include "camera_pins.h" | #include "camera_pins.h" | ||
//SENSOR | // SENSOR | ||
#define MOTION_PIN 2 | #define MOTION_PIN 2 | ||
#define MIC_PIN 13 | #define MIC_PIN 13 | ||
//TELEGRAM | // WIFI | ||
String BOT_TOKEN = " | char* SSID_WIFI = "WLAN_NAME"; | ||
char* PASSWORD_WIFI = "WLAN_PASSWORT"; | |||
// TELEGRAM | |||
String BOT_TOKEN = "5690480986:AAEtpi5MD_GvyM1vOKoehP6ygjSJTMAtyBU"; | |||
int USER_CHAT_ID_LENGTH = 1; | int USER_CHAT_ID_LENGTH = 1; | ||
String USER_CHAT_IDS[] = {" | String USER_CHAT_IDS[] = {"BENUTZER_ID_1", "BENUTZER_ID_2"}; | ||
WiFiClientSecure client; | WiFiClientSecure client; | ||
UniversalTelegramBot bot(BOT_TOKEN, client); | UniversalTelegramBot bot(BOT_TOKEN, client); | ||
// SENSOR Variablen | |||
bool motionState = false; | |||
bool micState = false; | |||
//REQUEST TIME | // REQUEST TIME | ||
int requestDelay = 1000; | int requestDelay = 1000; | ||
unsigned long lastTime; | unsigned long lastTime; | ||
// Verschicke eingehende Nachricht über Serial zum Debuggen | |||
void printNewMessage(int index) { | void printNewMessage(int index) { | ||
Serial.println("------------------------"); | Serial.println("------------------------"); | ||
Zeile 245: | Zeile 277: | ||
} | } | ||
// Eingehende Nachricht verarbeiten | |||
void processMessage(int messageNum) { | void processMessage(int messageNum) { | ||
// Iteration über alle Nachrichten | |||
for (int i=0; i < messageNum; i++) { | for (int i=0; i < messageNum; i++) { | ||
printNewMessage(i); | printNewMessage(i); | ||
String chat_id = String(bot.messages[i].chat_id); | String chat_id = String(bot.messages[i].chat_id); | ||
// Testen, ob ID des Users in USER_CHAT_IDS enthalten ist | |||
if (chatIdIsInChatIdList(chat_id) == true) { | if (chatIdIsInChatIdList(chat_id) == true) { | ||
// ID des Users ist enthalten => Nachricht kann Analysiert werden | |||
String text = bot.messages[i].text; | String text = bot.messages[i].text; | ||
String user = bot.messages[i].from_name; | String user = bot.messages[i].from_name; | ||
// Wenn Befehl = "/start" => Sende Befehlsübersicht zu | |||
if (text == "/start") { | if (text == "/start") { | ||
String response = ""; | String response = ""; | ||
Zeile 262: | Zeile 301: | ||
bot.sendMessage(chat_id, response, ""); | bot.sendMessage(chat_id, response, ""); | ||
} | } | ||
// Wenn Befehl = "/picture" => Aktuelles Kamera Bild übermitteln | |||
else if (text == "/picture") { | else if (text == "/picture") { | ||
String response = ""; | String response = ""; | ||
Zeile 268: | Zeile 309: | ||
sendPicture(chat_id, false); | sendPicture(chat_id, false); | ||
} | } | ||
// Wenn Befehl nicht vorhanden => Sende "Unbekannter Befehl" | |||
else { | else { | ||
String response = ""; | String response = ""; | ||
Zeile 274: | Zeile 317: | ||
bot.sendMessage(chat_id, response, ""); | bot.sendMessage(chat_id, response, ""); | ||
} | } | ||
// Wenn ID des Users in USER_CHAT_IDS nicht enthalten ist => Übermittel keine Daten | |||
} else { | } else { | ||
bot.sendMessage(chat_id, "Unauthorized User", ""); | bot.sendMessage(chat_id, "Unauthorized User", ""); | ||
Zeile 281: | Zeile 326: | ||
} | } | ||
// Testen, ob User ID in USER_CHAT_IDS enthalten ist | |||
bool chatIdIsInChatIdList(String chat_id) { | bool chatIdIsInChatIdList(String chat_id) { | ||
for (int i = 0; i < USER_CHAT_ID_LENGTH; i++) { | for (int i = 0; i < USER_CHAT_ID_LENGTH; i++) { | ||
Zeile 290: | Zeile 336: | ||
} | } | ||
// Photo erstellen, verschicken an chat_id | |||
String sendPicture(String chat_id, bool flash) { | String sendPicture(String chat_id, bool flash) { | ||
const char* myDomain = "api.telegram.org"; | const char* myDomain = "api.telegram.org"; | ||
String getAll = ""; | String getAll = ""; | ||
String getBody = ""; | String getBody = ""; | ||
// Photo erstellen | |||
camera_fb_t* fb = NULL; | camera_fb_t* fb = NULL; | ||
fb = esp_camera_fb_get(); | fb = esp_camera_fb_get(); | ||
// Abbruch, wenn Photo nicht erstellt werden konnte | |||
if (!fb) { | if (!fb) { | ||
Serial.println("Camera capture failed"); | Serial.println("Camera capture failed"); | ||
Zeile 305: | Zeile 355: | ||
Serial.println("Connect to " + String(myDomain)); | Serial.println("Connect to " + String(myDomain)); | ||
// Verbindung mit Telegram erfolgreich | |||
if (client.connect(myDomain, 443)) { | if (client.connect(myDomain, 443)) { | ||
Serial.println("Connection successful"); | Serial.println("Connection successful"); | ||
// HTTP Request erstellen | |||
//X ==> Boundary | //X ==> Boundary | ||
String head = "--X\r\nContent-Disposition: form-data; name=\"chat_id\"; \r\n\r\n" + chat_id + "\r\n--X\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"; | String head = "--X\r\nContent-Disposition: form-data; name=\"chat_id\"; \r\n\r\n" + chat_id + "\r\n--X\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"; | ||
String tail = "\r\n--X--\r\n"; | String tail = "\r\n--X--\r\n"; | ||
// Variablen für HTTP Request | |||
uint16_t imageLen = fb->len; | uint16_t imageLen = fb->len; | ||
uint16_t extraLen = head.length() + tail.length(); | uint16_t extraLen = head.length() + tail.length(); | ||
Zeile 339: | Zeile 393: | ||
esp_camera_fb_return(fb); | esp_camera_fb_return(fb); | ||
int waitTime = 10000; // | int waitTime = 10000; // Warte 10 Sekunden | ||
long startTimer = millis(); | long startTimer = millis(); | ||
boolean state = false; | boolean state = false; | ||
Zeile 371: | Zeile 425: | ||
return getBody; | return getBody; | ||
} | } | ||
void setup() { | void setup() { | ||
// Initialisiere Sensoren, Telegram und Wifi | |||
startSerial(); | startSerial(); | ||
connectToWifi(); | connectToWifi(); | ||
Zeile 379: | Zeile 435: | ||
} | } | ||
// Starte Serielle Schnittstelle | |||
void startSerial() { | void startSerial() { | ||
Serial.begin(115200); | Serial.begin(115200); | ||
Zeile 395: | Zeile 445: | ||
} | } | ||
// Verbinde mit WLAN | |||
void connectToWifi() { | void connectToWifi() { | ||
Serial.println("Connect to WIFI"); | Serial.println("Connect to WIFI"); | ||
Zeile 407: | Zeile 458: | ||
} | } | ||
// Konfiguriere PINs der Kamera | |||
void setupCamera() { | void setupCamera() { | ||
Serial.println("Setup CAMERA"); | Serial.println("Setup CAMERA"); | ||
Zeile 442: | Zeile 494: | ||
void loop() { | void loop() { | ||
// Überprüfe Sensor Werte | |||
checkSensors(); | checkSensors(); | ||
// Überprüfe Nachrichten der Benutzer | |||
checkMessagingServer(); | checkMessagingServer(); | ||
} | } | ||
Zeile 448: | Zeile 503: | ||
void checkSensors() { | void checkSensors() { | ||
// | // Wenn Bewegungserkennung wieder unter Schwellwert | ||
if (motionState == true && digitalRead(MOTION_PIN) == 0) { | if (motionState == true && digitalRead(MOTION_PIN) == 0) { | ||
motionState = false; | motionState = false; | ||
} | } | ||
// Wenn PIR Sensor über Schwellwert und | |||
// derzeit keine Übermittlung läuft | |||
if (motionState == false && digitalRead(MOTION_PIN) == 1) { | if (motionState == false && digitalRead(MOTION_PIN) == 1) { | ||
for (int i = 0 ;i < USER_CHAT_ID_LENGTH; i++) { | for (int i = 0 ;i < USER_CHAT_ID_LENGTH; i++) { | ||
//Verschicke Photo und Text "MOTION detected" an alle hinterlegten IDs | |||
bot.sendMessage(USER_CHAT_IDS[i], "MOTION detected" , ""); | bot.sendMessage(USER_CHAT_IDS[i], "MOTION detected" , ""); | ||
sendPicture(USER_CHAT_IDS[i], false); | sendPicture(USER_CHAT_IDS[i], false); | ||
Zeile 461: | Zeile 520: | ||
} | } | ||
// | // Wenn Mikrofon Pegel wieder unter Schwellwert | ||
if (micState == true && digitalRead(MIC_PIN) == 0) { | if (micState == true && digitalRead(MIC_PIN) == 0) { | ||
micState = false; | micState = false; | ||
} | } | ||
// Wenn Mikrofon Pegel über Schwellwert und | |||
// derzeit keine Übermittlung läuft | |||
if (micState == false && digitalRead(MIC_PIN) == 1) { | if (micState == false && digitalRead(MIC_PIN) == 1) { | ||
//Verschicke Photo und Text "SOUND detected" an alle hinterlegten IDs | |||
for (int i = 0 ;i < USER_CHAT_ID_LENGTH; i++) { | for (int i = 0 ;i < USER_CHAT_ID_LENGTH; i++) { | ||
bot.sendMessage(USER_CHAT_IDS[i], "SOUND detected" , ""); | bot.sendMessage(USER_CHAT_IDS[i], "SOUND detected" , ""); | ||
Zeile 475: | Zeile 538: | ||
} | } | ||
// Überprüft per Polling, | |||
// ob noch nicht Abgerufte Nachrichten auf dem Server enthalten sind | |||
void checkMessagingServer() { | void checkMessagingServer() { | ||
// Jede Sekunde Nachrichten abrufen | |||
if (millis() > lastTime + requestDelay) { | if (millis() > lastTime + requestDelay) { | ||
int numOfMessages = bot.getUpdates(bot.last_message_received + 1); | int numOfMessages = bot.getUpdates(bot.last_message_received + 1); | ||
if (numOfMessages != 0) { | if (numOfMessages != 0) { | ||
bool newMessage = true; | bool newMessage = true; | ||
// Solange noch neue Nachrichten vorhanden | |||
while(newMessage) { | while(newMessage) { | ||
// Bearbeite Nachricht | |||
processMessage(numOfMessages); | processMessage(numOfMessages); | ||
// | // Sind in der Zwischenzeit noch neue Nachrichten eingetroffen | ||
numOfMessages = bot.getUpdates(bot.last_message_received + 1); | numOfMessages = bot.getUpdates(bot.last_message_received + 1); | ||
if (numOfMessages == 0) { | if (numOfMessages == 0) { | ||
Zeile 495: | Zeile 566: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> | ||
<br/> | <br/> | ||
'''Zusammenbau''' <br/> | '''Zusammenbau''' <br/> | ||
Beim Zusammenbau wurde darauf geachtet, dass die Kabel nicht direkt an die Kontakte gelötet werden, um später noch Änderungen am Programmcode vornehmen zu können. | Beim Zusammenbau wurde darauf geachtet, dass die Kabel nicht direkt an die Kontakte gelötet werden, um später noch Änderungen am Programmcode vornehmen zu können. | ||
Zeile 570: | Zeile 640: | ||
== Ergebnis == | == Ergebnis == | ||
Die Überwachungskamera ist vielseitig einsetzbar. Unter anderem auch als Baby-Cam. <br/><br/> | |||
Hier ein Video: | |||
{{#ev:youtube|https://www.youtube.com/watch?v=PvxNElTAMEY| 600 | |}} | |||
== Zusammenfassung == | == Zusammenfassung == | ||
Zeile 582: | Zeile 654: | ||
== Projektunterlagen == | == Projektunterlagen == | ||
=== Projektplan === | === Projektplan === | ||
== | <gallery widths="1500" heights="640"> | ||
Datei:Projektplan Ueberwachungskamera.png|1400px|Abb.12: Projektplan als Gantt-Diagramm | |||
</gallery> | |||
=== Projektdurchführung === | |||
{| class="wikitable" | {| class="wikitable" | ||
|+ style = "text-align: left"|Tabelle | |+ style = "text-align: left"|Tabelle 4: Bearbeitung der Meilensteine | ||
! style="font-weight: bold;" | ID | ! style="font-weight: bold;" | ID | ||
! style="font-weight: bold;" | Meilensteine | ! style="font-weight: bold;" | Meilensteine | ||
Zeile 599: | Zeile 675: | ||
| 2 | | 2 | ||
| Mikrofon wird vom Mikrocontroller eingelesen und detektiert Lautstärke korrekt | | Mikrofon wird vom Mikrocontroller eingelesen und detektiert Lautstärke korrekt | ||
| | | 28.10.2022 | ||
| Henry Fröse | | Henry Fröse | ||
|- | |- | ||
| 3 | | 3 | ||
| Inbetriebnahme der Kamera mittels enthaltenem Beispielprogramm | | Inbetriebnahme der Kamera mittels enthaltenem Beispielprogramm | ||
| | | 04.11.2022 | ||
| Henry Fröse | | Henry Fröse | ||
|- | |- | ||
| 4 | | 4 | ||
| Verbinden des Mikrocontrollers mit dem Heimnetzwerk | | Verbinden des Mikrocontrollers mit dem Heimnetzwerk | ||
| | | 08.11.2022 | ||
| Henry Fröse | | Henry Fröse | ||
|- | |- | ||
| 5 | | 5 | ||
| Erstellung eines Telegramm-Bots | | Erstellung eines Telegramm-Bots | ||
| | | 09.11.2022 | ||
| Kevin Mudczinski | | Kevin Mudczinski | ||
|- | |- | ||
| 6 | | 6 | ||
| Verbindung zwischen Telegram-Bot und Mikrocontroller aufgebaut | | Verbindung zwischen Telegram-Bot und Mikrocontroller aufgebaut | ||
| | | 14.11.2022 | ||
| Kevin Mudczinski | | Kevin Mudczinski | ||
|- | |- | ||
| 7 | | 7 | ||
| Erstellung einfacher Testbefehle mit Textzurückgabe | | Erstellung einfacher Testbefehle mit Textzurückgabe | ||
| | | 15.11.2022 | ||
| Kevin Mudczinski | | Kevin Mudczinski | ||
|- | |- | ||
| 8 | | 8 | ||
| Verschicken von Bilder mittels Telegram-Bot | | Verschicken von Bilder mittels Telegram-Bot | ||
| | | 17.11.2022 | ||
| Kevin Mudczinski | | Kevin Mudczinski | ||
|- | |- | ||
| 9 | | 9 | ||
| Automatische Versendung von Bildern bei Bewegungen und Geräuschen | | Automatische Versendung von Bildern bei Bewegungen und Geräuschen | ||
| | | 20.11.2022 | ||
| Henry Fröse | | Henry Fröse | ||
|- | |- | ||
| 10 | | 10 | ||
| Entwicklung eines Gehäuses | | Entwicklung eines Gehäuses | ||
| | | 05.11.2022 | ||
| Kevin Mudczinski | | Kevin Mudczinski | ||
|- | |- | ||
| 11 | | 11 | ||
| Entwicklung einer Wandhalterung für die Kamera | | Entwicklung einer Wandhalterung für die Kamera | ||
| | | 27.11.2022 | ||
| Kevin Mudczinski | | Kevin Mudczinski | ||
|- | |- | ||
| 12 | | 12 | ||
| Löten und Zusammenbau der Kamera mit Sensoren | | Löten und Zusammenbau der Kamera mit Sensoren | ||
| | | 08.12.2022 | ||
| Kevin Mudczinski | | Kevin Mudczinski | ||
|- | |- | ||
|} | |} | ||
=== | === CAD-Modelle === | ||
ZIP-File mit allen CAD-Modellen: | |||
[[:Datei:CAD-Modelle_Ueberwachungskamera.zip|Überwachungskamera]] | |||
=== Programmcode === | |||
ZIP-File mit dem Programmcode: | |||
[[:Datei:Telegram_picture.zip|Programmcode]] | |||
<!-- Fügen Sie diesen Footer hinzu. --> | <!-- Fügen Sie diesen Footer hinzu. --> | ||
---- | ---- | ||
→ zurück zur Übersicht: [[:Kategorie:ProjekteET_MTR_BSE_WS2022|WS 22/23: Angewandte Elektrotechnik (BSE)]] | → zurück zur Übersicht: [[:Kategorie:ProjekteET_MTR_BSE_WS2022|WS 22/23: Angewandte Elektrotechnik (BSE)]] |
Aktuelle Version vom 9. Januar 2023, 11:35 Uhr
Autoren: Kevin Mudzcinski & Henry Fröse
Betreuer: Prof. Göbel & Prof. Schneider
→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)
→ zurück zur Übersicht: WS 21/22: Angewandte Elektrotechnik (BSE)
→ zurück zur Übersicht: WS 22/23: Angewandte Elektrotechnik (BSE)
Einleitung
Im Rahmen des GET-Fachpraktikums [[1]] entsteht das Projekt „Überwachungskamera“. Sinn des Projektes ist es, ein mechatronisches System zu entwerfen, zu fertigen und zu testen. Dabei sollen vor allem die Kenntnisse aus dem Modul Mess- und Regelungstechnik zur Hilfe genommen werden. Das System registriert mit Hilfe der Sensoren ungewöhnliche Ereignisse aufgrund von Bewegungen bzw. Geräuschen. Daraufhin macht die Kamera ein Foto und sendet dieses per Telegram-Bot [2] an den Nutzer.
An dem Projekt arbeiten die Mechatronik-Studenten Kevin Mudzcinski und Henry Fröse.
-
Abb. 1: Illustration Überwachungskamera
Anforderungen
ID | Inhalt | Ersteller | Datum | Geprüft von | Datum |
---|---|---|---|---|---|
1 | Die Kamera muss mit 5V Spannung versorgt werden. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
2 | Der PIR-Sensor muss Bewegungen registrieren und ein Bild verschicken. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
3 | Der Sound-Sensor muss Geräusche größer Vergleichspegel registrieren und ein Bild verschicken. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
4 | Die ESP32-CAM erstellt ein Foto, wenn der Bewegungs- oder der Geräuschssensor ein HIGH-Signal dem Arduino überträgt. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
5 | Der Kamera muss im Heimnetzwerk mittels SSID und Passwort eingebunden sein. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
6 | Das Bild muss an alle gewünschten Benutzer übertragen werden. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
7 | Es müssen mehrere Benutzer eingebunden werden können, die benachrichtigt werden. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
8 | Die Benutzer muss die Möglichkeit haben, manuell ein Bild anzufordern. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
9 | Die Kamera muss in 2 Dimensionen ausgerichtet werden können. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
10 | Die Kamera muss in ihrer Ausrichtung fixierbar sein. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
11 | Die Kamera muss mittels Schraubverbindung an Oberflächen fixierbar sein. | Henry Fröse | 01.10.2022 | Kevin Mudzinski | 11.10.2022 |
Tabelle 1 zeigt die funktionalen Anforderungen.
Funktionaler Systementwurf/Technischer Systementwurf
-
Abb. 2: Technischer Systementwurf
-
Abb. 3: Funktionaler Systementwurf
Komponentenspezifikation
ID | Komponente | Bezeichnung | Bild |
---|---|---|---|
1 | PIR Sensor | HC-SR501 | |
2 | Mikrofon Soundsensor | KY-038 | |
3 | Entwicklungsplatine inkl. Kamera | ESP32-CAM | |
4 | Gehäuse | 3D-Druck PLA in schwarz | |
5 | Datenkabel und Stromkabel | Litze 0.5mm^2 verschiedene Farben | |
6 | Stromanschluss | 1m USB-3.0-Female auf Micro-USB-3.0-Female Kabel
(Micro-USB Seite wird entfernt und abisoliert) |
|
7 | Verbrauchsmaterial interne Verkabelung | Schrumpfschlauch und Lötzinn |
Umsetzung (HW/SW)
Gehäuse
Das komplette Gehäuse ist mittels 3D-Druck erstellt worden. Die Verbindung der einzelnen Komponenten ist mittels Schrauben gelöst worden, um die Kamera leicht auseinandernehmbar zu gestalten.
Um die Verschiedenen Teile stabil Drucken zu können wurden vereinzelt Komponenten, wie z.B. die Kamerarückwand und die Verbindung an die Halterung.
Das Gehäuse ist in 3 Schichten unterteilt:
- Vorderseite (Bietet Aussparungen für die Kamera, Mikrofon und PIR),
- Mittelring (Dient zur Fixierung der Bauteile ohne diese Anzukleben / Festzuschrauben),
- Rückseite (Bietet erhöhtes Volumen für die Verkabelung und Stromzufuhr)
-
Abb. 4: CAD-Modell - Gehäuse Vorderseite
-
Abb. 5: CAD-Modell - Gehäuse Rückseite
Halterung
Die Halterung kann in 2 Dimensionen Hoch/Runter und Links/Rechts bewegt werden. Hierbei dienen Schrauben zur Fixierung der Position, indem sie mittels "Quetschscheiben" die Bewegung verhindern.
An der Rückseite bietet die Halterung eine Platte zur Befestigung mittels Schrauben für einen Gewindedurchmesser von 4mm in allen 4 Ecken. Die U-Förmige verbindung zwischen Kameragehäuse & Halterung sowie Wandmontageplatte und Halterung wurden seperat gedruckt, da die orientierung im 3D Drucker elementar wichtig für die Stabilität und Flexibilität dieses Bauteils ist. Ohne Die seperierung würde das Bauteil beim Zusammenbau brechen.
-
Abb. 6: CAD-Modell - Halterung
-
Abb. 7: CAD-Modell - Kamera Vorderseite
-
Abb. 8: CAD-Modell - Kamera Rückseite
Schaltung
Zum Einsatz kommt der Mikrokontroller ESP32-CAM, da dieser ab Werk einen Anschluss für eine Kamera sowie Bibliotheken zum auslesen dieser verfügt.
Dieser benötigt eine 5V-Spannungsversorgung, welche wir mittels USB bereitstellen können. Dadurch kann der Anwender entscheidern, ob er die Kamera mittels Powerbank oder USB-Netzteil betreibt.
Der Mikrokontroller besitzt keine Analogen-Pins für das Mikrofon.
Aus diesem Grund sind das Mikrofon und der PIR an den digitalen Pins des Mikrokontrollers angeschlossen. Mittels Widerstand wird ein Schwellwert auf dem Mikrofon und PIR-Sensor eingestellt.
Der Wifi-Chip ist ebenfalls auf dem Mikrokontroller vorhanden, sodass kein extra Modul benötigt wird.
-
Abb. 9: Schaltung
-
Abb. 10: Verkabelung
Code
Die Implementierung von Telegramm und das Verschicken von Bildern ist in Anlehnung an "Random Nerd Tutorial" implementiert worden.
In "BOT_TOKEN" muss der Unique-Token des Erstellten Bots eingefügt werden. In "USER_CHAT_IDS" können eine beliebige Anzahl von Telegramm Accounts eingebunden werden, die ein Bild erhalten wollen.
Mit dem Befehl "/picture" kann ein manuell erstelltes Bild angefordert werden.
Mithilfe von den Variablen "motionState" und "micState" kann verhindert werden, dass aufgrund des selben Eingangssignals 2 identische Bilder direkt hintereinander versendet werden.
-
Abb. 11: Programmablaufsplan
Zusammenbau
Beim Zusammenbau wurde darauf geachtet, dass die Kabel nicht direkt an die Kontakte gelötet werden, um später noch Änderungen am Programmcode vornehmen zu können.
Aus diesem Grund sind die Sensoren und der Mikrokontroller mittels Steckverbinder verschaltet.
Komponententest
ID | Inhalt | Getestet von | Datum |
---|---|---|---|
1 | Die Kamera muss mit 5V Spannung versorgt werden. | Kevin Mudzinski | 11.10.2022 |
2 | Der PIR-Sensor muss Bewegungen registrieren und ein Bild verschicken. | Kevin Mudzinski | 11.10.2022 |
3 | Der Sound-Sensor muss Geräusche größer Vergleichspegel registrieren und ein Bild verschicken. | Henry Fröse | 01.10.2022 |
4 | Die ESP32-CAM erstellt ein Foto, wenn der Bewegungs- oder der Geräuschssensor ein HIGH-Signal dem Arduino überträgt. | Henry Fröse | 01.10.2022 |
5 | Der Kamera muss im Heimnetzwerk mittels SSID und Passwort eingebunden sein. | Kevin Mudzinski | 11.10.2022 |
6 | Das Bild muss an alle gewünschten Benutzer übertragen werden. | Kevin Mudzinski | 11.10.2022 |
7 | Es müssen mehrere Benutzer eingebunden werden können, die benachrichtigt werden. | Henry Fröse | 01.10.2022 |
8 | Die Benutzer muss die Möglichkeit haben, manuell ein Bild anzufordern. | Kevin Mudzinski | 11.10.2022 |
9 | Die Kamera muss in 2 Dimensionen ausgerichtet werden können. | Henry Fröse | 01.10.2022 |
10 | Die Kamera muss in ihrer Ausrichtung fixierbar sein. | Henry Fröse | 01.10.2022 |
11 | Die Kamera muss mittels Schraubverbindung an Oberflächen fixierbar sein. | Kevin Mudzinski | 11.10.2022 |
Tabelle 3 zeigt, welche Anforderung von wem getestet wurde
Ergebnis
Die Überwachungskamera ist vielseitig einsetzbar. Unter anderem auch als Baby-Cam.
Hier ein Video:
Zusammenfassung
Lessons Learned
Bei der Umsetzung des Projektes mussten wir feststellen, dass die Ausrichtung von kleinen Bauteilen auf dem 3D-Drucker von größter Relevanz ist, um die Stabilität der Bauteile sicherstellen zu können.
Des Weiteren haben wir gelernt, dass sich Telegramm gut dafür eignet, schnell Daten, wie Text und Bild, verschiedenen Personen zu übermitteln, ohne eine eigene Server- & Benachrichtigungs-Infrastruktur zu erstellen.
Projektunterlagen
Projektplan
-
Abb.12: Projektplan als Gantt-Diagramm
Projektdurchführung
ID | Meilensteine | Erledigt am | Erledigt von |
---|---|---|---|
1 | PIR Sensor wird vom Mikrocontroller eingelesen und detektiert Bewegung korrekt | 12.10.2022 | Henry Fröse |
2 | Mikrofon wird vom Mikrocontroller eingelesen und detektiert Lautstärke korrekt | 28.10.2022 | Henry Fröse |
3 | Inbetriebnahme der Kamera mittels enthaltenem Beispielprogramm | 04.11.2022 | Henry Fröse |
4 | Verbinden des Mikrocontrollers mit dem Heimnetzwerk | 08.11.2022 | Henry Fröse |
5 | Erstellung eines Telegramm-Bots | 09.11.2022 | Kevin Mudczinski |
6 | Verbindung zwischen Telegram-Bot und Mikrocontroller aufgebaut | 14.11.2022 | Kevin Mudczinski |
7 | Erstellung einfacher Testbefehle mit Textzurückgabe | 15.11.2022 | Kevin Mudczinski |
8 | Verschicken von Bilder mittels Telegram-Bot | 17.11.2022 | Kevin Mudczinski |
9 | Automatische Versendung von Bildern bei Bewegungen und Geräuschen | 20.11.2022 | Henry Fröse |
10 | Entwicklung eines Gehäuses | 05.11.2022 | Kevin Mudczinski |
11 | Entwicklung einer Wandhalterung für die Kamera | 27.11.2022 | Kevin Mudczinski |
12 | Löten und Zusammenbau der Kamera mit Sensoren | 08.12.2022 | Kevin Mudczinski |
CAD-Modelle
ZIP-File mit allen CAD-Modellen: Überwachungskamera
Programmcode
ZIP-File mit dem Programmcode: Programmcode
→ zurück zur Übersicht: WS 22/23: Angewandte Elektrotechnik (BSE)