Arduino Christmas lights (14 / 14 steg)

Steg 14: programvara

Jag kommer att säga jag fick min start av denna timing från vissa andra webbsida. Jag kan inte hitta där jag fick den, och var tvungen att göra en hel del förändringar ändå, så jag läsa in den här. När du har detta är det mycket enkelt att skapa ett program för någon låt... men om du är lik mig du bättre på tekniska ledningarna och programmering än du matchar dansar lampor på musik... så har en utgångspunkt är en stor hjälp.

Så är här koden. Återigen är det koden för glädjen till filen världen. Den version jag laddade upp är MP3, men om du använder våg skölden det måste konverteras till WAV.

Dessutom fick jag trött på att ta itu med mycket lång kod för lampor i slingan, så jag gjorde det en funktion, kallad "joy()".
Här är Arduino koden:

Av: Tre "Landrum
#include
#include
#include
#include "WaveUtil.h"
#include "WaveHC.h"

SdReader kort; Detta objekt innehåller information för kortet
FatVolume vol; Detta innehåller information för partitionen på kortet
FatReader rot. Detta innehåller information för filsystemet på kortet
FatReader f; Detta innehåller information för filen vi är spelar

WaveHC våg; Detta är enda våg (audio)-objektet, eftersom vi bara kommer att spela en i taget

#define DÄMPNINGSTID 5 / / knappen debouncer

Detta är för den dansande ljus under glädjen till världen
Om du använder Uno i stället för Mega måste du ändra dessa stift. Om du använder WaveShield har du bara några stift avaialbe... 6-9 från toppen av mitt huvud.
int light1 = 22.
int undersökningen2 = 24.
int light3 = 26.
int light4 = 28;
int light5 = 30.
int light6 = 32.
int light7 = 34.
int light8 = 36.
int s = 150;
int ds = 225;
int e = 300;
int de = 450;
int q = 600; 600
int dq = 900;
int h = 0; 1200
int dh = 1800;
int start;
int slutet;
int tid;
int nu;

Variabler som ändras:

