Go Down

Topic: LED Programme NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, (Read 282 times) previous topic - next topic

Shwowak

Hallo zusammen ich möchste per Taster  ein Lichtprogramm steuern, und zwar diese Programme soll es haben:

AUS, NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE,NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE.
Habe versucht mir da etwas zusammen zubauen ,leider komm ich nicht weiter .
Bin total neu und hoffe um eure Hilfe.

HotSystems

Poste deinen Sketch bitte direkt im Forum und in Code-Tags.
Dann können wir den alle lesen.
Und ein paar mehr Angaben wie z.B. welchen Arduino und welche Leds du verwendest.
I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

michael_x


Shwowak

Code: [Select]
#include <Adafruit_NeoPixel.h>
// Variablen
int tasterStatus = LOW;
int lichtmodus = 0;
// Konstanten
const int tasterPin    = 10;
// Pattern types supported: Symbolische Konstanten für die Betriebsarten
enum  pattern { NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, };

// Patern directions supported:  // Muster Richtung
enum  direction { FORWARD, REVERSE };  

// NeoPattern Class - derived from the Adafruit_NeoPixel class
class NeoPatterns : public Adafruit_NeoPixel
{
 public:

 // Member Variables:  
 pattern  ActivePattern;  // which pattern is running
 direction Direction;     // direction to run the pattern
 
 unsigned long Interval;   // milliseconds between updates
 unsigned long lastUpdate; // last update of position
 
 uint32_t Color1, Color2;  // What colors are in use
 uint16_t TotalSteps;  // total number of steps in the pattern
 uint16_t Index;  // current step within the pattern
 
 void (*OnComplete)();  // Callback on completion of pattern
 
 // Constructor - calls base-class constructor to initialize strip
 NeoPatterns(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)())
 :Adafruit_NeoPixel(pixels, pin, type)
 {
     OnComplete = callback;
 }
 
 // Update the pattern
 void Update()
 {
     if((millis() - lastUpdate) > Interval) // time to update
     {
         lastUpdate = millis();
         switch(ActivePattern)
         {
             case RAINBOW_CYCLE:
                 RainbowCycleUpdate();
                 break;
             case THEATER_CHASE:
                 TheaterChaseUpdate();
                 break;
             case COLOR_WIPE:
                 ColorWipeUpdate();
                 break;
             case SCANNER:
                 ScannerUpdate();
                 break;
             case FADE:
                 FadeUpdate();
                 break;
             default:
                 break;
         }
     }
 }

 // Increment the Index and reset at the end
 void Increment()
 {
     if (Direction == FORWARD)
     {
        Index++;
        if (Index >= TotalSteps)
         {
             Index = 0;
             if (OnComplete != NULL)
             {
                 OnComplete(); // call the comlpetion callback
             }
         }
     }
     else // Direction == REVERSE
     {
         --Index;
         if (Index <= 0)
         {
             Index = TotalSteps-1;
             if (OnComplete != NULL)
             {
                 OnComplete(); // call the comlpetion callback
             }
         }
     }
 }
 
 // Reverse pattern direction
 void Reverse()
 {
     if (Direction == FORWARD)
     {
         Direction = REVERSE;
         Index = TotalSteps-1;
     }
     else
     {
         Direction = FORWARD;
         Index = 0;
     }
 }
 
 // Initialize for a RainbowCycle
 void RainbowCycle(uint8_t interval, direction dir = FORWARD)
 {
     ActivePattern = RAINBOW_CYCLE;
     Interval = interval;
     TotalSteps = 255;
     Index = 0;
     Direction = dir;
 }
 
 // Update the Rainbow Cycle Pattern
 void RainbowCycleUpdate()
 {
     for(int i=0; i< numPixels(); i++)
     {
         setPixelColor(i, Wheel(((i * 256 / numPixels()) + Index) & 255));
     }
     show();
     Increment();
 }

 // Initialize for a Theater Chase
 void TheaterChase(uint32_t color1, uint32_t color2, uint8_t interval, direction dir = FORWARD)
 {
     ActivePattern = THEATER_CHASE;
     Interval = interval;
     TotalSteps = numPixels();
     Color1 = color1;
     Color2 = color2;
     Index = 0;
     Direction = dir;
}
 
 // Update the Theater Chase Pattern
 void TheaterChaseUpdate()
 {
     for(int i=0; i< numPixels(); i++)
     {
         if ((i + Index) % 3 == 0)
         {
             setPixelColor(i, Color1);
         }
         else
         {
             setPixelColor(i, Color2);
         }
     }
     show();
     Increment();
 }

 // Initialize for a ColorWipe
 void ColorWipe(uint32_t color, uint8_t interval, direction dir = FORWARD)
 {
     ActivePattern = COLOR_WIPE;
     Interval = interval;
     TotalSteps = numPixels();
     Color1 = color;
     Index = 0;
     Direction = dir;
 }
 
 // Update the Color Wipe Pattern
 void ColorWipeUpdate()
 {
     setPixelColor(Index, Color1);
     show();
     Increment();
 }
 
 // Initialize for a SCANNNER
 void Scanner(uint32_t color1, uint8_t interval)
 {
     ActivePattern = SCANNER;
     Interval = interval;
     TotalSteps = (numPixels() - 1) * 2;
     Color1 = color1;
     Index = 0;
 }

 // Update the Scanner Pattern
 void ScannerUpdate()
 {
     for (int i = 0; i < numPixels(); i++)
     {
         if (i == Index)  // Scan Pixel to the right
         {
              setPixelColor(i, Color1);
         }
         else if (i == TotalSteps - Index) // Scan Pixel to the left
         {
              setPixelColor(i, Color1);
         }
         else // Fading tail
         {
              setPixelColor(i, DimColor(getPixelColor(i)));
         }
     }
     show();
     Increment();
 }
 
 // Initialize for a Fade
 void Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD)
 {
     ActivePattern = FADE;
     Interval = interval;
     TotalSteps = steps;
     Color1 = color1;
     Color2 = color2;
     Index = 0;
     Direction = dir;
 }
 
 // Update the Fade Pattern
 void FadeUpdate()
 {
     // Calculate linear interpolation between Color1 and Color2
     // Optimise order of operations to minimize truncation error
     uint8_t red = ((Red(Color1) * (TotalSteps - Index)) + (Red(Color2) * Index)) / TotalSteps;
     uint8_t green = ((Green(Color1) * (TotalSteps - Index)) + (Green(Color2) * Index)) / TotalSteps;
     uint8_t blue = ((Blue(Color1) * (TotalSteps - Index)) + (Blue(Color2) * Index)) / TotalSteps;
    
     ColorSet(Color(red, green, blue));
     show();
     Increment();
 }

 // Calculate 50% dimmed version of a color (used by ScannerUpdate)
 uint32_t DimColor(uint32_t color)
 {
     // Shift R, G and B components one bit to the right
     uint32_t dimColor = Color(Red(color) >> 1, Green(color) >> 1, Blue(color) >> 1);
     return dimColor;
 }

 // Set all pixels to a color (synchronously)
 void ColorSet(uint32_t color)
 {
     for (int i = 0; i < numPixels(); i++)
     {
         setPixelColor(i, color);
     }
     show();
 }

 // Returns the Red component of a 32-bit color
 uint8_t Red(uint32_t color)
 {
     return (color >> 16) & 0xFF;
 }

 // Returns the Green component of a 32-bit color
 uint8_t Green(uint32_t color)
 {
     return (color >> 8) & 0xFF;
 }

 // Returns the Blue component of a 32-bit color
 uint8_t Blue(uint32_t color)
 {
     return color & 0xFF;
 }
 
 // Input a value 0 to 255 to get a color value.
 // The colours are a transition r - g - b - back to r.
 uint32_t Wheel(byte WheelPos)
 {
     WheelPos = 255 - WheelPos;
     if(WheelPos < 85)
     {
         return Color(255 - WheelPos * 3, 0, WheelPos * 3);
     }
     else if(WheelPos < 170)
     {
         WheelPos -= 85;
         return Color(0, WheelPos * 3, 255 - WheelPos * 3);
     }
     else
     {
         WheelPos -= 170;
         return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
     }
 }
};
void Stick3Complete();
// Define some NeoPatterns for the two rings and the stick
//  as well as some completion routines
;
NeoPatterns Stick1(3, 5, NEO_RGB + NEO_KHZ800, &Stick3Complete);
NeoPatterns Stick2(3, 6, NEO_RGB + NEO_KHZ800, &Stick3Complete);
NeoPatterns Stick3(3, 7, NEO_RGB + NEO_KHZ800, &Stick3Complete);
NeoPatterns Stick4(3, 8, NEO_GRB + NEO_KHZ800, &Stick3Complete);
// Initialize everything and prepare to start  
void setup()
{
Serial.begin(115200);          
pinMode(tasterPin, INPUT);      // Setzt den TasterPin als Eingang
pinMode(12, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);  

      

Teil 2 Folgt:


Shwowak


Teil 2
Code: [Select]
}
// Main loop
void loop()
{
   // Update the Sticks.
   Stick1.Update();
   Stick2.Update();
   Stick3.Update();
   Stick4.Update();   
       
// Abfrage ob der Taster gedrückt ist
  tasterStatus = digitalRead(tasterPin);
  Serial.print(digitalRead(tasterPin));
// Wenn Taster gedrückt ist...
  if (tasterStatus == HIGH)
  {
    lichtmodus++;     // Lichtmodus +1
    delay(300);       // 300ms warten
  }
   
  //+++++++++++++++ LEUCHTPROGRAMME +++++++++++++++++
   
  // Modus 0 = Licht aus
  if (lichtmodus == 0)
  {
        Stick1.begin();
     
        Stick1.Scanner(Stick1.Color(0,0,255), 55);
        Stick2.Scanner(Stick1.Color(0,0,255), 55);
        Stick3.Scanner(Stick1.Color(0,0,255), 55);
        Stick4.Scanner(Stick1.Color(0,0,255), 55);
  }
  // Programmmodus 1 =  FADE
  else if (lichtmodus == 1)
  {     
        Stick1.ActivePattern = FADE;
        Stick1.Interval = 20;
        Stick2.ActivePattern = FADE;
        Stick2.Interval = 20;
        Stick3.ActivePattern = FADE;
        Stick3.Interval = 20;
        Stick4.ActivePattern = FADE;
        Stick4.Interval = 20;   
  }
  // Programmmodus 2 = COLOR_WIPE 
  else if (lichtmodus == 2)
  {
        Stick1.ActivePattern = COLOR_WIPE;
        Stick1.TotalSteps = Stick1.numPixels();
        Stick2.ActivePattern = COLOR_WIPE;
        Stick2.TotalSteps = Stick2.numPixels();
        Stick3.ActivePattern = COLOR_WIPE;
        Stick3.TotalSteps = Stick3.numPixels();
        Stick4.ActivePattern = COLOR_WIPE;
        Stick4.TotalSteps = Stick4.numPixels();
  }
  // Programmmodus 3 = THEATER_CHASE
  else if (lichtmodus == 3)
  {
        Stick1.ActivePattern = THEATER_CHASE;
        Stick2.ActivePattern = THEATER_CHASE;
        Stick3.ActivePattern = THEATER_CHASE;
        Stick4.ActivePattern = THEATER_CHASE;   
  }
   
  // Programmmodus 4 = RAINBOW_CYCLE
  else if (lichtmodus == 4)
  {
        Stick1.ActivePattern = RAINBOW_CYCLE;
        Stick2.ActivePattern = RAINBOW_CYCLE;
        Stick3.ActivePattern = RAINBOW_CYCLE;
        Stick4.ActivePattern = RAINBOW_CYCLE;   
  }
 
  // Programmmodus 5 = SCANNER
  else if (lichtmodus == 5)
  {
        Stick1.Scanner(Stick1.Color(255,0,0), 55);
        Stick2.Scanner(Stick1.Color(255,0,0), 55);
        Stick3.Scanner(Stick1.Color(255,0,0), 55);
        Stick4.Scanner(Stick1.Color(255,0,0), 55);   
  }
 
  // Anzahl der Leutmodi auf 6 begrenzen. (0 bis 5)
  else
  {
    lichtmodus = 0;
  }
  }
