This shows you the differences between two versions of the page.
pm:prj2023:apredescu:karaoke-machine [2023/05/29 23:49] andrei.otetea [Descriere generală] |
pm:prj2023:apredescu:karaoke-machine [2023/05/30 00:33] (current) andrei.otetea [Software Design] |
||
---|---|---|---|
Line 13: | Line 13: | ||
Utilizatorul stochează melodiile în formatul WAV și versurile în formatul LRC. La introducerea cardului de memorie în slot, utilizatorul vede pe ecranul LCD melodia curentă și o poate schimba folosind butonul next. De asemenea, cu butonul play/pause poate continua reluarea melodiei, respectiv poate pune pauză la melodia curentă. În plus, butonul on/off mic pornește/oprește microfonul. | Utilizatorul stochează melodiile în formatul WAV și versurile în formatul LRC. La introducerea cardului de memorie în slot, utilizatorul vede pe ecranul LCD melodia curentă și o poate schimba folosind butonul next. De asemenea, cu butonul play/pause poate continua reluarea melodiei, respectiv poate pune pauză la melodia curentă. În plus, butonul on/off mic pornește/oprește microfonul. | ||
- | Pe ecranul LCD o să apară versurile curente, iar utilizatorul va putea folosi microfonul pentru a obține puncte, dacă cântă în timp ce apar versurile. Scorul este cu atât mai mare cu cât cântă mai tare. Utilizatorul poate obtine puncte daca ruleaza o melodie si daca acesta are microfonul pornit. | + | Pe ecranul LCD o să apară versurile curente, iar utilizatorul va putea folosi microfonul pentru a obține puncte, dacă cântă în timp ce apar versurile. Scorul este cu atât mai mare cu cât cântă mai tare. Utilizatorul poate obține puncte dacă rulează o melodie și dacă acesta are microfonul pornit. |
Melodia se va auzi pe o boxă, sunetul fiind amplificat. | Melodia se va auzi pe o boxă, sunetul fiind amplificat. | ||
Line 31: | Line 31: | ||
{{:pm:prj2023:apredescu:pm-schema-electrica-2-andrei-otetea.png?1000|}} | {{:pm:prj2023:apredescu:pm-schema-electrica-2-andrei-otetea.png?1000|}} | ||
+ | |||
+ | {{:pm:prj2023:apredescu:poza_proiect_karaoke_machine.jpg?500|}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
Line 40: | Line 42: | ||
* **void setup()**- Setez seriala pe 9600 baud, inițializez obiectele TMRpcm și SdFat, inițializez LCD-ul și configurez întreruperile pentru Timer2 la 10ms. | * **void setup()**- Setez seriala pe 9600 baud, inițializez obiectele TMRpcm și SdFat, inițializez LCD-ul și configurez întreruperile pentru Timer2 la 10ms. | ||
* **ISR(TIMER2_COMPA_vect)** - o dată la 10ms, atunci când e cazul, cresc timpul trecut din melodie si actualizez scorul | * **ISR(TIMER2_COMPA_vect)** - o dată la 10ms, atunci când e cazul, cresc timpul trecut din melodie si actualizez scorul | ||
- | * **void loop()**- verific dacă oricare dintre butoane sunt apăsate, dacă nu e pauză verific dacă ar trebui modificat textul de pe LCD și, dacă primesc comanda **S** pe serială afișez scorul curent | + | * **void loop()**- verific dacă oricare dintre butoane sunt apăsate, dacă nu e pauză verific dacă ar trebui modificat textul de pe LCD și citesc noul text care ar trebui afișat pe LCD, și, dacă primesc comanda **S** pe serială afișez scorul curent |
* **void displayTextOnLCD(const char* text)** - afișează textul primit pe ambele linii ale LCD-ului | * **void displayTextOnLCD(const char* text)** - afișează textul primit pe ambele linii ale LCD-ului | ||
* **bool isWAV(const char* filename)** - verifică dacă un fișier are extensia .wav. | * **bool isWAV(const char* filename)** - verifică dacă un fișier are extensia .wav. | ||
Line 47: | Line 49: | ||
* **unsigned long parseTimestamp(const char* timestampStr)** - transformă un string ce conține ora în formatul MM:SS.MM în milisecunde. | * **unsigned long parseTimestamp(const char* timestampStr)** - transformă un string ce conține ora în formatul MM:SS.MM în milisecunde. | ||
* **void performAction(int buttonIndex)** - în funcție de butonul apăsat, execută acțiunea asociată lui | * **void performAction(int buttonIndex)** - în funcție de butonul apăsat, execută acțiunea asociată lui | ||
+ | * mic on/off | ||
+ | * pause/play | ||
+ | * next - de fiecare dată când apăs next trec la următoarea melodie de pe cardul microSD. Dacă am epuizat toate melodiile, o iau de la început. De asemenea, deschid și fișierul cu lyrics, folosind același basename, schimbând doar extensia și afișez pe LCD titlul melodiei curente | ||
Ca să pot folosi biblioteca TMRpcm a trebuit sa modific in fișierul de configurare **pcmConfig.h** sa decomentez urmatoarele: | Ca să pot folosi biblioteca TMRpcm a trebuit sa modific in fișierul de configurare **pcmConfig.h** sa decomentez urmatoarele: | ||
* **#define SD_FULLSPEED** - ca sa citesc cât mai repede | * **#define SD_FULLSPEED** - ca sa citesc cât mai repede | ||
- | * **#define SDFAT** - ca sa pot folosi împreună cu biblioteca sdFat | + | * **#define SDFAT** - ca sa pot folosi împreună cu biblioteca SdFat |
* **#define buffSize 128** - am crescut buffer-ul | * **#define buffSize 128** - am crescut buffer-ul | ||
+ | |||
+ | === Setup date microSD === | ||
- | Pentru a stoca fișierele am ales formatul WAV și am comprimat fișierele cu următoarele setări pe site-ul [[https://audio.online-convert.com/convert-to-wav]]: | + | Pentru a stoca fișierele audio am ales formatul WAV și am comprimat fișierele cu următoarele setări pe site-ul [[https://audio.online-convert.com/convert-to-wav]]: |
- | * Bit resolution: 8 Bit | + | * Rezoluție biți: 8 Bit |
- | * Sampling rate: 16000 Hz | + | * Rata de eșantionare: 16000 Hz |
- | * Audio channels: mono | + | * Canale audio: mono |
- | * PCM format: PCM unsigned 8-bit | + | * Format PCM: PCM U8 |
- | Fișierele LRC stochează versurile în acest format: | + | Pentru a stoca lyrics am folosit fișiere LRC; acestea stochează versurile în acest format: |
[00:33.95]We are the champions, my friends | [00:33.95]We are the champions, my friends |