här är där vi definiera de knappar som vi använder. knapp "1" är först, "6"-knappen är den 6: e, etc
byte knappar [] = {14, 15, 16, 17, 18, 19};
Denna behändiga makro låter oss att avgöra hur stor matrisen upp ovan är, genom att kontrollera storleken
#define NUMBUTTONS sizeof(buttons)
Vi kommer att följa upp om en knapp trycks bara, bara släppt eller "tryckte" (nuvarande staten
flyktiga byte tryckte [NUMBUTTONS], justpressed [NUMBUTTONS], justreleased [NUMBUTTONS];

Denna behändiga funktionen returnerar antalet byte för närvarande gratis i RAM, bra för felsökning!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
om ((int) __brkval == 0) {
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
annat {
free_memory = ((int) & free_memory)-((int) __brkval);
}
återvända free_memory;
}

void sdErrorCheck(void)
{
om (! card.errorCode()) återvända;
putstring ("\n\rSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
While(1);
}

void setup() {
byte i.

Ställ in serieporten
Serial.BEGIN(9600);
putstring_nl ("WaveHC med");
Serial.Print (NUMBUTTONS, DEC);
putstring_nl("buttons");

putstring ("fri slå ned:"); Detta kan hjälpa till med felsökning, slut RAM är dålig
Serial.println(freeRam()); om detta är under 150 byte kan det stava problem!

Ställa in produktionen stift för DAC kontroll. Detta stift definieras i biblioteket
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);

pin13 LED
pinMode (13, OUTPUT);

Gör ingång & aktiverar pull-up motstånd på switch pins
för (jag = 0; jag < NUMBUTTONS; i ++) {
pinMode (knapparna [i], ingång);
digitalWrite (knappar [i], hög);
}

om (! card.init(true)) {//play med 4 MHz spi om 8MHz inte fungerar för dig
om (! card.init()) {//play med 8 MHz spi (standard snabbare!)
putstring_nl ("kort init. misslyckades!"); Något gick fel, kan skriva ut varför
sdErrorCheck();
While(1); sedan 'stoppa' - gör ingenting!
}

Aktivera optimera Läs - vissa kort kan timeout. Inaktivera om du har problem
card.partialBlockRead(true);

Nu söker vi en FAT-partition!
uint8_t del;
för (del = 0; del < 5; del ++) {/ / vi har upp till 5 platser att titta i
om (vol.init (kort, del))
bryta; Vi hittade en, låter borgen
}
om (del == 5) {/ / om vi slutade inte att hitta en :(
putstring_nl ("ingen giltig FAT-partition!");
sdErrorCheck(); Något gick fel, kan skriva ut varför
While(1); sedan 'stoppa' - gör ingenting!
}

Kan tala om för användaren om vad vi hittade
putstring ("använda partition");
Serial.Print (del, DEC);
putstring (", typ är FAT");
Serial.println(Vol.fatType(),dec); FAT16 eller FAT32?

Försök öppna rotkatalogen
om (! root.openRoot(vol)) {
putstring_nl kan inte ("öppna rotfästa dir!"); Något gick fel,
While(1); sedan 'stoppa' - gör ingenting!
}

Usch! Vi fick tidigare de hårda delarna.
putstring_nl("ready!");

TCCR2A = 0;
TCCR2B = 1 <
Timer2 spill Interrupt Enable
TIMSK2 | = 1 <
pinMode (light1, produktionen);
pinMode (undersökningen2, produktionen);
pinMode (light3, produktionen);
pinMode (light4, produktionen);
pinMode (light5, produktionen);
pinMode (light6, produktionen);
pinMode (light7, produktionen);
pinMode (light8, produktionen);

SainSmart relä är av hög
digitalWrite(light1,HIGH);
digitalWrite(light2,HIGH);
digitalWrite(light3,HIGH);
digitalWrite(light4,HIGH);
digitalWrite(light5,HIGH);
digitalWrite(light6,HIGH);
digitalWrite(light7,HIGH);
digitalWrite(light8,HIGH);
Serial.BEGIN(9600);

} //void setup()

SIGNAL(TIMER2_OVF_vect) {
check_switches();
}

void check_switches()
{
statiska byte previousstate [NUMBUTTONS];
statiska byte currentstate [NUMBUTTONS];
byte index.

för (index = 0; index < NUMBUTTONS; index ++) {
CurrentState [index] = digitalRead(buttons[index]); Läs på-knappen

/*
Serial.Print (index, DEC).
Serial.Print (": cstate =");
Serial.Print (currentstate [index], DEC);
Serial.Print (", pstate =");
Serial.Print (previousstate [index], DEC);
Serial.Print (", tryck =");
*/

om (currentstate [index] == previousstate[index]) {
om ((tryckte [index] == låg) & & (currentstate [index] == låg)) {
bara tryckte
justpressed [index] = 1;
}
annars om ((tryckte [index] == hög) & & (currentstate [index] == hög)) {
precis släppt
justreleased [index] = 1;
}
tryckte [index] =! currentstate [index]; kom ihåg att digital hög betyder inte intryckt
}
Serial.println (pressad [index], DEC);
previousstate [index] = currentstate [index]; hålla en kör stämmer av knappar
}
}

//**********************************************************************************************************
//**********************************************************************************************************

void loop() {
byte i.

Se till att du ändrar namnet på filen till vad du vill
playfile ("JOY. WAV");

Joy(); Detta är den funktion som spelar glädje till världen

} //void loop() {

//**********************************************************************************************************
//**********************************************************************************************************

Spelar en full fil från början till slut med ingen paus.
void playcomplete(char *name) {
Ring vår hjälpare för att hitta och spela detta namn
playfile(Name);
samtidigt (wave.isplaying) {
göra ingenting samtidigt dess spelar
}
dess gjort spelar nu
}

void playfile(char *name) {
se om objektet våg för närvarande gör något
om (wave.isplaying) {/ / redan spelar något, så sluta det!
Wave.stop(); Sluta
}
titta i rotkatalogen och öppna filen
om (! f.open (rot, namn)) {
putstring kunde inte ("öppna filen"); Serial.Print(Name); hemkomst.
}
OK läsa filen och förvandla det till en våg objekt
om (! wave.create(f)) {
putstring_nl ("inte en giltig WAV"); hemkomst.
}

OK dags att spela! starta uppspelningen
Wave.Play();
}

Funktion för att göra de olika arbetsområdena ljus olika
void joy() {

putstring_nl ("Start av glädje till världen");

Start = millis();
digitalWrite (light1, låg);
digitalWrite (light8, låg);
Delay(q);
digitalWrite (light1, hög);
digitalWrite (light8, hög);

digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
Delay(de);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);

digitalWrite (light3, låg);
digitalWrite (light6, låg);
Delay(s);
digitalWrite (light3, hög);
digitalWrite (light6, hög);

digitalWrite (light4, låg);
digitalWrite (light5, låg);
Delay(1050);
digitalWrite (light4, hög);
digitalWrite (light5, hög);

digitalWrite (light1, låg);
digitalWrite (light8, låg);
Delay(s);
digitalWrite (light1, hög);
digitalWrite (light8, hög);

digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
Delay(q);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);

digitalWrite (light3, låg);
digitalWrite (light6, låg);
Delay(q);
digitalWrite (light3, hög);
digitalWrite (light6, hög);

digitalWrite (light4, låg);
digitalWrite (light5, låg);
Delay(dQ);
digitalWrite (light4, hög);
digitalWrite (light5, hög);

digitalWrite (light1, låg);
digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
digitalWrite (light8, låg);
Delay(e);
digitalWrite (light1, hög);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);
digitalWrite (light8, hög);

digitalWrite (undersökningen2, låg);
digitalWrite (light3, låg);
digitalWrite (light6, låg);
digitalWrite (light7, låg);
Delay(dQ);
digitalWrite (undersökningen2, hög);
digitalWrite (light3, hög);
digitalWrite (light6, hög);
digitalWrite (light7, hög);

digitalWrite (light1, låg);
digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
digitalWrite (light8, låg);
Delay(e);
digitalWrite (light1, hög);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);
digitalWrite (light8, hög);

