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?
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por