ESPhone
Introducere
ESPhone este un telefon low-cost și low-power, potrivit pentru cei care au nevoie doar de aplicațiile de bază ale unui telefon.
Scopul proiectului este asamblarea și interconectarea unor componente electronice, care să ofere utilizatorului un telefon pentru uz de strictă necesitate. Astfel, ESPhone va pune la dispoziție următoarele funcționalități esențiale: galerie foto, redare muzică, aplicație de desenat, mesagerie, timpul curent si cel mai important, vremea.
Ideea de bază a fost dorința de a agrega funcționalitățile primitive ale telefoanelor actuale - precum galeria foto, redarea muzicii, vreme, alarma, etc. - într-un dispozitiv construit de la 0.
Proiectul este util, deoarece relevă multitudinea de aplicații redundante si timpul pierdut cu acestea, în timp ce ESPhone oferă utilizatorului strictul necesar din punct de vedere software, ajutându-l să se concentreze pe lucrurile cu adevărat importante.
Descriere generală
Afișajul TFT LCD cu touch va fi conectat la microcontrollerul ESP32 prin interfața SPI. Senzorul de gesturi, conectat prin I2C, este folosit pentru recunoașterea gesturilor utilizatorului pentru controlul de la distanță al telefonului. Butonul, LED-ul verde si buzzer-ul pasiv vor fi conectate la pini GPIO.
Schema Bloc
Hardware Design
Schemă electrică
Descriere Hardware
TFT LCD 2.8” 240×320
Ecranul va fi folosit pentru afișarea aplicațiilor și conținutului.
Funcția capacitivă a modulului permite utilizatorului sa navigheze prin aplicații și să controleze anumite funcționalități ale acestora.
Ecranul dispune de un Touch Pen pentru a crește precizia.
| Pin | Pin ESP32 | Descriere |
| VCC | 3V3 | Alimentare ecran |
| GND | GND | GND pentru ecran |
| CS | GPIO15 | Slave select ecran |
| RESET | EN | Resetează ecranul |
| DC | GPIO2 | Controlează tipul de date transmise prin SPI |
| MOSI | GPIO23 | MOSI pentru ecran |
| SCK | GPIO18 | SCK pentru ecran |
| LED | GPIO25 | Controlează luminozitatea ecranului |
| MISO | GPIO19 | MISO pentru ecran |
| T_CLK | GPIO18 | SCK pentru touch |
| T_CS | GPIO4 | Slave select touch |
| T_DIN | GPIO23 | MOSI pentru touch |
| T_DO | GPIO19 | MISO pentru touch |
Senzor APDS-9960
| Pin | Pin ESP32 | Descriere |
| VCC | 3V3 | Alimentare senzor |
| GND | GND | GND pentru senzor |
| SDA | GPIO21 | Linia de date pentru senzor |
| SCL | GPIO22 | Semnal de clock pentru senzor |
| INT | GPIO35 | Pin ce generează întreruperi |
Push Button
| Aplicația curentă | Funcție |
| Home | Închide ecranul pentru economisirea energiei |
| Paint | Resetează canvas-ul |
| Music | Iese din aplicația de redare a muzicii |
Green LED
LED-ul va fi legat la GPIO14 al microcontrollerului ESP32. Acesta va fi controlat cu un semnal PWM pentru a indica starea de idle a ESP32.
Starea de idle se activează în momentul când utilizatorul închide ecranul.
Bill of Materials
Software Design
În stadiul actual, ESPhone permite următoarele funcționalități:
Aplicație de desenat ce permite selectarea a diferitor culori/multicolor pentru pictat. Tabla de desen se poate șterge prin apăsarea butonului.
Conectarea la Wi-Fi în mod dinamic. Utilizatorul poate selecta Wi-Fi-ul la care să se conecteze si poate introduce parola folosind o tastatură virtuală.
Afișarea vremii. Dacă exista conexiune la internet, utilizatorul poate introduce la tastatură orașul pentru care să se afișeze temperatura si condițiile meteo.
Afișarea timpului curent. Dacă dispozitivul nu este conectat la internet, timpul de start este cel al compilării programului. Dacă utilizatorul se conectează la internet, atunci ceasul se va sincroniza automat cu un NTP server.
Redarea muzicii. Utilizatorul poate schimba muzica trece la melodia anterioară/urmatoare prin gestul mâinii spre stânga/dreapta. Apăsarea butonului duce la revenirea la ecranul de start. Dacă utilizatorul apropie mâna de senzor, muzica se pune pe pauză până când utilizatorul depărteaza mâna.
Galerie. Dacă utilizatorul este conectat la internet, poate vizualiza poze random cu pisici.
Stingerea/aprinderea ecranului prin gestul mâinii spre stânga/dreapta. Ecranul se poate stinge si prin apăsarea butonului pentru conservarea energiei.
Schimbarea culorii de fundal.
Chat. Dacă utilizatorul este conectat la internet, poate introduce un username și un IP destinație. Dacă IP-ul rămâne necompletat, atunci mesajele vor fi trimise la adresa de broadcast a rețelei la care este conectat. Astfel, comunicația se poate petrece cu mai multe dispozitive în același timp. Transferul de mesaje se realizează folosind UDP.
Descriere biblioteci folosite:
Arduino.h → Include structuri de date si funcții de bază.
TFT_eSPI.h → Permite afișarea pe ecranul TFT si detectarea apăsarii pe display.
Wire.h → Folosită pentru inițializare si comunicarea prin protocolul I2C.
SparkFun_APDS9960.h → Permite inițializarea si folosirea senzorului de gesturi.
WiFi.h → Permite conectarea la Wi-Fi.
HTTPClient.h → Folosită pentru trimiterea de cererilor de tip GET.
Ticker.h → Pune la dispoziție un timer ce produce întreruperi la un interval prestabilit.
time.h → Include functii de transformare si convertire a timpului.
string.h → Folosit pentru manipularea string-urilor.
FS.h → Definește
API-ul pentru sistemul de fișere al microcontrollerului.
LittleFS.h → Folosit pentru scrierea si citirea din Flash-ul microcontrollerului.
TJpg_Decoder.h → Folosit pentru redarea imaginilor stocate în Flash pe ecran.
Funcționalități din laborator:
GPIO: Conectarea diferitor periferice.
Întreruperi: Pentru actualizarea timpului pe ecran, dar si pentru detectarea apăsarii butonului/gesturilor.
PWM: În momentul ce ecranul se stinge, LED-ul verde îsi va crește intensitatea luminii treptat, urmând să o scadă tot treptat.
SPI: Controlul si comunicarea cu ecranul TFT.
I2C: Folosirea senzorului de gesturi.
Interacțiune user-device:
După boot, se afișează pe ecran homescreen-ul cu vremea, aplicațiile si timpul curent.
La fiecare apăsare de ecran, se verifică dacă a fost apăsat vreo zonă în care se află o aplicație.
Dacă o aplicație a fost apăsată, se intră în loop-ul aplicației si ecranul este actualizat.
Revenirea la homescreen se face prin apăsarea butonului HOME, sau în cazul aplicației de muzică la sfârșitul ultimei melodii.
La fiecare revenire, homescreen-ul este actualizat. Dacă utilizatorul s-a conectat la Wi-Fi, atunci vremea si timpul sunt actualizate cu date in timp real.
Main loop
void loop() {
// If button is pressed, toggle the display
if (button_pressed) {
button_pressed = false;
toggle_display();
}
// Check and handle any gesture
if (get_sensor_flag())
handle_gesture();
// If the screen is off, return
if (!screen_on) {
idle();
return;
}
// If the clock timer updated the time, draw the new time
if (update_time) {
update_time = false;
draw_clock_time();
}
// Check for any touch
uint16_t touch_x = 0, touch_y = 0;
bool touch = tft.getTouch(&touch_x, &touch_y);
if (!touch)
return;
// If user exited app, redraw homescreen
if (check_app_use(touch_x, touch_y))
draw_homescreen();
}
Calibrarea ecranului TFT:
Pentru a calibra ecranul, s-au citit coordonatele punctelor la apăsarea în colțurile ecranului, folosind funcția getTouchRaw(). Valorile citite vor fi transmise la inițializarea ecranului, iar pentru citirea coordonatelor apăsarii ecranului, se va folosi funcția getTouch() care mapează coordonatele curente in intervalul corect de apăsare al display-ului.
Pentru a conecta modulul direct la 3V3 s-a lipit contectorul J1 de pe spatele ecranului pentru a face bypass la LDO-ul modulului.
Optimizări:
S-au folosit întreruperi in loc de polling pentru citirea datelor de la senzorul de gesturi.
Pentru a reține și diferenția mesajele trimise de utilizator s-au folosit operatii pe biți aplicate unei variabile pe 16 biți.
Iconițile aplicațiilor au fost convertite din imagini PNG in BMP cu 1 bit depth, iar mai apoi in unsigned char array, pentru a salva spațiul necesar stocării acestora.
Rezultate Obţinute
ESPhone v1.0
ESPhone v2.0
Concluzii
După multe zile de debugging și o grămadă de fire lipite, pot să spun că am reușit să creez ceea ce mi-am propus: un telefon ușor de folosit, greu de asamblat. Am învățat o grămadă de lucruri noi, mai ales pe partea de embedded, și sigur nu o să uit această experiență prea curând.
Jurnal
15.04.2025 → M-am decis în legătură cu tema proiectului.
22.04.2025 → Am comandat ecranul TFT LCD 2.8”.
28.04.2025 → Am desenat UI pentru aplicații.
5.05.2025 → Am comandat un kit Plusivo, ESP32 DevKit-V1 si un APDS9960.
11.05.2025 → M-am apucat să dezvolt “
OS-ul” pentru ESPhone.
15.05.2025 → Am cumpărat o placă de test. De asemenea, am implementat aplicația de desenat, de redat muzică, conectat la WiFi și schimbat culoarea fundalului.
22.05.2025 → Am cumpărat fire pentru momentul când voi lipi piesele pe placa de test.
27.05.2025 → Am implementat aplicația de mesagerie si galerie foto.
28.05.2025 → Am lipit componentele pe placa de test.
29.05.2025 → Am finalizat ESPhone.
Bibliografie/Resurse
Resurse Software:
Resurse Hardware: