Moodlight 101: LEDjes faden

Door Tarin op dinsdag 27 mei 2008 17:25 - Reacties (2)
Categorie: Moodlight, Views: 6.306

We kennen allemaal de Livingcolors van Philips: een flinke RGB-led in een doorzichtige bol, die door middel van gekleurd licht de sfeer in de kamer aan moet passen aan de bui van degene met de afstandsbediening.
Leuk bedacht natuurlijk, maar zoiets kan je ook zelf maken, en inmiddels zijn ettelijke honderden mij voor geweest.
Dat weerhoudt mij er echter niet van om ook mijn projectje uit te pluizen en hier neer te zetten. Wie weet heeft iemand er wat aan, of biedt het iemand de mogelijkheid mijn ongetwijfeld brakke programmeer-kunst-en-vliegwerk af te kraken ;).

De eerste stap (na Hello World) is een RGB-LEDje aansluiten en die wat verschillende kleuren laten zien met behulp van PWM (Pulse Width Modulation). Het idee achter PWM is inmiddels wel genoeg uitgekauwd, dus je zal het moeten doen met een linkje naar het betreffende Wikipedia-artikel.

http://tweakers.net/ext/f/Kx156cM9XYUMFNGBlN4FsR5g/full.jpg

http://tweakers.net/ext/f/CnpGoSOkFbeQgY7aC0m1DkNJ/full.png
Paint skillz ftw


Men neme: een random RGB-LEDje en 3 weerstanden. Om fatsoenlijk kleuren te mixen moet je de weerstanden eigenlijk bepalen aan de hand van de specificaties van het LEDje, maar die had ik niet. Ook geen andere weerstanden dan deze (220 ohm) overigens, en het gaat hier toch maar om het idee.
Deze LED heeft een gedeelde anode (+), dus als we hem willen laten branden moeten we een 0 op de bijbehorende pin zetten. De PWM-functie werkt nu ook omgekeerd dus.

Qua code is het erg eenvoudig:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
 * RGB fading
 * One RGB-led (common anode) connected to pins 9, 10 and 11.
 * (c) (for what it's worth) 2008, Niels Hordijk
 */
 
// Define the pins the LED is connected to; be sure to use 3 (of the 6 available) PWM-pins.
int pinR = 9;
int pinG = 11;
int pinB = 10;
int i;

void setup() { 
  //set pins to output
  pinMode(pinR, OUTPUT);
  pinMode(pinG, OUTPUT);
  pinMode(pinB, OUTPUT);
  //turn off the lights 
  analogWrite(pinR, 255);
  analogWrite(pinG, 255);
  analogWrite(pinB, 255);
}

void loop() { //main program
  for (i=255; i>=0; i--) {
    //fade in - red LED
    analogWrite(pinR, i);
    delay(15);
  }
  analogWrite(pinR, 255); //and turn it off again
  for (i=255; i>=0; i--) {
    //fade in - green LED
    analogWrite(pinG, i);
    delay(15);
  }
  analogWrite(pinG, 255);
  for (i=255; i>=0; i--) {
    //fade in - blue LED
    analogWrite(pinB, i);
    delay(15);
  }
  analogWrite(pinB, 255);
}



en om nog iets semi-origineels te posten: fade van random kleur naar random kleur:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 * RGB random fading
 * One RGB-led (common anode) connected to pins 9, 10 and 11.
 * (c) (for what it's worth) 2008, Niels Hordijk
 */
 
// Define the pins the LED is connected to; be sure to use 3 (of the 6 available) PWM-pins.
int pinR = 9;
int pinG = 11;
int pinB = 10;
int red = 255;
int green = 255;
int blue = 255;
int redNew;
int greenNew;
int blueNew;
int fadeSteps = 100; //sets fade-resolution, between 2 and 255.
int fadeDelay = 15; //sets fade-delay
int i;

void setup() { 
  //set pins to output
  pinMode(pinR, OUTPUT);
  pinMode(pinG, OUTPUT);
  pinMode(pinB, OUTPUT);
  //turn off the lights 
  analogWrite(pinR, red);
  analogWrite(pinG, green);
  analogWrite(pinB, blue);
  //randomize the (pseudo) random number generator (check the reference)
  randomSeed(analogRead(0));
}

void loop() { //main program
  //set random values
  redNew = random(256);
  greenNew = random(256);
  blueNew = random(256);
  for (i=1; i<fadeSteps; i++) {
    analogWrite(pinR, red+(redNew-red)*i/fadeSteps);
    analogWrite(pinG, green+(greenNew-green)*i/fadeSteps);
    analogWrite(pinB, blue+(blueNew-blue)*i/fadeSteps);
    delay(fadeDelay);
  }
  red = redNew;
  green = greenNew;
  blue = blueNew;
}



En een filmpje (met extragratis, van het briljante nieuwe album, Ayreon - Ride The Comet):

Volgende: Philips Wake-up Light (HF3485) repareren 11-'15 Philips Wake-up Light (HF3485) repareren
Volgende: Nieuw speeltje 05-'08 Nieuw speeltje

Reacties


Door Tweakers user Patriot, dinsdag 27 mei 2008 18:06

Het kan aan mij liggen, maar volgens mij gebruik je nu de fadeResolution nu niet ;) Je declareert hem, maar hardcode vervolgens 100 in de for-loop.

Verder erg leuk!

Door Tweakers user Tarin, dinsdag 27 mei 2008 18:32

Heh, daar heb je een punt. Ik heb het aangepast, dank je :).

[Reactie gewijzigd op dinsdag 27 mei 2008 18:33]


Reageren is niet meer mogelijk