Personal assistant este un dashboard inteligent care poate comunica cu dispozitivele tale pentru a afișa informații despre calendar, remindere, vreme, oră, notificări, temperatură / umiditatea din cameră etc. Se poate conecta la telefon pentru a trimite notificări și are un buzzer pentru alarme / remindere. De asemenea, folosește un senzor de lumină pentru a te trezi odată cu răsăritul.
Scopul proiectului este de a avea acces ușor la informațiile utile ție. Proiectul este gândit să stea pe birou și să afișeze diverse lucruri, precum: valori de la senzori, informatii de la telefon, informatii de la un API etc. sau să te notifice de ceva prin intermediul buzzer-ului.
Inspirația pentru proiectul meu a venit în momentul în care am cumpărat un ”Sunrise Alarm Clock” de pe Temu care este configurabil printr-o aplicație de telefon. Mi s-a părut super mișto ideea de a controla un dispozitiv prin internet (nu mi-a plăcut niciodată să setez un ceas cu butoane) și m-am gândit să fac și eu ceva asemănător, dar mult mai configurabil. Am vrut totuși să păstrez funcționalitate de sunrise alarm :)
Cred că un astfel de dashboard este util pentru oricine, deoarece poate fi configurat să afișeze aproape orice folosind un ESP32.
Proiectul are la bază un ESP32 si un display LCD. Am decis să folosesc un ESP32, deoarece am vrut conexiune la Internet și Bluetooth pentru a putea comunica cu telefonul / un server. Pe lângă aceste dispozitive, proiectul mai conține un buzzer pentru alerte sonore și doi senzori: un senzor pentru temperatură / umiditate și un senzor de lumină pentru detecția răsăritului.
Modul de funcționare este următorul:
Listă de piese:
| Componenta | Pin Componenta | Pin ESP32 | Rol |
|---|---|---|---|
| TFT LCD | VCC | 3.3V | Alimentare |
| TFT LCD | GND | GND | Ground |
| TFT LCD | CS | D5 | Linie CS pentru SPI |
| TFT LCD | RESET | D4 | Resetare display |
| TFT LCD | DC | D2 | Selectare mod de comanda / date pentru display (1 - Mod date (coordonate, culoare pixel etc.); 0 - Mod comanda (schimbare orientare, sleep etc.) |
| TFT LCD | SDI | D23 | Linie MOSI pentru SPI |
| TFT LCD | SCK | D18 | Linie SCLK pentru SPI |
| TFT LCD | LED | 3.3V | Luminozitate display |
| Componenta | Pin Componenta | Pin ESP32 | Rol |
|---|---|---|---|
| BH1750 | VCC | 3.3V | Alimentare |
| BH1750 | GND | GND | Ground |
| BH1750 | SCL | D13 | Linie SCL pentru I2C |
| BH1750 | DAT | D14 | Linie SDA pentru I2C |
| Componenta | Pin Componenta | Pin ESP32 | Rol |
|---|---|---|---|
| DHT22 | VCC | VIN | Alimentare |
| DHT22 | GND | GND | Ground |
| DHT22 | DAT | D25 | Linie de date |
| Componenta | Pin Componenta | Pin ESP32 | Rol |
|---|---|---|---|
| Buzzer Pasiv | + | D32 | Generare de frecvențe audio |
| Buzzer Pasiv | - | GND | Ground |
Am asamblat toate componentele și am verificat că funcționează.
Implementarea software curentă cuprinde următoarele funcționalități:
În realizarea proiectului am folosit PlatformIO și framework-ul Arduino. Am ales PlatformIO, deoarece este foarte ușor să adaugi biblioteci externe și, în plus, am lucrat cu el și la laborator. În ceea ce privește framework-ul, a fost o decizie destul de grea. Inițial am vrut să lucrez cu framework-ul ESP-IDF, dar mi-am dat seama că va fi prea complicat și că mă voi încurca în detalii în loc să implementez funcționalitățile propriu-zise. În schimb, framework-ul Arduino mi-a dat libertatea să vin cu mai multe idei și să implementez funcționalități mai complexe (precum WiFi sau Bluetooth) care să evidențieze potențialul proiectului.
La implementarea proiectului am folosit mai multe biblioteci externe. O parte din ele sunt complet necesare (precum NimBLE sau WiFi), dar pe altele le-am folosit pentru ușurință:
Elementul de noutate al proiectului constă în posibiliățile pe care le oferă. Fiind conectat la WiFi și la Bluetooth înseamnă că poți obține orice fel de informații, iar cu ajutorul bilbiotecii TFT_eSPI îți poți crea ușor propria interfață.
Scheletul codului:
| Funcție | Rol |
|---|---|
| batteryStatusCallback | Actualizează variabila batteryStatus cu noul nivel al bateriei de la telefon |
| subscribeToBatteryService | Subscribe la serviciul de Bluetooth pentru baterie. Se primesc notificări când se modifică nivelul bateriei și sunt gestionate de funcția batteryStatusCallback |
| amsCallBack | Actualizează informațiile despre melodia redată pe telefon (titlu, artist, durată, stare etc.). Pentru a determina tipul informației primite, am urmărit specificațiile din documentația AMS |
| subscribeToAMS | Subscribe la Apple Media Service |
| printTime | Afișează (pe Serial) data curentă |
| getCurrentTime | Sincronizează ceasul microcontroller-ului cu ceasul de la telefon (prin Bluetooth) |
| printTrack | Afișează informații (pe Serial) despre melodia redată |
| sensorCallback | Citește valorile senzorilor și modifică modul de afișare (Dark Mode / Light Mode) dacă este nevoie. Funcția este un task FreeRTOS care se apelează automat la 2 secunde |
| reminderCallback | Verifică lista cu remindere și semnalează pornirea alarmei. Funcția este un task FreeRTOS care se apelează automat la o secundă |
| httpGETRequest | Creează și trimite cererea HTTP la serverul REST. Întoarce răspunsul de la server |
| WiFiStationDisconnected | Încearcă reconectarea la WiFi |
| parseReminderList | Se parsează răspunsul primit de la server și se actulizează lista cu remindere. Răspunsul conține titlul și timpul reminder-ului |
| drawCustomCentredString | Afișează un text centrat la coordonatele date |
| drawDividers | Desenează liniile orizontale care delimitează secțiunile interfeței grafice |
| updateHeaderView | Afișează pe ecran timpul și informațiile de la senzori |
| updateDateBarView | Afișează pe ecran data curentă |
| drawRemindersList | Desenează pe ecran lista cu remindere |
| updateMediaScrubber | Afișează pe ecran titlul melodiei redate pe telefon și desenează o bară care se actualizează cu progresul melodiei |
| setup | Se inițializează senzorii, display-ul și conexiunea la WiFi și Bluetooth |
| loop | Se actulizează interfața grafică, se acționează buzzer-ul și se fac periodic cereri la serverul HTTP |
Optimizările pe care le-am realizat sunt legate de Bluetooth. Prima optimizare a fost alegerea BLE (Bluetooth Low Energy) în loc de Bluetooth obișnuit. BLE consumă mult mai puțină energie (pe microcontroller, dar și pe telefon) și oferă toate serviciile de care am nevoie. A doua optimizare constă în folosirea funcției de subscribe la un serviciu Bluetooth. Folosind subscribe, primesc notificări doar atunci când se modifică datele (de exemplu se schimbă melodia) și nu trebuie să fac polling constant. De asemenea, în cadrul funcțiilor de callback (funcții care se apelează automat când primesc o notificare Bluetooth) am evitat instrucțiunile complexe și doar am setat anumite flag-uri, pe care le-am tratat ulterior în loop.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
Resurse: