This is an old revision of the document!
Proiectul meu constă într-o machetă de casă inteligentă (smart house), care integrează o serie de funcționalități moderne menite să imite controlul automatizat al unei locuințe reale.
Utilizatorul va putea interacționa cu macheta prin intermediul unei aplicații, având posibilitatea să:
- controleze luminile din fiecare cameră,
- deschidă sau închidă ușa de la garaj,
- primească notificări de tip alarmă în cazul în care este detectată mișcare în locuință în timp ce luminile sunt stinse.
Ideea proiectului a pornit de la dorința de a ilustra modul în care tehnologia poate fi integrată într-un mediu domestic pentru a spori confortul, securitatea și eficiența energetică.
Consider că un astfel de sistem este util atât pentru utilizatori, oferindu-le control de la distanță asupra casei lor, cât și pentru mine, ca dezvoltator, pentru aprofundarea cunoștințelor în domeniul automatizărilor și interfețelor inteligente.
Locuința va fi formată din opt camere, dintre care una va fi destinată garajului. În fiecare cameră, cu excepția garajului, va fi instalat câte un LED care poate fi aprins sau stins direct din aplicația mobilă, oferind un control inteligent al iluminatului.
Ușa garajului va putea fi controlată tot prin aplicație, fiind acționată de un servomotor, ceea ce permite deschiderea și închiderea acesteia de la distanță, în mod automatizat.
Pentru un plus de siguranță, dacă LED-ul de pe hol este stins iar senzorul detectează mișcare, se va declanșa automat o alertă pe telefon, însoțită de activarea buzzerului. Astfel, sistemul oferă nu doar confort, ci și un nivel crescut de securitate pentru întreaga locuință.
Placa de dezvoltare ESP32 funcționează ca unitate de control principală, gestionând toate componentele periferice ale sistemului: servomotorul utilizat pentru ridicarea și coborârea ușii garajului, buzzerul, LED-urile de stare și senzorul de detecție.
Alimentare: Dispozitivul este alimentat de un modul format din patru baterii AA (6V), care furnizează energia necesară pentru funcționarea servomotorului. Pentru a alimenta în siguranță placa ESP32, tensiunea este redusă la 3.3V cu ajutorul unui divizor de tensiune.
Pentru a controla eficient servomotorul, semnalul PWM generat de ESP32 (0–3.3V) este amplificat la 0–5V cu ajutorul unui amplificator operațional, asigurând astfel o acționare precisă a mecanismului de deschidere/închidere a garajului. Senzorul este alimentat direct din baterii și este conectat la pinul GPIO0 al plăcii ESP32. Buzzerul este conectat la pinul GPIO1, permițând generarea alertelor sonore în funcție de starea sistemului.
Această arhitectură asigură un control eficient și fiabil al sistemului de automatizare a ușii de garaj.
Piese:
| Componentă | Descriere / Observație |
|---|---|
| ESP32 | Placă Wireless cu Microcontroller |
| Servomotor SG92R 9g 2.5 kg.cm, 4.8 V | Motor utilizat pentru usa garajulu |
| Modul Senzor PIR HC-SR501 | Senzor de Miscare |
| Tranzistor PNP 2n2907 TO-92 | Pentru buzzer |
| Buzzer Activ | 103450 – 3.7V, 2000mAh |
| LED-uri | lumina |
1. Prezentare Generală Proiectul “Smart House Dashboard” implementează un sistem de control și monitorizare a casei inteligente bazat pe un microcontroler ESP32. Sistemul oferă o interfață web accesibilă dintr-un browser, permițând utilizatorilor autentificați să controleze diverse dispozitive (lumini, ușa de garaj) și să vizualizeze date de la senzori (temperatură și umiditate). Comunicația între client (browser) și server (ESP32) se realizează prin HTTP, cu datele de stare și control transmise adesea în format text simplu sau JSON.
Mediu de Dezvoltare și Tehnologii
IDE: PlatformIO IDE (integrat cu Visual Studio Code) Framework Firmware: Arduino Core pentru ESP32 Limbaj Firmware: C++ Tehnologii Frontend: HTML5, CSS3, JavaScript Sistem de Fișiere pe ESP32: LittleFS (pentru stocarea fișierelor web statice)
Librării și Surse 3rd-Party
<Arduino.h>: Librăria de bază Arduino. <WiFi.h>: Pentru conectivitate Wi-Fi a ESP32. <WebServer.h>: Pentru crearea serverului HTTP pe ESP32. <LittleFS.h>: Pentru gestionarea sistemului de fișiere LittleFS. <ArduinoJson.h>: Pentru parsarea și generarea eficientă a obiectelor JSON (utilizată pentru răspunsurile la cererile privind ușa garajului și senzorul DHT). <DHT.h> & <DHT_U.h>: Pentru interfațarea cu senzorul de temperatură și umiditate DHT22. <ESP32Servo.h>: Pentru controlul servomotorului ușii de garaj.
Arhitectura Software
Sistemul este construit pe o arhitectură client-server: Server: Rulează pe ESP32. Gestionează conexiunea Wi-Fi. Rulează un server HTTP care ascultă cereri de la clienți. Implementează logica de control pentru dispozitivele fizice (LED-uri, servomotor). Citește date de la senzorul DHT22. Gestionează autentificarea utilizatorilor. Servește fișierele statice ale interfeței web (HTML, CSS, JS) din LittleFS.
Client (Interfața Web): Rulează în browser-ul utilizatorului. Este compusă din fișiere HTML (index.html, login.html), CSS (style.css) și JavaScript (script.js). Prezintă interfața grafică pentru control și vizualizare. Trimite cereri HTTP (GET, POST) către serverul ESP32 pentru a efectua acțiuni sau a obține date. Actualizează dinamic interfața pe baza răspunsurilor de la server.
Comunicare: Protocol: HTTP/HTTPS (în acest caz, HTTP pe portul 80). Format de Date: Text simplu (pentru stările ON/OFF ale luminilor) și JSON (pentru datele senzorului DHT și starea complexă a garajului).
Componentele Software Detaliate
Fișierul de Configurare conține datele private: WIFI_SSID, WEB_USERNAME, WEB_PASSWORD.
Inițializare (setup()): Inițializează comunicarea serială pentru debugging. Configurează pinii GPIO pentru LED-uri ca ieșiri (OUTPUT) și setează starea inițială (OFF). Inițializează și atașează servomotorul la pinul SERVO_PIN, setând poziția inițială la închis (SERVO_CLOSED_POS). Inițializează senzorul DHT22. Montează sistemul de fișiere LittleFS. Afișează fișierele din rădăcină pentru diagnosticare. Se conectează la rețeaua Wi-Fi utilizând credențialele din credentials.hpp. Definește rutele HTTP și funcțiile handler asociate pentru: Autentificare (/login.html, /login, /logout). Servirea paginii principale (/) și a resurselor statice (/style.css, /script.js). Controlul individual al luminilor (ex: /toggleBedroom1, /stateBedroom1). Controlul ușii de garaj (/openGarageDoor, /closeGarageDoor, /garageDoorState). Citirea datelor de la senzorul DHT (/dhtdata). Gestionarea paginilor negăsite (handleNotFound). Pornește serverul web. Bucla Principală (loop()): Apelează continuu server.handleClient() pentru a procesa cererile HTTP primite, doar dacă ESP32 este conectat la Wi-Fi. Managementul Autentificării: Variabila isAuthenticated urmărește starea autentificării. handleLoginHTML(): Servește pagina login.html. handleLogin(): Procesează cererea POST de la login.html. Verifică username-ul și parola cu cele din credentials.hpp. Dacă sunt corecte, setează isAuthenticated = true și redirecționează către /. Altfel, returnează eroare 401 (Unauthorized) sau 400 (Bad Request). handleLogout(): Setează isAuthenticated = false și redirecționează către login.html. checkAuth(): Funcție helper apelată de majoritatea handler-elor pentru a verifica autentificarea înainte de a permite accesul la resurse.
Controlul Dispozitivelor: Lumini: Variabile de stare (ex: ledStateBedroom1) memorează starea fiecărei lumini. processToggleRequest(pin, stateVariable, ledName): Funcție centralizată pentru comutarea stării unui LED. Include logică de debounce (toggleDebounceDelay) pentru a preveni comutări multiple la cereri rapide. Actualizează pinul GPIO și variabila de stare. Trimite noua stare (“ON” sau “OFF”) ca răspuns. Handler-e specifice (ex: handleToggleBedroom1, handleStateBedroom1): Apelează processToggleRequest sau returnează starea curentă. Ușa Garajului: garageServo: Obiect Servo pentru controlul motorului. isGarageDoorOpen: Variabilă booleană pentru starea ușii. handleOpenGarageDoor(), handleCloseGarageDoor(): Apelează garageServo.write() cu poziția corespunzătoare. Implementează debounce (garageDoorDebounceDelay). La deschidere, aprinde automat lumina din garaj dacă era stinsă. Returnează un obiect JSON cu doorStatus și garageLightStatus. handleGarageDoorState(): Returnează starea curentă a ușii și a luminii din garaj în format JSON. Citirea Senzorilor (handleDHTData()): Citește temperatura și umiditatea de la senzorul DHT22. Returnează datele într-un obiect JSON. Include gestionarea erorilor (returnează null pentru valori dacă citirea eșuează). Servirea Fișierelor Statice (readFile(), handleCSS(), handleJS(), handleRoot(), handleLoginHTML()): Funcția readFile() este utilizată pentru a citi conținutul fișierelor (index.html, login.html, style.css, script.js) din LittleFS. Handler-ele corespunzătoare trimit conținutul fișierelor cu tipul MIME corect. 5.2. Interfața Web (Frontend) login.html (Implicit, nu este furnizat, dar dedus): Un formular HTML simplu cu câmpuri pentru “username” și “password” și un buton de submit. La submit, trimite o cerere POST către /login pe serverul ESP32. index.html (Pagina Principală): Structura: Definește layout-ul general al dashboard-ului. Buton de Logout. Secțiune “Light Controls”: O grilă cu controale de tip “switch” (checkbox-uri stilizate) și afișaje de stare pentru fiecare lumină (Bedroom 1 & 2, Kitchen, Garage, Living Room, Hallway, Bathroom, Office). Secțiune “Garage Door Control”: Butoane “Open Door” și “Close Door”, și un afișaj pentru starea ușii. Secțiune “DHT22 Sensor Readings”: Afișaje pentru Temperatură și Umiditate. Legături: Include fișierul style.css pentru stilizare și script.js pentru funcționalitate. Identificatori: Elementele interactive și de afișare au ID-uri unice (ex: toggleBedroom1, stateBedroom1, garageDoorStatusText, temperatureValue) pentru a fi manipulate de JavaScript. style.css (Fișier de Stiluri): Definește aspectul vizual al paginii index.html. Stilizează containerele principale, secțiunile, butoanele, textul. Implementează stilurile pentru switch-urile customizate (slider-ul ON/OFF pentru lumini). Utilizează Flexbox pentru aranjarea elementelor. Asigură un design curat și responsiv (prin max-width). script.js (Logica Client-Side): Inițializare (DOMContentLoaded): Așteaptă ca întregul DOM să fie încărcat înainte de a executa codul. Referințe Elemente DOM: Obține referințe la elementele HTML relevante folosind document.getElementById(). Gestionare Autentificare (handleUnauthorized()): Funcție helper care verifică dacă răspunsul de la server este 401 (Unauthorized). Dacă da, redirecționează utilizatorul către /login.html. Controlul Luminilor: updateSpecificLightUI(lightId, state): Actualizează textul de stare (ON/OFF) și starea vizuală a checkbox-ului pentru o lumină specifică. setupLightControl(light): Pentru fiecare lumină definită în array-ul lights: Realizează o cerere fetch către /state<LightId> pentru a obține starea inițială și actualizează UI-ul. Adaugă un event listener (change) pe checkbox-ul de comutare. La modificare, trimite o cerere fetch către /toggle<LightId> și actualizează UI-ul cu noua stare primită. Include gestionarea erorilor și a răspunsurilor neautorizate. Controlul Ușii de Garaj: fetchGarageDoorState(): Realizează o cerere fetch către /garageDoorState pentru a obține starea inițială a ușii și a luminii din garaj, actualizând UI-ul. handleGarageDoorActionResponse(data): Actualizează UI-ul (starea ușii și a luminii din garaj) pe baza răspunsului JSON de la server după o acțiune de deschidere/închidere. Event listener-e pe butoanele “Open Door” și “Close Door”: La click, trimit cereri fetch POST către /openGarageDoor sau /closeGarageDoor și procesează răspunsul. Afișare Date Senzor DHT22: fetchDHTData(): Realizează o cerere fetch către /dhtdata. Actualizează elementele span pentru temperatură și umiditate cu datele primite (formatate la o zecimală) sau afișează “N/A” / “Error” în caz de probleme. Datele senzorului sunt actualizate la încărcarea paginii și apoi periodic la fiecare 5 secunde folosind setInterval(fetchDHTData, 5000). Logout: Event listener pe butonul “Logout”: La click, trimite o cerere fetch POST către /logout. Dacă reușește, redirecționează către /login.html. Comunicare Asincronă: Toate interacțiunile cu serverul ESP32 sunt realizate asincron folosind API-ul fetch, permițând interfeței să rămână responsivă. 6. Fluxuri de Date Principale Autentificare: Utilizator accesează / → Server ESP32 verifică isAuthenticated. Dacă e false, redirect la /login.html. Utilizator introduce credențiale în login.html și submit → Browser trimite POST la /login cu datele. Server ESP32 (handleLogin) validează. Dacă OK, isAuthenticated = true, redirect la /. Browser încarcă /index.html și script.js. Comutare Lumină: Utilizator apasă un switch în index.html. script.js (event listener) trimite GET la /toggle<LightName>. Server ESP32 (handleToggle<LightName> → processToggleRequest) comută LED-ul, actualizează starea internă, aplică debounce. Server ESP32 răspunde cu noua stare (“ON” / “OFF”). script.js (updateSpecificLightUI) actualizează UI-ul. Deschidere Ușă Garaj: Utilizator apasă “Open Door” în index.html. script.js (event listener) trimite POST la /openGarageDoor. Server ESP32 (handleOpenGarageDoor) mișcă servomotorul, aprinde lumina garajului (dacă e cazul), actualizează stările interne, aplică debounce. Server ESP32 răspunde cu JSON { “doorStatus”: “OPEN”, “garageLightStatus”: “ON/OFF” }. script.js (handleGarageDoorActionResponse) actualizează UI-ul. Afișare Date Senzor: script.js (la încărcare și setInterval) trimite GET la /dhtdata. Server ESP32 (handleDHTData) citește senzorul. Server ESP32 răspunde cu JSON { “temperature”: T, “humidity”: H }. script.js actualizează valorile în UI. 7. Concluzii și Puncte Cheie Modularitate: Codul este împărțit logic în backend (ESP32) și frontend (HTML/CSS/JS). În cadrul backend-ului, funcțiile handler sunt dedicate pentru fiecare rută/acțiune. Securitate: Implementează o autentificare simplă bazată pe username/parolă pentru a proteja accesul la funcționalitățile de control. Credențialele sunt stocate extern în credentials.hpp. Interfață Utilizator: Oferă o interfață web intuitivă pentru control și monitorizare, cu actualizări dinamice fără reîncărcarea paginii. Eficiență: Utilizarea LittleFS pentru stocarea fișierelor web și ArduinoJson pentru serializarea datelor contribuie la o utilizare eficientă a resurselor ESP32. Debounce: Mecanismele de debounce previn acționări multiple nedorite și protejează componentele hardware (ex: servomotorul). Feedback Utilizator: Interfața web reflectă starea curentă a dispozitivelor și senzorilor, oferind feedback imediat utilizatorului.
Care au fost rezultatele obţinute în urma realizării proiectului vostru.
Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.