rgb led coderen

algemene C code
Berichten: 2
Geregistreerd: 30 Sep 2017, 16:51

rgb led coderen

Berichtdoor nickdubbel » 30 Sep 2017, 16:55

hallo,

Ik probeer een functie te maken waarmee een rgb led langzaam veranderd naar een andere kleur. Maar hij komt niet verder dan de 2e for loop.
Want ik krijg alleen dit te zien:
Code: Alles selecteren
rgb led berekenen is 0
rgb led berekenen is 1
rgb led berekenen is 2

de kleuren zitten in een array zoals int blauw [3] = {0,0,255}
en de change color functie laat de kleur veranderen.

Code: Alles selecteren
void switchColor(int firstColor[3], int secondColor[3], int waitTime) {
  int tempColor[3] = { firstColor[0], firstColor[1], firstColor[2] };
  for (int i = 0; i <= 2; i++)
  {
    Serial.print("rgb led berekenen is ");
    Serial.println(i);
    if (firstColor[i] < secondColor[i])
    {
      for (int k = firstColor[i]-1; k >= secondColor[i]; k++)
      {
        Serial.print(i);
        Serial.print(" wordt ");
        Serial.println("groter");
        tempColor[i] = k;
        changeColor(tempColor);
        delay(waitTime);
      }
    }
    else{
      for (int k = firstColor[i]+1; k <= secondColor[i]; k--)
      {
        Serial.print(i);
        Serial.print(" wordt ");
        Serial.print("kleiner het wordt ");
        Serial.print(k);
        Serial.print(" tot ");
        Serial.println(secondColor[i]);
        tempColor[i] = k;
        changeColor(tempColor);
        delay(waitTime);
      }
    }
  }
}

Advertisement

Gebruikers-avatar
Berichten: 1772
Geregistreerd: 06 Aug 2016, 01:03

Re: rgb led coderen

Berichtdoor Koepel » 30 Sep 2017, 23:38

Hallo, en welkom op dit forum.

Je hebt dus een RGB waarde, en een tweede RGB waarde. Je wilt nu van de ene kleur langzaam naar de tweede kleur.

Je "for"-statements kloppen niet. Maar ik begrijp niet helemaal wat je wilt. Wil je eerst de 'R' waarde stapje voor stapje naar de tweede 'R', daarna de 'G' en daarna de 'B' waarde ?
Maar dat is helemaal niet logisch :?

Stel dat je een RGB waarde hebt van {0, 0, 200 } en de tweede RGB waarde is {10, 100, 50}.
Dan zou ik het liefst alle drie kleuren tegelijkertijd willen wijzigen, en dan niet stapje voor stapje, maar tegelijkertijd en evenredig. Dus dat de 'R' waarde (van 0 naar 10) op hetzelfde moment bij de tweede kleur aan komt als de 'B' waarde (van 0 naar 100).

De update van de RGB waarde hoeft niet sneller dan je kunt zien. Ik stel voor om dat met 25 Hz te doen, dus met 40 ms er tussen.
Het mooiste zou zijn om dat te laten uitvoeren met millis(), maar met een delay() kan ook.
Dan kan aan de functie bijvoorbeeld een parameter gegeven worden hoe lang de overgang totaal gaat duren.
De rest is wiskunde.

Waarom heb je integers voor R, G, B ? De meesten zouden bytes kiezen. Als je bytes gaat gebruiken, dan is het nodig om de functie goed na te kijken op de berekeningen.
Voor welk Arduino board is het ?

De wiskunde zou er zo uit kunnen zien:
cpp code
// Arduino Uno
// Arduino IDE 1.8.4
// 30 sep 2017
// Public Domain
//
// Warning:
// The calculation with integers allows that the maximum transition time is 5 seconds.
// With 40 ms, and 255 difference, the total time can be maximum 5 seconds to keep the value under 32768.

#define LED_UPDATE_INTERVAL 40 // the led update interval in ms

void setup()
{
Serial.begin( 9600);
Serial.println();
Serial.println( "Started");

int A[3] = { 0, 0, 200 };
int B[3] = { 10, 100, 50 };
transition( A, B, 600);
}

void loop()
{
}

void transition( int firstColor[3], int secondColor[3], unsigned long totalTime)
{
int tempColor[3];
int n = int( totalTime / LED_UPDATE_INTERVAL); // number of iterations from first to second.

for( int i=0; i<n; i++)
{
// Instead of first calculating the step size,
// the complete calculation is done every time.
// That is done because it is a integer calculation,
// and this way any rounding problem is avoided.
// Going up or down is no problem, they are calculated correctly.
for( int c=0; c<3; c++) // for 'r', 'g' and 'b'.
{
int diff = secondColor[c] - firstColor[c]; // difference between the two colors.
int delta = diff * i / n; // amount of difference at this point.
tempColor[c] = firstColor[c] + delta; // add to the first color.
}

changeColor( tempColor);
delay( LED_UPDATE_INTERVAL);
}

// Due to integer rounding, the second color might not have been written yet.
// We do that now.
changeColor( secondColor);
}

void changeColor( int rgb[3])
{
Serial.print( "RGB = ");
Serial.print( rgb[0]);
Serial.print( ", ");
Serial.print( rgb[1]);
Serial.print( ", ");
Serial.print( rgb[2]);
Serial.println();
}

Berichten: 2
Geregistreerd: 30 Sep 2017, 16:51

Re: rgb led coderen

Berichtdoor nickdubbel » 01 Okt 2017, 13:39

Heel erg bedankt!!!

ik wist geen goede manier de rgb tegelijk te laten veranderen, dus had ik er via deze manier voor gekozen. maar die oplossing van de update interval is heel handig. Het is nu ook veel overzichtelijker geworden dan het eerst was.

Ik had integers gekozen omdat ik wist hoe je daar mee moest werken.Omdat ik nog nooit met bytes heb gewerkt. Ik heb trouwens een arduino uno.
Maar de code werkt eindelijk. Heel erg bedankt

Gebruikers-avatar
Berichten: 1772
Geregistreerd: 06 Aug 2016, 01:03

Re: rgb led coderen

Berichtdoor Koepel » 02 Okt 2017, 00:03

Ik zie nog paar dingen die beter kunnen in mijn sketch.

Bij de functie "transition()" ben ik vergeten om te vermelden dat de totalTime in milliseconden is.
De naam van de variabele "delta" is onhandig gekozen, misschien is "fraction" beter.
Deze regel:
Code: Alles selecteren
int delta = diff * i / n;
zorgt er voor dat de overgang maximaal 5 seconden kan zijn (5000 milliseconden dus).
Het zou beter zijn om die berekening met 'long' te doen.


Voor een RGB kleur worden altijd bytes gebruikt (een 8-bit unsigned variabele). Er passen 4 bytes in een "unsigned long", dus er is zelfs nog een byte over voor de kleur wit (er bestaan RGBW leds).
In de taal 'c' kun je meedere variabelen samen in een pakketje stoppen. Dat heet een 'struct'. Dat wordt ook vaak gedaan om de RGB waarden bij elkaar in een pakketje te houden.

Maar gebruik gerust integer array's hoor. Daar is niets mis mee, en dat jij je sketch begrijpt is veel belangrijker.

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten