This is an old revision of the document!


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:

  • Arduino Uno R3
  • WS2812B 8×8 LED Matrix
  • Breadboard
  • Potentiometru
  • Buzzer
  • Modul card SD
  • Fire, butoane etc

Software Design

Codul sursă poate 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.

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

TBD

Concluzii

TBD

Download

pm/prj2023/danield/musical-xmas-lights.1685289463.txt.gz · Last modified: 2023/05/28 18:57 by roxana.popa2703
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0