Estou fazendo uma "MoodLight", ou seja, uma luz que muda de cor.

Criei 8 programações para ela:

Desligada

Red

Green

Blue

Red+Green

Green+Blue

Red+Green+Blue

MoodLight

Conforme eu aperto um Push Button ele muda de programação. quero agora controlar a intensidade da luz via potênciometro. 

Mas todo código que uso acaba alterando a programação inteira. Ele acende todos os LEDS e muda a intensidade, mas não respeita a programação de cores.

Segue o código:

/*
MoodLight, 8 Programns
*/
// Delay time: sets the time in milliseconds between loop iterations.
// Make this value large for slower transitions.
#define DELAY_TIME 150

// Maximum Brightness: the maximum level the pins will reach.
#define MAX_BRIGHT 255

// The pins which each color value is output to.
#define switchPin 2
#define ledRedPin 11
#define ledGreenPin 10
#define ledBluePin 9

// The initial values of each color.
int red = 0;
int green = 170;
int blue = 170;

// Indicates whether a color is incrementing (1) or decrementing (0).
int incR = 1;
int incG = 1;
int incB = 0;

// Smoothly changes the color values
void transition()
{
if (red >= MAX_BRIGHT)
incR = 0;
else if (red <= 0)
incR = 1;
if (green >= MAX_BRIGHT)
incG = 0;
else if (green <= 0)
incG = 1;
if (blue >= MAX_BRIGHT)
incB = 0;
else if (blue <= 0)
incB = 1;

if (incR)
red++;
else
red--;
if(incG)
green++;
else
green--;
if(incB)
blue++;
else
blue--;
}

// Sets the output voltage on the LED pins.
void setColor()
{
analogWrite(ledRedPin, red);
analogWrite(ledGreenPin, green);
analogWrite(ledBluePin, blue);
}

int val; // variable for reading the pin status
int val2; // variable for reading the delayed status
int buttonState; // variable to hold the button state

int lightMode = 0; // What mode is the light in?

void setup() {
pinMode(switchPin, INPUT); // Set the switch pin as input

pinMode(ledRedPin, OUTPUT);
pinMode(ledGreenPin, OUTPUT);
pinMode(ledBluePin, OUTPUT);

Serial.begin(9600); // Set up serial communication at 9600bps
buttonState = digitalRead(switchPin); // read the initial state
}

void loop(){
val = digitalRead(switchPin); // read input value and store it in val
delay(10); // 10 milliseconds is a good amount of time
val2 = digitalRead(switchPin); // read the input again to check for bounces
if (val == val2) { // make sure we got 2 consistant readings!
if (val != buttonState) { // the button state has changed!
if (val == LOW) { // check if the button is pressed
if (lightMode == 0) { // if its off
lightMode = 1; // turn lights RED!
} else {
if (lightMode == 1) { // if its RED
lightMode = 2; // make it GREEN!
} else {
if (lightMode == 2) { // if its GREEN
lightMode = 3; // make it YELLOW!
} else {
if (lightMode == 3) { // if its YELLOW,
lightMode = 4; // make it BLUE
} else {
if (lightMode == 4) { // if its BLUE,
lightMode = 5; // turn it PURPLE!
}
if (lightMode == 5) { // if its PURPLE
lightMode = 6; // make it LIGHTBLUE!
}
else {
if (lightMode == 6) { // if its LGHTBLUE,
lightMode = 7; // make it WHITE
}
else {
if (lightMode == 7) { // if its WHITE,
lightMode = 8; // turn it MOOD LIGHT!
}
else {
if (lightMode == 8) { // if its MOOD LIGHT,
lightMode = 0; // make it OFF
}
}
}
}
}
}
}
}
}
buttonState = val; // save the new state in our variable
}

// Now do whatever the lightMode indicates
if (lightMode == 0) { // all-off
Serial.println("OFF");
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledBluePin, LOW);
}

if (lightMode == 1) { // RED
Serial.println("RED");
digitalWrite(ledRedPin, HIGH);
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledBluePin, LOW);
}

if (lightMode == 2) { // GREEN
Serial.println("GREEN");
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, HIGH);
digitalWrite(ledBluePin, LOW);
}
if (lightMode == 3) { // YELLOW
Serial.println("YELLOW");
digitalWrite(ledRedPin, HIGH);
digitalWrite(ledGreenPin, HIGH);
digitalWrite(ledBluePin, LOW);
}
if (lightMode == 4) { // BLUE
Serial.println("BLUE");
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledBluePin, HIGH);
}
if (lightMode == 5) { // PURPLE
Serial.println("PURPPLE");
digitalWrite(ledRedPin, HIGH);
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledBluePin, HIGH);
}
if (lightMode == 6) { // LIGHTBLUE
Serial.println("LIGHT BLUE");
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, HIGH);
digitalWrite(ledBluePin, HIGH);
}
if (lightMode == 7) { // LIGHTBLUE
Serial.println("WHITE");
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, HIGH);
digitalWrite(ledBluePin, HIGH);
}
if (lightMode == 8) { // MOOD LIGHT
Serial.println("MOOD LIGHT");
transition();
setColor();
delay(DELAY_TIME);
}
}
}

Alguém tem uma dica de como posso fazer?

Exibições: 771

Responder esta

Respostas a este tópico

Você pode utilizar 3 potenciomêtros (1 para cada cor), (cada potenciomentro de 0 a 255) Com isso vc terá 16 milhoes de cores e é mais fácil que o próximo>

Tenho uma ideia que nunca coloquei em prática de dividir os 16 milhoes pelos 1024, e cada  "fração" do potenciomêtro seria uma o de RGB (e uma cor), aproximando os valores de cores, e assim ficaria parecido com o controle da Philips.

http://www.ngbconsult.co.uk/gallery/Philips_living_Colors/Philips_L...

Tenho um código aqui que é por controle remoto.

eu não quero mudar as cores via potênciometro, apenas o brilho. :)

Mas gostei da idéia... é bem interessante.

valeu!

Bruno, de acordo com este site:   http://www.amazon.co.uk/Philips-LivingColors-Colour-Changing-Contro...  , o Moody da Philips , que tem controle de intensidade tem 4 leds. portanto, se eu tivesse que apostar, diria que ele tem os 3 (RGB) e  1 branco com PWM para dar a intensidade da cor (0 - 255). 

Acredito que não é possível controlar a intensidade da cor só com os 3 (RGB), porque se aumentar todos vc gera uma nova cor. (mas eu no seu lugar, não confiaria muito nas minhas informações, afinal sou um mero curioso desta área... rsrsr....)  

Abç

Então, o que eu quero é que o brilho máximo dos leds seja regulavel com o potênciometro.

ao invés de ir até 255 esse valor seria definido pelo potênciometro, mas respeitando o código posterior a ele.

O que acontece é que quando programo ele muda a intensidade dos 3 leds, mas não respeita por exemplo só o vermelho estar ligado. ele liga os 3!

Bom, Se você puder postar o código que está dando errado e a forma que está ligando o potenciometro que posso ajudar melhor. 

O que está  querendo definir com o valor do potenciômetro? Valor maior que 255?? 

Como falei a cor é a combinação da luminosidade dos 3 leds, tanto que o preto é RGB =0,0,0, e o branco  é RGB (255,255,255), 

pode ser que tenha algum problema no analogWrite X digitalWrite do código.

Tem que olhar para entender melhor.


Abs 


RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço