Table of Contents

Lighting Music Player

Contact: Florin-Răzvan Mihalache

Introducere

Proiectul urmărește crearea unui music player cu lumini colorate, culori bazate pe genul și tipul melodiei difuzate la un moment dat.

Descriere

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.

Schema bloc

Schema electrică

Lista de piese

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

Proiectarea software

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;
}

Rezultate obținute

Demonstrație video: Th0aVgNW_TU

Jurnal

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

Concluzii

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.

Download

Codul sursă: Music-Player

Bibliografie/Resurse

light-music-player