-         
Ergebnis 1 bis 5 von 5

Thema: WS2812b/Arduino-Miniprogramm benötigt

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    47
    Beiträge
    2.584

    WS2812b/Arduino-Miniprogramm benötigt

    Anzeige

    Guten Morgen,
    ich benötige für ein Gerät eine Zusatzfunktion, dazu ein kleines Programm (für einen kleinen Arduino):


    • um einen Starttaster herum ist ein RGB-LED Ring (Neopixel) angeordnet, z.b. mit 8 LED`s
    • es wird wird durch eine permanente, kleine Animation/blinken zum drücken das Tasters aufgefordert
    • nach dem Drücken des Tasters werden alle LED`s auf eine Farbe gesetzt (z.B. rot)
    • als "Countdown" werden die nun alle nacheinander kreisförmig abgeschaltet
    • ein Ausgang wird nun als Triggersignal gesetzt
    • mit etwas Verzögerung wird wieder auf die Startanimation geführt


    Hat jemand Lust und Zeit ?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.573
    compiliert aber nicht getestet
    Verwendet uintX_t für klare Datenbreite anstelle von char, byte, int, long (einfach durch den passenden Datentyp ersetzen wenn der Compiler meckert)
    Beinhaltet Glitches wegen integerRechnung, Rundungsfehler und hat bestimmt Optimierungspotential

    Aber zumindest logisch sollte es funktionieren, habe nur gerade keine NeoPixel und kein Arduino zur Hand zum testen

    Sollte als Grundlage aber erstmal reichen

    Code:
    #define PIN            6
    #define NUMPIXELS      10
    
    typedef enum
    {
       anim_off,
       anim_fade_dn,
       anim_fade_up,
       anim_oscil_up,
       anim_oscil_dn,
       anim_cnt_dn,
       anim_cnt_up,
       anim_on
    }animationMode_e;
    
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
    
    uint8_t selectedColor[3] = {0,0,0};
    uint8_t activeColor[3] = {0,0,0};
    
    uint16_t timerTop = 0; //change to whatever fade or oscillation time required, depends on how frequent handleLEDs is called
    uint16_t timer = 0;
    
    animationMode_e anim_mode = anim_off;
    
    void setupLEDs()
    {
       anim_mode = anim_off;
       timer = 0;
       memset(selectedColor,15,sizeof(activeColor)}; //low white value for possible LED check
       pixels.begin();
    }
    
    void handleLEDs()
    {
       uint8_t i;
       for(i=0;i<NUMPIXELS;i++)
       {
          switch(anim_mode)
          {
             case(anim_on):
                if(i==0) memcpy(activeColor,selectedColor;, sizeof(activeColor));
                break;
             case(anim_fade_dn): // Intended fallthrough
             case(anim_oscil_dn):
                if(i==0) //always only once per cycle or timer gets confus
                {
                   if(timer == 0)
                   {
                      if(anim_mode == anim_oscil_dn) anim_mode = anim_oscil_up;
                      else anim_mode = anim_off;
                   }
                   else
                   {
                      activeColor[0] = ((uint32_t)timer * (uint32_t)selectedColor[0]) / (uint32_t)timerTop;
                      activeColor[1] = ((uint32_t)timer * (uint32_t)selectedColor[1]) / (uint32_t)timerTop;
                      activeColor[2] = ((uint32_t)timer * (uint32_t)selectedColor[2]) / (uint32_t)timerTop;
                      timer--;
                   }
                }
                break;
             case(anim_fade_up): // Intended fallthrough
             case(anim_oscil_up):
                if(i==0) //always only once per cycle or timer gets confus
                {
                   if(timer == timerTop)
                   {
                      if(anim_mode == anim_oscil_up) anim_mode = anim_oscil_dn;
                      else anim_mode = anim_on;
                   }
                   else
                   {
                      activeColor[0] = ((uint32_t)timer * (uint32_t)selectedColor[0]) / (uint32_t)timerTop;
                      activeColor[1] = ((uint32_t)timer * (uint32_t)selectedColor[1]) / (uint32_t)timerTop;
                      activeColor[2] = ((uint32_t)timer * (uint32_t)selectedColor[2]) / (uint32_t)timerTop;
                      timer++;
                   }
                }
                break;
             case(anim_cnt_dn):
                if(((NUMPIXELS*timer)/timerTOP) > i)
                {
                   memset(activeColor,0,sizeof(activeColor)};
                }
                else if(((NUMPIXELS*timer)/timerTOP) == i)
                {
                   uint16_t t_per = timerTop/NUMPIXELS; // periode time, kann man als MACRO machen für weniger RAM verbrauch
                   uint16_t t_dut = timer - (t_per * i)); // duty time, kann man als MACRO machen für weniger RAM verbrauch
                   activeColor[0] = ((uint32_t)selectedColor[0] * (uint32_t)t_dut) / (uint32_t)t_per;
                }
                else
                {
                   memcpy(activeColor,selectedColor, sizeof(activeColor));
                }
                if(i==0) //always only once per cycle or timer gets confus
                {
                   if(timer > 0) timer--;
                   else anim_mode = anim_off;
                }
                break;
             case(anim_cnt_up):
                if(((NUMPIXELS*timer)/timerTOP) > i)
                {
                   memcpy(activeColor,selectedColor, sizeof(activeColor));
                }
                else if(((NUMPIXELS*timer)/timerTOP) == i)
                {
                   uint16_t t_per = timerTop/NUMPIXELS; // periode time, kann man als MACRO machen für weniger RAM verbrauch
                   uint16_t t_dut = timer-(t_per * i); // duty time, kann man als MACRO machen für weniger RAM verbrauch
                   activeColor[0] = ((uint32_t)selectedColor[0] * (uint32_t)t_dut) / (uint32_t)t_per;
                }
                else
                {
                   memset(activeColor,0,sizeof(activeColor)};
                }
                if(i==0) //always only once per cycle or timer gets confus
                {
                   if(timer > timerTop) timer++;
                   else anim_mode = anim_on;
                }
                break;
             case(anim_off): // Intended fallthrough
             default: 
                memset(activeColor,0,sizeof(activeColor)};
                break;
          }
          pixels.setPixelColor(i, pixels.Color(activeColor[0],activeColor[1],activeColor[2])); // Moderately bright green color.
       }
       pixels.show(); // This sends the updated pixel color to the hardware.
    }
    du musst nur den Animations_mode und einen Timerwert angeben, setupLEDs ein einziges mal und dann handleLEDs in einem festen Zyklus aufrufen

    fade up und dn machen nur einen einzelnen fade und münden dann in on oder off zustand

    oscil up und dn laufen als schleife bis du den mode zu etwas anderem wechselst

    cnt up und dn sind dann deine ring animation und enden ebenfalls mit on bzw. off
    Geändert von Ceos (12.05.2018 um 08:49 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    47
    Beiträge
    2.584
    ...danke Dir schonmal !

    Leider bekomme ich hier schon einen Fehler beim kompilieren:
    public typedef enum

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.573
    oh ähm ja sorry, das public war ein schnitzer :P ich jag das gleich nochmal durch mein studio und mach es ordentlich, hatte ich völlig vergessen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.573
    habe den Code im Post oben repariert

    sollte soweit gehen, wenn er die datentypen nicht erkennt, einfach durch die passend breite datentypen ersetzen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. Verkaufe RP6 Kettenfahrzeug Gehäuse, Motortreiber, WS2812B, Sharp GP2D12 Abstandssensoren
    Von debegr92 im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 0
    Letzter Beitrag: 06.06.2016, 09:18
  2. Biete Serviceleistung wer Drehteile benötigt!
    Von Neider** im Forum Jobs/Hilfen/Stellen - Gesuche und Angebote
    Antworten: 11
    Letzter Beitrag: 09.04.2016, 15:35
  3. [Hilfe benötigt] Easy ASURO Anleitung benötigt
    Von wildtobias im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 18.01.2011, 12:28
  4. 2 Pleuelstangen benötigt
    Von LinuxFan im Forum Mechanik
    Antworten: 1
    Letzter Beitrag: 06.05.2008, 06:50
  5. Spannungsteiler benötigt???
    Von southpole200 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 02.06.2006, 17:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •