This shows you the differences between two versions of the page.
pm:prj2025:rnedelcu:alexandru.trifu2712 [2025/04/29 11:06] alexandru.trifu2712 created |
pm:prj2025:rnedelcu:alexandru.trifu2712 [2025/05/27 23:12] (current) alexandru.trifu2712 |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== BrewMate ====== | ====== BrewMate ====== | ||
- | |||
===== Introducere ===== | ===== Introducere ===== | ||
Line 8: | Line 7: | ||
• Înregistrează automat cafenelele vizitate și tipurile de cafea consumate | • Înregistrează automat cafenelele vizitate și tipurile de cafea consumate | ||
• Salvează datele pe un card SD pentru consultare ulterioară | • Salvează datele pe un card SD pentru consultare ulterioară | ||
- | • Oferă recomandări bazate pe istoricul tău de consum | + | • Oferă recomandări bazate pe istoricul tău de consum (OpenAI) |
- | • Interfață tactilă prietenoasă pentru navigare rapidă | + | • Interfață prietenoasă pentru navigare facilă |
- | • Funcție vocală (OpenAI) pentru sugestii dinamice de localuri sau sortimente de cafea | + | • (Extra) Funcție vocală pentru sugestii dinamice de localuri sau sortimente de cafea |
===== Descriere generală ===== | ===== Descriere generală ===== | ||
Line 16: | Line 15: | ||
BrewMate este construit ca un sistem embedded interactiv, gândit să funcționeze autonom și să ofere o experiență fluidă utilizatorilor. Dispozitivul combină module hardware și software pentru a înregistra, organiza și recomanda preferințe legate de cafea. | BrewMate este construit ca un sistem embedded interactiv, gândit să funcționeze autonom și să ofere o experiență fluidă utilizatorilor. Dispozitivul combină module hardware și software pentru a înregistra, organiza și recomanda preferințe legate de cafea. | ||
- | Utilizatorii pot înregistra automat cafenelele vizitate și tipurile de cafea consumate, aceste date fiind salvate pe un card SD pentru consultare ulterioară. Fiecare înregistrare poate conține informații precum: numele cafenelei, tipul de cafea, nota personală, data vizitei și eventuale comentarii. | + | Utilizatorii pot înregistra automat cafenelele vizitate și tipurile de cafea consumate, aceste date fiind salvate pe un card SD pentru consultare ulterioară. Fiecare înregistrare conține numele cafenelei și tipul de cafea comandat. |
- | Înainte de o nouă ieșire, utilizatorii pot accesa aceste date direct de pe display-ul touchscreen, unde interfața le va afișa sugestii filtrate pe baza istoricului: ce localuri au fost apreciate cel mai mult, ce tipuri de cafea au fost cele mai consumate etc. | + | Înainte de o nouă ieșire, utilizatorii pot vizualiza aceste date direct de pe display, unde interfața le va afișa sugestii filtrate pe baza istoricului. |
- | BrewMate integrează și o funcție vocală inteligentă care utilizează API-ul OpenAI pentru generarea de recomandări. Aceasta analizează preferințele înregistrate și oferă sugestii dinamice privind cafenele noi sau sortimente potrivite gusturilor utilizatorului. Funcția poate fi activată printr-un buton dedicat sau direct prin interfața touchscreen. | + | BrewMate integrează și o funcție vocală inteligentă care utilizează API-ul OpenAI pentru generarea de recomandări. Aceasta analizează preferințele înregistrate și oferă sugestii dinamice privind cafenele noi sau sortimente potrivite gusturilor utilizatorului. |
- | Datele sunt gestionate într-un format structurat și pot fi exportate sau prelucrate în aplicații externe în versiuni viitoare. Sistemul este modular și permite adăugarea de noi funcționalități (ex. conectivitate WiFi, analiză statistică, integrare cu aplicații mobile). | + | Datele sunt gestionate într-un format structurat și pot fi exportate sau prelucrate în aplicații externe în versiuni viitoare. Sistemul este modular și permite adăugarea de noi funcționalități (ex. analiză statistică, integrare cu aplicații mobile). |
{{ :pm:prj2025:rnedelcu:alexandru.trifu2712:proiectpm.drawio.png?700 |}} | {{ :pm:prj2025:rnedelcu:alexandru.trifu2712:proiectpm.drawio.png?700 |}} | ||
Line 29: | Line 28: | ||
**Componente:** | **Componente:** | ||
- | * ESP32 DevKit C | + | * ESP32 WROOM32 |
- | * Display TFT SPI 2.4" cu touch | + | * Display TFT SPI 2.4" ST7789 |
* Modul microSD Card | * Modul microSD Card | ||
- | * Microfon | + | * Microfon INMP441 |
- | * Buton fizic / touch sensor | + | |
- | * Buzzer piezo | + | |
* Acumulator Li-ion 18650 + modul TP4056 | * Acumulator Li-ion 18650 + modul TP4056 | ||
- | * Breadboard | + | * Breadboard-uri |
**Interfețe hardware folosite:** | **Interfețe hardware folosite:** | ||
- | * GPIO – pentru butoane și buzzer | + | * GPIO – pentru controlul pinilor |
* SPI – pentru TFT și SD card | * SPI – pentru TFT și SD card | ||
- | * I2S / ADC – pentru captarea sunetului | + | * I2S – pentru captarea sunetului |
* Timere – pentru gestionarea timeout-urilor | * Timere – pentru gestionarea timeout-urilor | ||
* Întreruperi – pentru input eficient | * Întreruperi – pentru input eficient | ||
- | **Diagrama electrică și conexiunile** vor fi incluse în arhiva de descărcare. | + | **Conectivitate:** |
+ | |||
+ | ^ Modul ^ Semnal ^ ESP32 Pin ^ | ||
+ | | INMP441 | I2S SCK | GPIO33 | | ||
+ | | | I2S WS (LRCL) | GPIO25 | | ||
+ | | | I2S SD | GPIO32 | | ||
+ | | | VCC | 3.3V | | ||
+ | | | GND | GND | | ||
+ | |||
+ | ^ Modul ^ Semnal ^ ESP32 Pin ^ | ||
+ | | SD Card | CS | GPIO2 | | ||
+ | | | MOSI | GPIO13 | | ||
+ | | | MISO | GPIO12 | | ||
+ | | | SCK | GPIO14 | | ||
+ | | | VCC | 3.3V | | ||
+ | | | GND | GND | | ||
+ | |||
+ | ^ Modul ^ Semnal ^ ESP32 Pin ^ | ||
+ | | TFT Display | CS | GPIO5 | | ||
+ | | | MOSI | GPIO23 | | ||
+ | | | SCK | GPIO18 | | ||
+ | | | DC | GPIO21 | | ||
+ | | | RESET | GPIO22 | | ||
+ | | | BL (Backlight) | GPIO4 | | ||
+ | | | VCC | 3.3V/5V | | ||
+ | | | GND | GND | | ||
+ | |||
+ | {{:pm:prj2025:rnedelcu:whatsapp_image_2025-05-27_at_22.48.41.jpeg?700 |}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | **Mediu de dezvoltare:** | ||
+ | * Thonny | ||
+ | * Platforma de testare: ESP32 + MicroPython | ||
- | <note tip> | + | **Biblioteci utilizate:** |
- | Descrierea codului aplicaţiei (firmware): | + | * machine, network, urequests, json, time, gc, os |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
- | ===== Rezultate Obţinute ===== | + | **Implementare:** |
+ | * Clasa **WorkingSDCard** este responsabilă de gestionarea comunicației SPI software cu cardul SD, folosind transmisie bit cu bit (bit-banging) prin pini digitali. Aceasta implementează funcționalități de inițializare a cardului, trimitere de comenzi standard (CMD0, CMD8, CMD17, etc.), și scriere/citire blocuri de 512 bytes. | ||
+ | * Clasa **SimpleCoffeeFS** acționează ca un mini-sistem de fișiere, folosind un singur sector predefinit de pe cardul SD pentru a salva un jurnal cu ultimele cafele consumate. Structura fiecărei înregistrări conține timestamp-ul, numele cafenelei și tipul de cafea. Această clasă gestionează atât încărcarea datelor la pornire, cât și salvarea înregistrărilor noi, menținând un număr limitat de intrări pentru a nu depăși limita de memorie a unui sector. | ||
+ | <code python> | ||
+ | def add_entry(self, shop_name, coffee_type): | ||
+ | """Add coffee entry and save to SD card""" | ||
+ | try: | ||
+ | print(f"Adding coffee entry: {shop_name} - {coffee_type}") | ||
+ | |||
+ | # Add to memory first | ||
+ | timestamp = time.ticks_ms() | ||
+ | entry = { | ||
+ | 'timestamp': timestamp, | ||
+ | 'shop': shop_name, | ||
+ | 'coffee': coffee_type | ||
+ | } | ||
+ | |||
+ | self.entries.append(entry) | ||
+ | |||
+ | # Keep only recent entries to fit in one sector | ||
+ | if len(self.entries) > self.max_entries_per_sector: | ||
+ | self.entries = self.entries[-self.max_entries_per_sector:] | ||
+ | |||
+ | # Save to SD card | ||
+ | success = self._save_entries() | ||
+ | |||
+ | if success: | ||
+ | print(f"✅ Coffee entry saved to SD card!") | ||
+ | else: | ||
+ | print(f"⚠️ Entry saved to memory but SD write failed") | ||
+ | |||
+ | return True # Always return True since we have it in memory | ||
+ | |||
+ | except Exception as e: | ||
+ | print(f"❌ Error adding entry: {e}") | ||
+ | return False | ||
+ | </code> | ||
+ | * Funcțiile pentru randare pe ecran folosesc un font bitmap 8x8 stocat ca dicționar. Caracterele sunt desenate pixel cu pixel direct pe ecranul TFT prin funcții dedicate precum draw_large_char() și draw_large_char_line(). | ||
+ | * Pentru conectivitate, există **funcții de conectare la rețeaua WiFi** (connect_wifi) și de **trimitere a cererilor către API-ul OpenAI** (make_openai_request). Acestea permit dispozitivului să obțină sugestii inteligente pe baza jurnalului de cafea, folosind modelul GPT. Cererile sunt trimise în format JSON și răspunsul este extras și afișat într-un mod ușor de parcurs. | ||
+ | <code python> | ||
+ | def connect_wifi(): | ||
+ | """Connect to WiFi""" | ||
+ | print("Connecting to WiFi...") | ||
+ | |||
+ | wlan = network.WLAN(network.STA_IF) | ||
+ | wlan.active(True) | ||
+ | |||
+ | if not wlan.isconnected(): | ||
+ | print(f"Connecting to {WIFI_SSID}...") | ||
+ | wlan.connect(WIFI_SSID, WIFI_PASSWORD) | ||
+ | |||
+ | timeout = 15 | ||
+ | while not wlan.isconnected() and timeout > 0: | ||
+ | print(f"Waiting... {timeout}s") | ||
+ | time.sleep(1) | ||
+ | timeout -= 1 | ||
+ | |||
+ | if wlan.isconnected(): | ||
+ | print("WiFi connected!") | ||
+ | print(f"IP: {wlan.ifconfig()[0]}") | ||
+ | return True | ||
+ | else: | ||
+ | print("WiFi connection failed!") | ||
+ | return False | ||
+ | else: | ||
+ | print("Already connected") | ||
+ | return True | ||
+ | </code> | ||
+ | * Interfața aplicației este implementată prin funcții care gestionează **meniurile, logarea, afișarea intrărilor și recomandările AI**. Funcții precum show_coffee_menu(), log_coffee_entry(), view_coffee_logs() și get_coffee_recommendation() definesc fluxul principal al aplicației, cu o interfață simplă, intuitivă și adaptată limitărilor hardware. | ||
- | <note tip> | + | ===== Rezultate Obținute ===== |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
- | ===== Concluzii ===== | + | * Dispozitivul este capabil să logheze cafele offline pe SD Card, păstrând persistența datelor la repornire. |
- | ===== Download ===== | + | * Răspunsuri corecte și relevante de la OpenAI pe baza jurnalului de cafele. |
- | <note warning> | + | * Afișare grafică completă: meniu, text, recomandări scrollabile. |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
- | 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**. | + | * Modularitate bună pentru extensii viitoare (cloud sync, voice, statistici). |
- | </note> | + | |
- | ===== Jurnal ===== | + | ===== Concluzii ===== |
+ | |||
+ | BrewMate demonstrează că un sistem embedded poate oferi o experiență interactivă și personalizată, integrând funcții moderne de AI într-o interfață minimalistă. Dispozitivul are potențial real pentru dezvoltare într-un produs comercial pentru pasionații de cafea și entuziaști tech deopotrivă. | ||
+ | |||
+ | ===== Download ===== | ||
+ | |||
+ | Software-ul este disponibil aici: [[https://github.com/alexandrutrifu/BrewMatePM|]] | ||
- | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
- | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
<note> | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | **Resurse Software:** |
+ | * [[https://techtotinker.com/2021/04/08/024-esp32-micropython-how-to-use-sd-card-in-micropython/|]] | ||
+ | * [[https://randomnerdtutorials.com/getting-started-thonny-micropython-python-ide-esp32-esp8266/|]] | ||
+ | * [[https://micropython-stubs.readthedocs.io/en/main/11_install_stubs.html|]] | ||
+ | |||
+ | **Resurse Hardware:** | ||
+ | * [[https://invensense.tdk.com/wp-content/uploads/2015/02/INMP441.pdf|]] | ||
+ | * [[https://www.instructables.com/ESP32-Mic-Testing-With-INMP441-and-DumbDisplay/|]] | ||
+ | * [[https://randomnerdtutorials.com/esp32-tft-touchscreen-display-2-8-ili9341-arduino/|]] | ||
+ | * [[https://www.electronicwings.com/esp32/microsd-card-interfacing-with-esp32|]] | ||
+ | * [[https://www.youtube.com/watch?v=rq5yPJbX_uk|]] | ||
+ | * [[https://lastminuteengineers.com/arduino-micro-sd-card-module-tutorial/|]] | ||
+ | |||
</note> | </note> | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||