Table of Contents

Musical Christmas Lights

Introducere

Proiectul are ca scop realizarea unui ansamblu luminos insotit de acompaniament muzical care poate fi folosit ca decoratie de Crăciun. Deoarece are și un sistem audio încorporat, nu mai este nevoie de dispozitive separate pentru o atmosferă festivă. Ideea acestui proiect a pornit de la situațiile în care la o petrecere există aranjament de lumini adecvat, dar nu există echipament audio și invers.

Proiectul are la bază o matrice de LED-uri controlată prin Arduino care luminează într-un pattern prestabilit. User-ul poate schimba pattern-ul de aprindere printr-un buton și luminozitatea LED-urilor cu ajutorul unui potențiometru. Atașat la acest ansamblu se găsește și un difuzor audio care redă o melodie citită dintr-un card SD. Melodia este una prestabilită, care se poate schimba printr-un buton.

Descriere generală

Hardware Design

Piese folosite:

Software Design

Codul sursă se găsește aici: musical_xmas_lights.zip

Detalii de implementare:

În funcția setup() se seteaza pinii, se configurează întreruperile și se inițializează parametrii matricei de LED-uri. Tot aici se inițializează cardul SD și se citesc cele 3 cântece care vor fi redate de buzzer.

În funcția loop() se controlează matricea de LED-uri și buzzer-ul. Inițial se pornește cu un pattern de lumini și un cântec predefinite care pot fi schimbate prin apăsarea butoanelor NEXT, PAUSE, BACK și butonul asignat matricei. Apăsarea butoanelor modifică variabilele song_num și matrix_opt care rețin numărul melodiei și al pattern-ului de lumini. Apăsarea butoanelor declanșează întreruperi de tip PIN Change, în interiorul cărora se actualizează variabilele. Tot aici se citește input-ul dat de potențiometru pentru a determina intensitatea luminii LED-urilor.

Pattern-urile de lumini folosite sunt definite în fișierele header incluse și sunt definite în librăria FastLED. Cântecele pentru buzzer sunt definite sub forma unor vectori de perechi (notă, durată) care sunt citiți la începutul execuției. Pentru a reda cântecele, am definit funcția playSong() care citește nota și durata sa și stabilește parametrii necesari pentru metoda tone():

Code snippet din funcția playSong():

int wholenote = (60000 * 4) / 140;
int divider = 0, noteDuration = 0;
for (int thisNote = 0; thisNote < size * 2 && !pause; thisNote = thisNote + 2) {
  lightMatrix(val);
  divider = melody[thisNote + 1];
  if (divider > 0) {
    noteDuration = (wholenote) / divider;
  } else if (divider < 0) {
    noteDuration = (wholenote) / abs(divider);
    noteDuration *= 1.5; 
  }
  tone(BUZZER_PIN, melody[thisNote], noteDuration*0.9);
  delay(noteDuration);
  noTone(BUZZER_PIN);
  lightMatrix(val);
}

Dacă este apăsat butonul de pauză, se setează un fapt care indică acest lucru și cântecul se oprește. Matricea de LED-uri se updatează în funcția playSong() pentru a asigura sincronizarea cu cântecul. Dacă cântecul este oprit, pattern-ul de lumini va continua într-un ritm predefinit.

Rezultate Obţinute

Pentru demo, ne vedem la PM Fair =) .

Concluzii

Acest proiect a fost primul proiect hardware pe care l-am realizat și m-a ajutat foarte mult să-mi dezvolt abilitățile de lucru cu hardware. Totodată, m-a ajutat să-mi dezvolt abilitățile de organizare și documentare a procesului de proiectare și dezvoltare.

Download

Codul sursă se găsește aici: musical_xmas_lights.zip

Export to PDF