//------------------------------------------------------------
//Completion Routines - get called on completion of a pattern
//------------------------------------------------------------

// Stick1 Completion Callback

// Stick3 Completion Callback
void Stick3Complete()
{
    // Random color change for next scan
    Stick3.Color1 = Stick3.Wheel(random(255));
}



Ich weiß das ,es komplett falsch ist warscheinlich ich habe als Anfänger einfach versucht es selber hin zubekommen.

Es läuft alles auf einem Ardunio Nano, und es einfach per Knopf Druck immer den Modus wechsel: AUS, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE

Deltaflyer

Ja, aber es bleibt noch immer die Frage: Was funktioniert, und was funktioniert nicht?

LG Stefan

agmue

Bitte schaue mal, ob dieses Thema Dir weiterhilft.

Das Entprellen ist allerdings schöner ohne delay mit einer 30 ms Zeitscheibe wie in diesem Beispiel.

Shwowak

Vielen Danke habe mir beide angebaut , Sieht gut aus , nur leider weiß ich nicht wie das auf mein 4 LED Strips anwenden. Blick da nicht durch :/

agmue

Ja, aber es bleibt noch immer die Frage: Was funktioniert, und was funktioniert nicht?
Dieser Frage schließe ich mich an.

Ich habe Deine Hardware nicht, Deine Webcam vom Schreibtisch finde ich auch nicht, eine Glaskugel hat Uwe mir noch nicht zukommen lassen, da ist mir Helfen nicht möglich.

Go Up