Cameră de securitate controlată prin aplicație mobilă

Introducere

Prezentarea pe scurt a proiectului:

Acest proiect constă într-un sistem de supraveghere portabil, autonom, bazat pe modulul ESP32-CAM. Dispozitivul este alimentat de la o baterie Li-Ion și poate stoca imagini pe un card SD, dar și transmite date către o aplicație mobilă personalizată prin WiFi.

Ce face:

- Captează imagini la intervale regulate sau la detecția mișcării. - Salvează imaginile pe un card microSD. - Trimite notificări și imagini către o aplicație mobilă. - Poate fi controlat de la distanță printr-o interfață mobilă.

Scopul:

Scopul este realizarea unui sistem de supraveghere autonom, ușor de amplasat în diverse locații, fără a necesita infrastructură complicată sau alimentare permanentă.

Ideea de la care am pornit:

Am dorit un dispozitiv simplu, accesibil, portabil și wireless, care să poată monitoriza un spațiu și să alerteze utilizatorul în timp real.

Utilitate:

Este util pentru monitorizarea locuințelor, birourilor, grădinilor, spațiilor de parcare sau în proiecte educaționale și hobby-uri DIY. Poate fi un bun punct de plecare pentru aplicații IoT mai complexe.

Descriere generală

Schema bloc:

Descrierea modulelor:

  • ESP32-CAM – modulul principal care controlează tot sistemul. Capturează imagini, gestionează conexiunea WiFi și salvează pe SD card.
  • Baterie Li-Ion + Modul de alimentare (TP4056) + Convertor MT3608 – sursa de alimentare a sistemului.
  • Card microSD – folosit pentru stocarea imaginilor local.
  • Aplicație mobilă – oferă interfață pentru vizualizarea imaginilor și trimiterea comenzilor către ESP32.
  • Modul WiFi (integrat în ESP32) – pentru comunicarea cu telefonul.

Hardware Design

Componente utilizate:

  • ESP32-CAM
  • Card microSD
  • Baterie Li-Ion 3.7V
  • Modul de încărcare TP4056
  • Convertor MT3608
  • Modul FTDI pentru upload firmware

Schema electrica:

Software Design

Mediu de dezvoltare:

Biblioteci utilizate:

  • `FS.h` – pentru interactiunea cu fisiere
  • `SD_MMC.h` – pentru interacțiunea cu cardul microSD
  • `WiFi.h` – conexiune wireless
  • `esp_camera.h` – controlul camerei

Functii adaugate:

ESP32-CAM
  • onTimer() (ISR marcat cu IRAM_ATTR):
    • Funcție de tip întrerupere (ISR) apelată de timer la un interval configurat (în exemplu, la 500 ms). Setează flag‑ul (motionCheckFlag) care indică faptul că trebuie verificată prezența mișcării.
  • startRecording():
    • Creează un fișier nou pe cardul SD (nume incrementat automat) cu extensia .mjpeg. Pornește înregistrarea, reținând momentul de start, pentru a ști ulterior când să se oprească după un anumit interval (ex. 5 secunde).
  • stopRecording():
    • Închide fișierul de înregistrare și setează indicatorul de înregistrare (isRecording) pe false. Resetează flag‑urile și memoria dedicată primei capturi, pentru a pregăti sistemul pentru o nouă înregistrare.
  • downscaleGrayscale(const camera_fb_t *fb, uint8_t *output):
    • Converteste cadrul JPEG (fb→buf) în format RGB și apoi îl reduce la o imagine 64×64 în tonuri de gri (8 biți/pixel). Folosește sampling 3×3 pentru a face o mică anti-aliasing și calculează media valorilor de gri. Returnează true/false în funcție de reușita procesării.
  • detectMotion(const camera_fb_t *fb):
    • Preia cadrul de la cameră, apoi îl trimite către downscaleGrayscale(). Compară rezultatul cu cadrul anterior (prevFrame) și calculează media diferențelor pixel cu pixel. Dacă media diferențelor depășește MOTION_THRESHOLD, consideră că s-a detectat mișcare și întoarce true.
  • getLastFileNumber():
    • Scanează directorul rădăcină de pe cardul SD pentru a găsi fișiere de tipul motion_x.mjpeg. Caută cel mai mare număr x deja folosit în denumirea fișierelor și returnează următorul index disponibil.
  • checkMotion():
    • Se apelează atunci când motionCheckFlag este setat de întrerupere (onTimer()). Obține un nou cadru de la cameră, apelează detectMotion() și dacă este detectată mișcare, pornește înregistrarea (startRecording()).
Aplicatie Mobila
  • onCreate() (în MainActivity)
    • Configurează interfața grafică folosind Jetpack Compose. Creează un Scaffold și încarcă un Composable care afișează un WebView.
  • onResume() (în MainActivity)
    • La revenirea în aplicație, pornește un Coroutine care testează de mai multe ori dacă adresa camerei (ESP32) este accesibilă. Dacă e disponibilă, încarcă în WebView pagina de la URL-ul camerei; dacă nu, apelează promptToConnect() pentru a cere utilizatorului să se conecteze manual la rețeaua ESP32.
  • WebViewContainer(setWebView: (WebView) → Unit)
    • O funcție de tip Composable care creează un WebView cu diverse setări activate: JavaScript, stocare DOM, acces la fișiere, redare media etc. Returnează prin callback obiectul WebView pentru a putea fi folosit ulterior.
  • isCameraReachable()
    • Funcție suspendată ce încearcă un request tip HTTP GET la adresa camerei (192.168.4.1). Verifică codul de răspuns (2xx înseamnă succes) și returnează true dacă dispozitivul este accesibil.
  • promptToConnect(context: Context)
    • Afișează un mesaj Toast care cere utilizatorului să se conecteze la WiFi-ul camerei și deschide setările de WiFi ale telefonului (Settings.ACTION_WIFI_SETTINGS).

Rezultate Obţinute

Concluzii

Cod sursă

Structura repo:

  • CameraWebServer - Cod pentru placuta.
  • CameraApp - Cod aplicatie mobila.

Jurnal

  • Etapa 1: Alegerea componentelor și testarea ESP32-CAM
  • Etapa 2: Algoritm de detectare a miscarii
  • Etapa 3: Captura video și salvarea pe SD
  • Etapa 4: Interfață mobilă + transmisie WiFi
  • Etapa 5: Integrare finală și testare pe baterie

Bibliografie / Resurse

pm/prj2025/ajipa/arthur.peter.txt · Last modified: 2025/05/21 16:29 by arthur.peter
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0