Sunrise met LED strip

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 9
Geregistreerd: 26 Jun 2013, 21:14

Sunrise met LED strip

Berichtdoor jordan.altena » 17 Aug 2013, 09:15

Hallo,
Ik ben een behoorlijke newbie.
Ik ben bezig met een RGB strip een een opkomende zon te simuleren voor een terrarium.
De aansturing werkt al allemaal alleen een gelijkmatige overgang lukt mij nog niet.
Ik heb veel op het internet gekeken maar eigenlijk niets gevonden.

De bedoeling is eigenlijk dat hij van R(ood): 0 G(roen): 0 B(lauw): 0 gaat naar R: 100 G: 70 en B: 10
Hierna is het nog de bedoeling dat het gaat naar daglicht r:255 g:255 b:255,
Schemering r:255 g:20 b:120 en
Maanlicht r:0 g:0 b:120

Het lukt mij wel van de ene kleur (bijvoorbeeld rood) rustig over te gaan naar een andere kleur (bijvoorbeeld groen)
maar van een bepaalde rgb kleur naar een andere rgb kleur lukt mij niet.

Alvast bedankt

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Sunrise met LED strip

Berichtdoor pjh » 17 Aug 2013, 09:37

Misschien kun je je sketch ook posten. Dan kunnen anderen beter zien `waar het mis gaat`.
Gr. Paul

Berichten: 9
Geregistreerd: 26 Jun 2013, 21:14

Re: Sunrise met LED strip

Berichtdoor jordan.altena » 17 Aug 2013, 09:59

Dag Paul,
Bedankt voor je reactie.
Het gaat niet echt fout, maar ik heb geen idee hoe ik de overgang rustig kan laten gaan (met een fade)
Maar de code die ik had gevonden is:

// color swirl! connect an RGB LED to the PWM pins as indicated
// in the #defines
// public domain, enjoy!

#define REDPIN 9
#define GREENPIN 10
#define BLUEPIN 11

#define FADESPEED 20 // make this higher to slow down

void setup() {
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
}


void loop() {
{
analogWrite(REDPIN, 0);
analogWrite(GREENPIN, 0);
analogWrite(BLUEPIN, 0);
delay(3000);
}
int r, g, b;


for (r = 0; r < 100; r++)
for (g = 0; g < 70; g++) //ik had gehoopt dat dit zou werken
for (b = 0; b < 10; b++) //ik had gehoopt dat dit zou werken
{
analogWrite(REDPIN, r);
analogWrite(GREENPIN, g);
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
delay(3000);
}




Een andere code wat ik heb gevonden is:

/*
Adafruit Arduino - Lesson 3. RGB LED
*/

int redPin = 9;
int greenPin = 10;
int bluePin = 11;

void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}

void loop()
{
setColor(100, 70, 10); // sunrise
delay(1000);
setColor(255, 255, 255); // daglicht
delay(1000);
setColor(255, 20, 255); // schermering
delay(1000);
setColor(0, 0, 120); // moonlight
delay(1000);

}