digitalWrite (light3, låg);
digitalWrite (light4, låg);
digitalWrite (light5, låg);
digitalWrite (light6, låg);
Delay(dQ);
digitalWrite (light3, hög);
digitalWrite (light4, hög);
digitalWrite (light5, hög);
digitalWrite (light6, hög);

digitalWrite (light1, låg);
digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
digitalWrite (light8, låg);
Delay(e);
digitalWrite (light1, hög);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);
digitalWrite (light8, hög);

digitalWrite (light1, låg);
digitalWrite (undersökningen2, låg);
digitalWrite (light3, låg);
digitalWrite (light4, låg);
digitalWrite (light5, låg);
digitalWrite (light6, låg);
digitalWrite (light7, låg);
digitalWrite (light8, låg);
Delay(dQ);
digitalWrite (light1, hög);
digitalWrite (undersökningen2, hög);
digitalWrite (light3, hög);
digitalWrite (light4, hög);
digitalWrite (light5, hög);
digitalWrite (light6, hög);
digitalWrite (light7, hög);
digitalWrite (light8, hög);
8100

digitalWrite (light8, låg);
Delay(e);
digitalWrite (light8, hög);

digitalWrite (light1, låg);
Delay(e);
digitalWrite (light1, hög);

digitalWrite (light7, låg);
Delay(e);
digitalWrite (light7, hög);

digitalWrite (undersökningen2, låg);
Delay(e);
digitalWrite (undersökningen2, hög);

digitalWrite (light6, låg);
Delay(e);
digitalWrite (light6, hög);

digitalWrite (light3, låg);
Delay(de);
digitalWrite (light3, hög);

digitalWrite (light5, låg);
Delay(s);
digitalWrite (light5, hög);

digitalWrite (light4, låg);
Delay(e);
digitalWrite (light4, hög);

digitalWrite (light8, låg);
Delay(e);
digitalWrite (light8, hög);

digitalWrite (light1, låg);
Delay(e);
digitalWrite (light1, hög);

digitalWrite (light7, låg);
Delay(e);
digitalWrite (light7, hög);

digitalWrite (undersökningen2, låg);
Delay(e);
digitalWrite (undersökningen2, hög);

digitalWrite (light6, låg);
Delay(e);
digitalWrite (light6, hög);

digitalWrite (light3, låg);
Delay(de);
digitalWrite (light3, hög);

digitalWrite (light5, låg);
Delay(s);
digitalWrite (light5, hög);

digitalWrite (light4, låg);
Delay(e);
digitalWrite (light4, hög);

digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
Delay(e);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);

digitalWrite (light1, låg);
digitalWrite (light8, låg);
Delay(e);
digitalWrite (light1, hög);
digitalWrite (light8, hög);

digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
Delay(e);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);

13806

digitalWrite (light1, låg);
digitalWrite (light8, låg);
Delay(e);
digitalWrite (light1, hög);
digitalWrite (light8, hög);

digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
Delay(75);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);

digitalWrite (light3, låg);
digitalWrite (light6, låg);
Delay(75);
digitalWrite (light3, hög);
digitalWrite (light6, hög);

digitalWrite (light4, låg);
digitalWrite (light5, låg);
Delay(dQ);
digitalWrite (light4, hög);
digitalWrite (light5, hög);

digitalWrite (light4, låg);
digitalWrite (light5, låg);
Delay(75);
digitalWrite (light4, hög);
digitalWrite (light5, hög);
15235

digitalWrite (light3, låg);
digitalWrite (light6, låg);
Delay(75);
digitalWrite (light3, hög);
digitalWrite (light6, hög);

digitalWrite (light4, låg);
digitalWrite (light5, låg);
Delay(e);
digitalWrite (light4, hög);
digitalWrite (light5, hög);

digitalWrite (light3, låg);
digitalWrite (light6, låg);
Delay(e);
digitalWrite (light3, hög);
digitalWrite (light6, hög);

digitalWrite (light4, låg);
digitalWrite (light5, låg);
Delay(e);
digitalWrite (light4, hög);
digitalWrite (light5, hög);

digitalWrite (light3, låg);
digitalWrite (light6, låg);
Delay(75);
digitalWrite (light3, hög);
digitalWrite (light6, hög);

digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
Delay(75);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);

digitalWrite (light1, låg);
digitalWrite (light8, låg);
Delay(dQ);
digitalWrite (light1, hög);
digitalWrite (light8, hög);

digitalWrite (light1, låg);
digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
digitalWrite (light8, låg);
Delay(75);
digitalWrite (light1, hög);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);
digitalWrite (light8, hög);

17339

digitalWrite (undersökningen2, låg);
digitalWrite (light3, låg);
digitalWrite (light6, låg);
digitalWrite (light7, låg);
Delay(75);
digitalWrite (undersökningen2, hög);
digitalWrite (light3, hög);
digitalWrite (light6, hög);
digitalWrite (light7, hög);

digitalWrite (light3, låg);
digitalWrite (light4, låg);
digitalWrite (light5, låg);
digitalWrite (light6, låg);
Delay(e);
digitalWrite (light3, hög);
digitalWrite (light4, hög);
digitalWrite (light5, hög);
digitalWrite (light6, hög);

digitalWrite (light1, låg);
digitalWrite (undersökningen2, låg);
digitalWrite (light3, låg);
digitalWrite (light4, låg);
digitalWrite (light5, låg);
digitalWrite (light6, låg);
digitalWrite (light7, låg);
digitalWrite (light8, låg);
Delay(q);
digitalWrite (light1, hög);
digitalWrite (undersökningen2, hög);
digitalWrite (light3, hög);
digitalWrite (light4, hög);
digitalWrite (light5, hög);
digitalWrite (light6, hög);
digitalWrite (light7, hög);
digitalWrite (light8, hög);

18315

digitalWrite (light1, låg);
digitalWrite (light8, låg);
Delay(e);
digitalWrite (light1, hög);
digitalWrite (light8, hög);

digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
Delay(de);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);

digitalWrite (light3, låg);
digitalWrite (light6, låg);
Delay(s);
digitalWrite (light3, hög);
digitalWrite (light6, hög);

digitalWrite (light4, låg);
digitalWrite (light5, låg);
Delay(e);
digitalWrite (light4, hög);
digitalWrite (light5, hög);

digitalWrite (light3, låg);
digitalWrite (light6, låg);
Delay(e);
digitalWrite (light3, hög);
digitalWrite (light6, hög);

putstring_nl(""); 19817

digitalWrite (undersökningen2, låg);
digitalWrite (light7, låg);
Delay(300);//Delay(q);
digitalWrite (undersökningen2, hög);
digitalWrite (light7, hög);

nu = millis();
tid = nu - börja;
Serial.println(Time); 20117

digitalWrite (light1, låg);
digitalWrite (light8, låg);
Delay(300);//Delay(q);
digitalWrite (light1, hög);
digitalWrite (light8, hög);

putstring_nl ("sista bit");
21018

digitalWrite (light1, låg);
digitalWrite (undersökningen2, låg);
digitalWrite (light3, låg);
digitalWrite (light4, låg);
digitalWrite (light5, låg);
digitalWrite (light6, låg);
digitalWrite (light7, låg);
digitalWrite (light8, låg);
Delay(h);
digitalWrite (light1, hög);
digitalWrite (undersökningen2, hög);
digitalWrite (light3, hög);
digitalWrite (light4, hög);
digitalWrite (light5, hög);
digitalWrite (light6, hög);
digitalWrite (light7, hög);
digitalWrite (light8, hög);
Delay(000);

putstring_nl ("slutet av sången");
slut = millis();
tid = end - start;
Serial.println(Time);
Serial.println(start);
Serial.println(End);
}

Se Steg
Relaterade Ämnen

Arduino Christmas Light Controller

om du gillade detta instructable, överväga att kolla min nDu har förmodligen sett alla dessa videor där människor gör det julbelysning dansa till musik, du tror att din egen wow som ser riktigt cool... jag kunde aldrig göra det. Tja... du kan tanken...

Christmas Lights till musik med hjälp av Arduino

min fru och jag har velat skapa våra egna lampor-set-till-musikföreställning för senare semester säsonger. Inspirerad av de två Instructables nedan, beslutade vi att äntligen komma igång detta år och dekorera våra RV. Vi ville ha en allt-i-ett-styren...

3 kanal arduino Powered Christmas Light Controller!

För julen i år, jag ville göra ett riktigt häftigt projekt men inte riktigt vet vad man ska göra. Som jag fick julen ljus ut att dekorera, var det en gammal trasig Christmas light timer. Jag tog isär och tittade på lågspänning kretsen. Innan detta ha...

Enkel DIY Christmas Light Controller

God jul y'all!!! Jag vet att det är sällsynt att jag gör en "vänners kompatibla, men jag kommer att göra en jul instructable för dig dag. Ett tag jag har velat göra en datorstyrd jul ljus installationsprogrammet men hade inte delarna för att bygga en...

Raspberry Pi musikaliska Christmas Lights

Instruktioner för en uppsättning av stjärnor som tänds upp enligt en musikalisk melodi. Konceptet är att varje stjärna representerar en anmärkning och som låten fortskrider stjärnan är associerade med den aktuella journalanteckningen tänds. Inställni...

XBee programmerbara Christmas Lights

genom att följa dessa steg, kommer du att kunna styra en del av 50 trefärgs julbelysning trådlöst via en programmerbar XBee.Min familj har alltid varit julbelysning och skapa egna dekorationer, så när jag läser denna blog post på hur till hacka GE fä...

Cookie hus med Christmas Lights

jag hade så roligt att göra denna söta lilla hus. Absolut allt är ätliga. Jag la lite kanel till detta socker kakan degen så att det skulle lukta bra också. Min favorit del är de choklad täckt solrosfrön (Christmas lights), kransen och den smulade co...

Christmas Lights Installer Pole

vi har alla upplevt frustration försöker sträng upp julbelysning runt huset eller på gården, men mest av allt för mig, det har hängande lampor i de stora träden i min gårdsplanen. Det är därför jag byggde min Christmas Lights Installer Pole. Polen gö...

Fjärrstyrning av christmas lights med eter IO24

Detta projekt omfattar både mjukvara och hårdvaraInledning:Detta var en jul ljus controller jag använde ett år att köra en uppsättning med reläer med antingen IO24-modulen som jag ville köra dem över internet. Det ursprungliga projektet slutfördes fö...

Hagelgevär skal Christmas Lights!

Mitt inträde till tävlingen Holiday är hagelgevär skal Christmas Lights! Hagelgevär skal jul ljus användes på vår julgran i år att gå vidare med temat för patroner och Jingle bells. Vänligen rösta, andel och favorit!Jag trodde inte att göra en instru...

LED Christmas Light reparera

Christmas lights är ett elände att reparera. Svåra är att hitta den lampa som är utbränd och de flesta människor gör detta genom trial and error. Om du har kanske en sträng av LED lampor som är av icke-utbytbara typ du tror allt är förlorat. Men bli...

Android Christmas Lights Controller

här är en snabb intro till mitt senaste projekt: en Android Open tillbehör-powered Julljus controller!Här föddes ur en kodning session på våra lokala Google Technology User Group. Det är en Android app som kommunicerar med en Google ADK styrelse med...

USB-drivna LED / Christmas lights

detta visar hur makten en LED eller några Julljus från USB-porten på datorn.Steg 1: Få ditt material För detta behöver du följande:Gamla USB-kabel med en manlig slut (som en extender som du kan köpa på dollar store)En LEDELLEREn gammal uppsättning av...

Göra musik kontrollerade Christmas Lights

göra musik kontrollerade julbelysning för mycket billigt. Detta använder mycket grundläggande delar. Denna idé har inte sitt ursprung av mig. Det är ett derivat av Rybitski's design ligger härhär.Steg 1: Reservdelslista -Old Speakers-Solid State-relä...

Christmas light holder

jag ville trimma ut min taklinjen med Julljus men ville inte sätta upp en miljon klipp och spendera min hela helgen gör det. Så är här hur jag gjorde några lite vikt jul ljus innehavare.Steg 1: leveranserHär är vad du behöver-Coroboard 4 x 8 ark (alt...

Arduino Powered musikaliska Christmas Lights

efter att utforska Instructables webbplats jag hittade några projekt som nådde mitt intresse och de får mig att tänka, jag kunde göra några musikaliska Julljus. De flesta av vad jag tillbringat min tid på kom från Amanda Ghassaei Instructable på frek...

Innehavaren och Arduino Mood Light

lära sig hur man gör egna Mood light ur en Arduino!Steg 1: Samla materialDu kommer att vilja samla dessa material om du vill bygga humör ljuset:1 x Arduino Uno1 x RGB LED3 x 330 Omh motstånd1 x skärbräda4 x startkablar1 x mjölkkannaMängden trä beror...

Arduino Traffic Light Controller w/Remote Control

jag hade ett trafikljus som jag fordonsreparationslackering. Det enda som återstår att göra var att bygga registeransvarige för ljusets signalmönster. För att ge det en twist tagit jag med en fjärrkontroll. Detta var också ett perfekt tillfälle för m...

Musikaliskt synkroniseras Christmas Lights

Under julen, är du skyldig att se hus som är dekorerad med julbelysning som är synkroniserade till musik. Du kanske tänker att ditt hus aldrig kommer kunna ha musikaliska Julljus att kontrollsystemen är så dyrt (de genomsnitt ca 700 dollar), eller at...