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

  • Senzorul de gesturi va fi folosit pentru controlul dispozitivului de la distanță.
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

Buzzer pasiv

  • Buzzer-ul va fi legat la GPIO32 al microcontrollerului ESP32. Acesta va fi folosit în aplicația de redare a muzicii. De asemenea, este legat in serie cu o rezistență de 100 Ohm pentru a preveni zgomotele ascuțite.

Push Button

  • Acest buton va fi legat la pinul GPIO26 al ESP32 in configurație de INPUT_PULLUP. Acesta are mai multe funcționalități, in funcție de aplicația curentă:
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

Piesă Datasheet Link Buy Link
ESP32 DevKit-V1 Datasheet Buy
TFT LCD 2.8” 240×320 Datasheet Buy
APDS-9960 Sensor Datasheet Buy
Passive Buzzer Datasheet Buy
Push Button Datasheet Buy
LED Datasheet Buy
Resistor 330 Ohm Datasheet Buy
Resistor 100 Ohm Datasheet Buy
Power Bank 10400mah - Buy
Rigid Wires - Buy
Placă de test - Buy

Software Design

  • Mediu de dezvoltare: PlatformIO

Î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.

Elemente unice:

  • UI unic, personalizat.
  • Conectarea la Wi-Fi in mod dinamic.
  • Controlul de la distanță al ecranului.

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 in idle mode

ESPhone Homescreen ESPhone Custom Homescreen Paint app

Music app

ESPhone v2.0

ESPhone ESPhone keyboard ESPhone ByteChat app

Paint app again

ESPhone with ESPen holder

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

pm/prj2025/mdinica/cristian.popescu03.txt · Last modified: 2025/05/30 01:10 by cristian.popescu03
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