void setColor(int red, int green, int blue)
{
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Sunrise met LED strip

Berichtdoor pjh » 17 Aug 2013, 11:28

Hier je code opnieuw. Ik heb alleen wat weggehaald en verschoven.
Het LEDje gaat branden, maar je zult zien dat je er dan nog niet bent...
In het Adafruit voorbeeld is er geen sprake van een fade.

In een tweede berichtje zal ik dit toelichten.
Onderwijl nodig ik ook anderen uit zich met deze zaak te bemoeien. :D

Code: Alles selecteren
// color swirl! connect an RGB LED to the PWM pins as indicated
// in the #defines
// public domain, enjoy!

#define REDPIN 9
#define GREENPIN 10
#define BLUEPIN 11

#define FADESPEED 20 // make this higher to slow down

int r, g, b;

void setup() {
}

void loop() {
for (r = 0; r < 100; r++)
for (g = 0; g < 70; g++) //ik had gehoopt dat dit zou werken
for (b = 0; b < 10; b++) //ik had gehoopt dat dit zou werken
{
analogWrite(REDPIN, r);
analogWrite(GREENPIN, g);
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
delay(3000);
}

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Sunrise met LED strip

Berichtdoor Rudi » 17 Aug 2013, 12:30

Je gebruikt een lus in een lus in een lus voor je R-G-B waarden. Je moet alle waarden procentueel en gelijktijdig veranderen in 1 lus.
Een (niet geteste) mogelijkheid is om met de map functie de B en G waarden verhoudingsgewijs tot de R waarde te verhogen (R die van 0 tot 100 oploopt).
Vervang de void loop() functie in jouw code eens met dit:
Code: Alles selecteren
void loop() {
{
analogWrite(REDPIN, 0);
analogWrite(GREENPIN, 0);
analogWrite(BLUEPIN, 0);
delay(3000);
}
int i,r,g,b;

for (i = 0; i < 101; i++)
r = i;
g = map(i,0,70,0,100);
b = map(i,0,10,0,100);

{
analogWrite(REDPIN, r);
analogWrite(GREENPIN, g);
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
delay(3000);
}
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Sunrise met LED strip

Berichtdoor pjh » 17 Aug 2013, 13:59

Als ik je project goed begrijp, faden de ledjes over de loop van een dag.
Zo'n verloop in de tijd laat zich ook beschrijven in een wiskundige formule.
Ik denk niet dat je met "delay()" een goede timing houdt.

Hieronder twee voorbeelden van zo'n functie, waarbij op de x-as de minuten per dag staan (60*24 = 1440) en op de y-as de waarde van je analogWrite() ("PWM-waarde").
Om twaalf uur brandt de LED maximaal.

Afbeelding

Berichten: 9
Geregistreerd: 26 Jun 2013, 21:14

Re: Sunrise met LED strip

Berichtdoor jordan.altena » 17 Aug 2013, 14:21

Volgens mij heb ik de juiste code gevonden. (na ongeveer 3 dagen zoeken en testen)

/*
Fade RGB LED Smoothly through 4 colours
Fades an RGB LED using PWM smoothly through 4 different colours pausing for 1.5 seconds on each colour.

Connect an common Cathode RGB LED with appropriate resistors on each anode to your Arduino Uno;
Red to pin 9, Green to pin 10, Blue to pin 11, Cathode to GND.

Developed for Arduino Uno by Joshua David - TechHelpBlog.com

Please Feel Free to adapt and use this code in your projects.
Contact me at techhelpblog.com and let me know how you've used it!
*/

// Assign LED Output PWM Pins
int Red = 9;
int Green = 10;
int Blue = 11;

//Set Initial Values
int RedVal = 0;
int GreenVal = 0;
int BlueVal = 0;
int fade = 100; // Delay Time

// Colour Value 1 as each colour intensity (0-255)
int RedVal1 = 100;
int GreenVal1 = 70;
int BlueVal1 = 10;

// Colour Value 2
int RedVal2 = 255;
int GreenVal2 = 255;
int BlueVal2 = 255;

//Colour Value 3
int RedVal3 = 255;
int GreenVal3 = 20;
int BlueVal3 = 120;

//Colour Value 4
int RedVal4 = 0;
int GreenVal4 = 0;
int BlueVal4 = 120;

//Set initial mode (Colour Value Mode) to Colour Value 1
int mode = 1;

void setup()
{

//----------------------- Assign outputs
pinMode(Red, OUTPUT);
pinMode(Green, OUTPUT);
pinMode(Blue, OUTPUT);
//----------------------- Write Initial Values of 0 to outputs
analogWrite(Red, RedVal);
analogWrite(Green, GreenVal);
analogWrite(Blue, BlueVal);

}

void loop() // Begin Main Program Loop

{
while(mode == 1){
if(RedVal < RedVal1){ // If RedVal is less than desired RedVal1
RedVal ++; // increment RedVal
} else if(RedVal > RedVal1){ // If RedVal is more than desired RedVal1
RedVal --; // decrement RedVal
} else if(RedVal == RedVal1){ // If RedVal is equal to desired RedVal1
//Do Nothing
}
// Repeated as above for BlueVal
if(BlueVal < BlueVal1){
BlueVal ++;
} else if(BlueVal > BlueVal1){
BlueVal --;
} else if(BlueVal == BlueVal1){
//Do Nothing
}
// Repeated as above for GreenVal
if(GreenVal < GreenVal1){
GreenVal ++;
} else if (GreenVal > GreenVal1){
GreenVal --;
} else if (GreenVal == GreenVal1){
// Do Nothing
}
// Now we have a new set of values, we write them to the PWM Pins.
analogWrite(Red, RedVal);
analogWrite(Green, GreenVal);
analogWrite(Blue, BlueVal);
delay(fade); // Implement a bit of delay to slow the change of colour down a bit

if(RedVal == RedVal1 && GreenVal == GreenVal1 && BlueVal == BlueVal1){ // If RedVal & GreenVal & BlueVal are all at the desired values
delay(1500); // Delay to hold this colour for a little while
mode = 2; // Change the mode to the next colour. Exiting this while loop and into the next one
}
}

while(mode == 2){
if(RedVal < RedVal2){
RedVal ++;
} else if(RedVal > RedVal2){
RedVal --;
} else if(RedVal == RedVal2){
//Do Nothing
}

if(BlueVal < BlueVal2){
BlueVal ++;
} else if(BlueVal > BlueVal2){
BlueVal --;
} else if(BlueVal == BlueVal2){
//Do Nothing
}

if(GreenVal < GreenVal2){
GreenVal ++;
} else if (GreenVal > GreenVal2){
GreenVal --;
} else if (GreenVal == GreenVal2){
// Do Nothing
}

analogWrite(Red, RedVal);
analogWrite(Green, GreenVal);
analogWrite(Blue, BlueVal);
delay(fade);

if(RedVal == RedVal2 && GreenVal == GreenVal2 && BlueVal == BlueVal2){
delay(1500);
mode = 3;
//break;
}
}

while(mode == 3){
if(RedVal < RedVal3){
RedVal ++;
} else if(RedVal > RedVal3){
RedVal --;
} else if(RedVal == RedVal3){
//Do Nothing
}

if(BlueVal < BlueVal3){
BlueVal ++;
} else if(BlueVal > BlueVal3){
BlueVal --;
} else if(BlueVal == BlueVal3){
//Do Nothing
}

if(GreenVal < GreenVal3){
GreenVal ++;
} else if (GreenVal > GreenVal3){
GreenVal --;
} else if (GreenVal == GreenVal3){
// Do Nothing
}

analogWrite(Red, RedVal);
analogWrite(Green, GreenVal);
analogWrite(Blue, BlueVal);
delay(fade);

if(RedVal == RedVal3 && GreenVal == GreenVal3 && BlueVal == BlueVal3){
delay(1500);
mode = 4;
//break;
}
}

while(mode == 4){
if(RedVal < RedVal4){
RedVal ++;
} else if(RedVal > RedVal4){
RedVal --;
} else if(RedVal == RedVal4){
//Do Nothing
}

if(BlueVal < BlueVal4){
BlueVal ++;
} else if(BlueVal > BlueVal4){
BlueVal --;
} else if(BlueVal == BlueVal4){
//Do Nothing
}

if(GreenVal < GreenVal4){
GreenVal ++;
} else if (GreenVal > GreenVal4){
GreenVal --;
} else if (GreenVal == GreenVal4){
// Do Nothing
}

analogWrite(Red, RedVal);
analogWrite(Green, GreenVal);
analogWrite(Blue, BlueVal);
delay(fade);

if(RedVal == RedVal4 && GreenVal == GreenVal4 && BlueVal == BlueVal4){
delay(10000);
mode = 1; // Set mode back to 1 to return to the original colour.
//break;
}
}

}


Ik ga deze code testen.
Alvast bedankt

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten