Contact: Florin-Răzvan Mihalache
Proiectul urmărește crearea unui music player cu lumini colorate, culori bazate pe genul și tipul melodiei difuzate la un moment dat.
Pentru a destinde atmosfera într-o cameră, de regulă se pune muzică pentru a crea o atmosferă plăcută, deseori combinația făcându-se cu lumini colorate pentru a accentua stările emoționale generate de muzică. Astfel, m-am gândit la un music player, cu lumini colorate în funcție de tipul melodiei care este pusă pe play.
Piesă | |
---|---|
Placa de bază PM 2019 | Lipită la laborator |
LED-uri RGB | Va fi colorată în funcție de melodie |
Cablu USB | Folosit pentru a pune cod pe placă |
Fire mamă-mamă, tată-tată și tată-mamă | Folosite pentru conectarea componentelor |
Breadboard | Folosit pentru conectarea componentelor |
LCD 2 x 16 | Folosit pentru afișarea melodiei puse pe play |
Speaker audio | Folosit pentru difuzarea melodiei |
Potentiometru | Folosit pentru reglarea tensiunii la LCD |
Pentru afișarea mesajului pe LCD m-am folosit de codul din laboratorul 1 (lcd.c), iar pentru difuzarea de sunete m-am folosit de codul din laboratoarele 3 și 4.
In fișierul test.c am scris codul pentru iluminarea led-urilor RGB, două leduri neavând aceeași culoare aprinsă în același moment, am lăsat ca cele trei led-uri sa se aprindă în culori diferite (roșu-verde-albastru, un led cu culoarea lui).
int main() { DDRD |= (1 << PD7); LCD_init(); int nota = 0, firstB = 1, firstD = 1, firstA = 1; int ok = 0, current_colorB = RED, current_colorD = GREEN, current_colorA = BLUE; long switchColorB = 0, switchColorD = 0, switchColorA = 0; int isColorSwitchedB = 0, isColorSwitchedD = 0, isColorSwitchedA = 0; int i = 0, j = 0, increment_note = 0; int if_changed_j = 0, if_changed_i = 0; initLeds(); // inițializez ledurile for (;;) { // dacă s-a schimbat melodia, facem update la LCD (ștergem titlul melodiei precedente) if (if_changed_i) { if_changed_i = 0; LCD_clear_top_line(); LCD_clear_bottom_line(); } // afișăm melodia și artistul LCD_printAt(0x00, messages[i][0]); LCD_printAt(0x40, messages[i][1]); // se redă nota din melodia curentă speaker_reda(notes[i][j]); ++increment_note; // un trick ca să avem nota lungă if (increment_note == CHANGE_NOTE) { ++j; if (j == NOTES) { j = 0; if_changed_i = 1; ++i; } if (i == 4) i = 0; increment_note = 0; } // port B // aici ne ocupăm de schimbarea culorii pe un led, mai exact când trebuie să se schimbe culoarea led-ului ++switchColorB; if (switchColorB == SWITCH_1 && current_colorB == RED) { isColorSwitchedB = 1; current_colorB = GREEN; } else if (switchColorB == SWITCH_2 && current_colorB == GREEN) { isColorSwitchedB = 1; current_colorB = BLUE; } else if (switchColorB == SWITCH_3 && current_colorB == BLUE) { switchColorB = 0; isColorSwitchedB = 1; current_colorB = RED; } // aici schimbăm culoarea curentă pe un led if ((current_colorB == RED && isColorSwitchedB) || (current_colorB == RED && firstB)) { if (!firstB) { PORT_LED_BLUE_B &= ~(1 << LED_BLUE_B); } firstB = 0; PORT_LED_RED_B |= (1 << LED_RED_B); isColorSwitchedB = 0; } else if (current_colorB == GREEN && isColorSwitchedB) { PORT_LED_RED_B &= ~(1 << LED_RED_B); PORT_LED_GREEN_B |= (1 << LED_GREEN_B); isColorSwitchedB = 0; } else if (current_colorB == BLUE && isColorSwitchedB) { PORT_LED_GREEN_B &= ~(1 << LED_GREEN_B); PORT_LED_BLUE_B |= (1 << LED_BLUE_B); isColorSwitchedB = 0; } // port D ++switchColorD; if (switchColorD == SWITCH_1 && current_colorD == BLUE) { isColorSwitchedD = 1; current_colorD = RED; } else if (switchColorD == SWITCH_2 && current_colorD == RED) { isColorSwitchedD = 1; current_colorD = GREEN; } else if (switchColorD == SWITCH_3 && current_colorD == GREEN) { switchColorD = 0; isColorSwitchedD = 1; current_colorD = BLUE; } if (current_colorD == RED && isColorSwitchedD) { PORT_LED_BLUE_D &= ~(1 << LED_BLUE_D); PORT_LED_RED_D |= (1 << LED_RED_D); //current_colorB = GREEN; isColorSwitchedD = 0; } else if ((current_colorD == GREEN && isColorSwitchedD) || (current_colorD == GREEN && firstD)) { if (!firstD) { PORT_LED_RED_D &= ~(1 << LED_RED_D); } firstD = 0; PORT_LED_GREEN_D |= (1 << LED_GREEN_D); //current_colorB = BLUE; isColorSwitchedD = 0; } else if (current_colorD == BLUE && isColorSwitchedD) { PORT_LED_GREEN_D &= ~(1 << LED_GREEN_D); PORT_LED_BLUE_D |= (1 << LED_BLUE_D); //current_colorB = RED; isColorSwitchedD = 0; } // port A ++switchColorA; if (switchColorA == SWITCH_1 && current_colorA == GREEN) { isColorSwitchedA = 1; current_colorA = BLUE; } else if (switchColorA == SWITCH_2 && current_colorA == BLUE) { isColorSwitchedA = 1; current_colorA = RED; } else if (switchColorA == SWITCH_3 && current_colorA == RED) { switchColorA = 0; isColorSwitchedA = 1; current_colorA = GREEN; } if (current_colorA == RED && isColorSwitchedA) { PORT_LED_BLUE_A &= ~(1 << LED_BLUE_A); PORT_LED_RED_A |= (1 << LED_RED_A); //current_colorB = GREEN; isColorSwitchedA = 0; } else if (current_colorA == GREEN && isColorSwitchedA) { PORT_LED_RED_A &= ~(1 << LED_RED_A); PORT_LED_GREEN_A |= (1 << LED_GREEN_A); //current_colorB = BLUE; isColorSwitchedA = 0; } else if ((current_colorA == BLUE && isColorSwitchedA) || (current_colorA == BLUE && firstA)) { if (!firstA) { PORT_LED_GREEN_A &= ~(1 << LED_GREEN_A); } firstA = 0; PORT_LED_BLUE_A |= (1 << LED_BLUE_A); //current_colorB = RED; isColorSwitchedA = 0; firstA = 0; } } return 0; }
Demonstrație video: Th0aVgNW_TU
10 aprilie - 18 mai - comandarea de piese pentru proiect (Optimus Digital) și lipirea componentelor pe placa de bază
13 mai - punerea de bootloader pe placa de bază
18 - 22 mai - proiectarea hardware
23 mai - codarea proiectului și finisarea proiectării hardware
Din lipsă de timp, nu am reușit sa îmi ating pe deplin scopul (să fac ledurile să se aprindă în mod inteligent), inițial voiam să iau melodiile de pe un card SD, dar nu am mai apucat sa continui cum mi-am propus (nu mergea să citesc de pe card) și am decis să fac sunete din cod (sa hardcodez melodii), speaker-ul se aude destul de încet și nu am mai avut timp să iau altul si să vad cum se configurează. Însă proiectul a părut destul de interesant și provocator, în sensul că noi ne faceam configurația hardware și codul pentru funcționarea părții hardware.
Codul sursă: Music-Player