"We are back" « oc.at

LED mit Mic steuern - Code issue

slateSC 16.08.2020 - 14:12 11209 45
Posts

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4137
wenn du zeile 70 durch
Code: C++
led_values[j] = 255.0;
ersetzt sollte der strip weiss leuchten. tut er das?
wenn ja, ersetze zeile 70 mal durch
Code: C++
led_values[j] = constrain(led_values[j] / 1.0 * 255.0, 0.0, 255.0);
wenns dann zu hell ist, das 1.0 durch einen größeren wert ersetzen.
ich weis nicht welcher wert hier richtig ist, das musst du probieren.

slateSC

The Suntoucher
Avatar
Registered: Jul 2004
Location: oö
Posts: 1256
nope tut sich nichts.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4137
Code:
#include <FastLED.h>
#include "arduinoFFT.h"

#define LED_PIN     3
#define NUM_LEDS    60
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define NUM_SAMPLES 256

#define UPDATES_PER_SECOND 100

arduinoFFT FFT = arduinoFFT();

double real[NUM_SAMPLES];
double imag[NUM_SAMPLES];
uint16_t i = 0;

uint32_t us_last = 0;

void setup() {
  // put your setup code here, to run once:
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  pinMode(A0, INPUT);
  Serial.begin(9600);

  memset(real, NUM_SAMPLES, 0);
  memset(imag, NUM_SAMPLES, 0);
}

void loop() {
  // put your main code here, to run repeatedly:

  //samples aufnehmen
  if (micros() - us_last >= 100) {
    us_last = micros();

    real[i] = static_cast<double>(analogRead(A0));
    imag[i] = 0;
    i++;
  }

  //wenn genug samples gesammelt wurden
  if (i == NUM_SAMPLES) {
    i = 0;
    
    //FFT auf das array
    FFT.Windowing(real, NUM_SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
    FFT.Compute(real, imag, NUM_SAMPLES, FFT_FORWARD);
    FFT.ComplexToMagnitude(real, imag, NUM_SAMPLES);

    //256 samples, davon die ersten 128 nutzbar
    //sample 0 nicht benutzen (=DC)
    //60 leds = 2x 30 LEDS
    // --> samples 4 - 123 (=120 samples) / 30 = 4 samples / LED
    double led_values[30];
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = 0.0;
      for (uint8_t k = 0; k < 4; k++)
        led_values[j] += real[j * 4 + k + 4];
    }

    //skalieren auf 0...255 und rausschreiben an die leds
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = led_values[j] / 4095.0 * 255.0;

      //raussschreiben an die leds
      leds[30 + j] = CRGB(static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]));
      leds[29 - j] = CRGB(static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]));
    } 

    FastLED.show();
  }
}

ohne
Code:
     FastLED.show();
in der loop() ist das irgendwie klar, ja *facepalm*

slateSC

The Suntoucher
Avatar
Registered: Jul 2004
Location: oö
Posts: 1256
Holy Cow it's ALIIIIIIIIIIIIIVVVVE! :cool:
Dickes Merci noch mal an dieser Stelle für die Geduld!

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4137
kein problem, viel spass damit :)

slateSC

The Suntoucher
Avatar
Registered: Jul 2004
Location: oö
Posts: 1256
Hab ich bei diesem code jetzt eigentlich die Möglichkeit effekte aus dem 2ten code zu integrieren?
Wenn ich den reinlade wo "// put your main code here, to run repeatedly:" steht gehts natürlich nicht.

An welcher Stelle ist der aktuelle code für die animation und das aussehen der selbigen verantwortlich?
Kann das irgendwie nicht rauslesen..
Sind die 255 verantwortlich für den Farbwert weiß?

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4137
der code
Code:
    //skalieren auf 0...255 und rausschreiben an die leds
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = led_values[j] / 4095.0 * 255.0;

      //raussschreiben an die leds
      leds[30 + j] = CRGB(static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]));
      leds[29 - j] = CRGB(static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]));
    }
(genau genommen: zeilen 6+7) setzt die farben der leds, symmetrisch um die mitte des streifens. die R, G , und B werte ist jeweils gleich, dadurch ergibt sich eine weisse farbe mit unterschiedlichen helligkeiten.
du kannst an der stelle natürlich andere sachen machen, z.b. die ColorFromPalette funktion benutzen, wie im 2. code block deines ersten posts.
Bearbeitet von wergor am 22.08.2020, 21:13

slateSC

The Suntoucher
Avatar
Registered: Jul 2004
Location: oö
Posts: 1256
Hmm.. Hab versucht ColorFromPalette zu integrieren.
Er hat dann jedes mal nach ner weiter Definition geschriehen und jetzt stehe ich bei der declaration der CRGB leds an. :confused:

click to enlarge

Code:
#include <FastLED.h>
#include "arduinoFFT.h"

#define LED_PIN     3
#define NUM_LEDS    60
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define NUM_SAMPLES 256

#define UPDATES_PER_SECOND 100

arduinoFFT FFT = arduinoFFT();

double real[NUM_SAMPLES];
double imag[NUM_SAMPLES];
uint16_t i = 0;

uint32_t us_last = 0;

//Code V01
CRGBPalette16 currentPalette;
TBlendType    currentBlending;

void setup() {
  // put your setup code here, to run once:
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  pinMode(A0, INPUT);
  Serial.begin(9600);

  memset(real, NUM_SAMPLES, 0);
  memset(imag, NUM_SAMPLES, 0);

  //code V01
  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;
}

void loop() {
  // put your main code here, to run repeatedly:

  //samples aufnehmen
  if (micros() - us_last >= 100) {
    us_last = micros();

    real[i] = static_cast<double>(analogRead(A0));
    imag[i] = 0;
    i++;
  }
 }
void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
    uint8_t brightness = 255;
    
    for( int i = 0; i < NUM_LEDS; i++) {
        leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
        colorIndex += 3;
    }
  //wenn genug samples gesammelt wurden
  if (i == NUM_SAMPLES) {
    i = 0;

    //FFT auf das array
    FFT.Windowing(real, NUM_SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
    FFT.Compute(real, imag, NUM_SAMPLES, FFT_FORWARD);
    FFT.ComplexToMagnitude(real, imag, NUM_SAMPLES);

    //256 samples, davon die ersten 128 nutzbar
    //sample 0 nicht benutzen (=DC)
    //60 leds = 2x 30 LEDS
    // --> samples 4 - 123 (=120 samples) / 30 = 4 samples / LED
    double led_values[30];
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = 0.0;
      for (uint8_t k = 0; k < 4; k++)
        led_values[j] += real[j * 4 + k + 4];
    }

    //skalieren auf 0...255 und rausschreiben an die leds
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = led_values[j] / 4095.0 * 255.0;

      //raussschreiben an die leds
      leds[30 + j] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
      leds[29 - j] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
    }

    FastLED.show();
  }
}

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4137
dein code kompiliert bei mir, wird so aber nicht funktionieren. ich würde vorschlagen den größten teil der loop unverändert stehen zu lassen, und die anderen effekte direkt vor das FastLED.show() zu schreiben:
Code:
#include <FastLED.h>
#include "arduinoFFT.h"

#define LED_PIN     3
#define NUM_LEDS    60
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define NUM_SAMPLES 256

#define UPDATES_PER_SECOND 100

arduinoFFT FFT = arduinoFFT();

double real[NUM_SAMPLES];
double imag[NUM_SAMPLES];
uint16_t i = 0;

uint32_t us_last = 0;

//Code V01
CRGBPalette16 currentPalette;
TBlendType    currentBlending;

void setup() {
  // put your setup code here, to run once:
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  pinMode(A0, INPUT);
  Serial.begin(9600);

  memset(real, NUM_SAMPLES, 0);
  memset(imag, NUM_SAMPLES, 0);

  //code V01
  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;
}

void loop() {
  // put your main code here, to run repeatedly:

  //samples aufnehmen
  if (micros() - us_last >= 100) {
    us_last = micros();

    real[i] = static_cast<double>(analogRead(A0));
    imag[i] = 0;
    i++;
  }
  
  //wenn genug samples gesammelt wurden
  if (i == NUM_SAMPLES) {
    i = 0;

    //FFT auf das array
    FFT.Windowing(real, NUM_SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
    FFT.Compute(real, imag, NUM_SAMPLES, FFT_FORWARD);
    FFT.ComplexToMagnitude(real, imag, NUM_SAMPLES);

    //256 samples, davon die ersten 128 nutzbar
    //sample 0 nicht benutzen (=DC)
    //60 leds = 2x 30 LEDS
    // --> samples 4 - 123 (=120 samples) / 30 = 4 samples / LED
    double led_values[30];
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = 0.0;
      for (uint8_t k = 0; k < 4; k++)
        led_values[j] += real[j * 4 + k + 4];
    }

    //skalieren auf 0...255 und rausschreiben an die leds
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = led_values[j] / 4095.0 * 255.0;

      //raussschreiben an die leds
      leds[30 + j] = CRGB(static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]));
      leds[29 - j] = CRGB(static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]), static_cast<uint32_t>(led_values[j]));
    }

    //code für andere farben / effekte kommen hier hin, z.B.:
    for( int j = 0; j < NUM_LEDS; j++) {
      leds[j] = ColorFromPalette( currentPalette, j, BRIGHTNESS, currentBlending);
    }

    FastLED.show();
  }
}

also anstatt der zeilen
Code:
    //code für andere farben / effekte kommen hier hin, z.B.:
    for( int j = 0; j < NUM_LEDS; j++) {
      leds[j] = ColorFromPalette( currentPalette, j, BRIGHTNESS, currentBlending);
    }
kannst du deine eigenen code einsetzen.

slateSC

The Suntoucher
Avatar
Registered: Jul 2004
Location: oö
Posts: 1256
S hat jetzt leider ein wenig gedauert, da ich das Datenkabel wieder anlöten musste :D

Hab das jetzt mal genau so hochgeladen und in der Zeile 88: j += 1; ergänzt.
jetzt wurden die beiden definitionen überlagert.
Das find ich eigentlich nicht schlecht, da immer ein grundlicht da ist, egal ob sich was tut oder nicht.

Beim Abspielen dieses Videos werden Daten an YouTube übermittelt. Durch einen Klick auf das Video wird es automatisch abgespielt und du akzeptierst damit die Datenschutzerklärung von YouTube bzw. Google.

Was ich nur absolut noch nicht verstehe, ist wie ich zB.: den effekt: { currentPalette = PartyColors_p; currentBlending = LINEARBLEND; } aus dem 2. Code der ersten Seite auf den weißen effekt aus deinem code übertragen kann?
egal was ich rumkopiere, es klappt einfach nicht.. :confused:

Edit: Okay je nachdem welchen effekt ich in Zeile 40 einsetze, passt sich das grundsätzliche Farbspektrum
an den effekt an bleibt aber statisch - wie das orange im Video...
Bearbeitet von slateSC am 26.08.2020, 21:53

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4137
versuch mal das:

Code: C++
#include <FastLED.h>
#include "arduinoFFT.h"

#define LED_PIN     3
#define NUM_LEDS    60
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define NUM_SAMPLES 256

#define UPDATES_PER_SECOND 100

arduinoFFT FFT = arduinoFFT();

double real[NUM_SAMPLES];
double imag[NUM_SAMPLES];
uint16_t i = 0;

uint32_t us_last = 0;

//Code V01
CRGBPalette16 currentPalette;
TBlendType    currentBlending;

void setup() {
  // put your setup code here, to run once:
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  pinMode(A0, INPUT);
  Serial.begin(9600);

  memset(real, NUM_SAMPLES, 0);
  memset(imag, NUM_SAMPLES, 0);

  //code V01
  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;
}

void loop() {
  // put your main code here, to run repeatedly:

  //samples aufnehmen
  if (micros() - us_last >= 100) {
    us_last = micros();

    real[i] = static_cast<double>(analogRead(A0));
    imag[i] = 0;
    i++;
  }
  
  //wenn genug samples gesammelt wurden
  if (i == NUM_SAMPLES) {
    i = 0;

    //FFT auf das array
    FFT.Windowing(real, NUM_SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
    FFT.Compute(real, imag, NUM_SAMPLES, FFT_FORWARD);
    FFT.ComplexToMagnitude(real, imag, NUM_SAMPLES);

    //256 samples, davon die ersten 128 nutzbar
    //sample 0 nicht benutzen (=DC)
    //60 leds = 2x 30 LEDS
    // --> samples 4 - 123 (=120 samples) / 30 = 4 samples / LED
    double led_values[30];
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = 0.0;
      for (uint8_t k = 0; k < 4; k++)
        led_values[j] += real[j * 4 + k + 4];
    }

    //skalieren auf 0...255 und rausschreiben an die leds
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = led_values[j] / 4095.0 * 255.0;

      //raussschreiben an die leds
      leds[30 + j] = ColorFromPalette( currentPalette, j, led_values[j], currentBlending);
      leds[29 - j] = ColorFromPalette( currentPalette, j, led_values[j], currentBlending);
    }

    FastLED.show();
  }
}

slateSC

The Suntoucher
Avatar
Registered: Jul 2004
Location: oö
Posts: 1256
Die im FastLED hinterlegten effekte nimmt er trotzdem nicht.

Aber das Microfon reagiert dafür ausgezeichnet!

Beim Abspielen dieses Videos werden Daten an YouTube übermittelt. Durch einen Klick auf das Video wird es automatisch abgespielt und du akzeptierst damit die Datenschutzerklärung von YouTube bzw. Google.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4137
welche effekte meinst du? in meinem letzten code habe ich nur die farbe weiss gegen die RainbowColors_p palette ausgetauscht (siehe zeilen 40, 81, 82) aber vielleicht ist die schrittweite zu gering. ersetz mal zeilen 81 + 82 durch
Code:
      leds[30 + j] = ColorFromPalette( currentPalette, j * 4, led_values[j], currentBlending);
      leds[29 - j] = ColorFromPalette( currentPalette, j * 4, led_values[j], currentBlending);
das sollte buntere farben ergeben.

der code
Code:
#include <FastLED.h>
#include "arduinoFFT.h"

#define LED_PIN     3
#define NUM_LEDS    60
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define NUM_SAMPLES 256

#define UPDATES_PER_SECOND 100

arduinoFFT FFT = arduinoFFT();

double real[NUM_SAMPLES];
double imag[NUM_SAMPLES];
uint16_t i = 0;

uint32_t us_last = 0;

//Code V01
CRGBPalette16 currentPalette;
TBlendType    currentBlending;

void setup() {
  // put your setup code here, to run once:
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  pinMode(A0, INPUT);
  Serial.begin(9600);

  memset(real, NUM_SAMPLES, 0);
  memset(imag, NUM_SAMPLES, 0);

  //code V01
  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;
}

void loop() {
  // put your main code here, to run repeatedly:

  //samples aufnehmen
  if (micros() - us_last >= 100) {
    us_last = micros();

    real[i] = static_cast<double>(analogRead(A0));
    imag[i] = 0;
    i++;
  }
  
  //wenn genug samples gesammelt wurden
  if (i == NUM_SAMPLES) {
    i = 0;

    //FFT auf das array
    FFT.Windowing(real, NUM_SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
    FFT.Compute(real, imag, NUM_SAMPLES, FFT_FORWARD);
    FFT.ComplexToMagnitude(real, imag, NUM_SAMPLES);

    //256 samples, davon die ersten 128 nutzbar
    //sample 0 nicht benutzen (=DC)
    //60 leds = 2x 30 LEDS
    // --> samples 4 - 123 (=120 samples) / 30 = 4 samples / LED
    double led_values[30];
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = 0.0;
      for (uint8_t k = 0; k < 4; k++)
        led_values[j] += real[j * 4 + k + 4];
    }
	
	uint8_t start_index = static_cast<uint8_t>((millis() / 100) & 0xFF);

    //skalieren auf 0...255 und rausschreiben an die leds
    for (uint8_t j = 0; j < 30; j++) {
      led_values[j] = led_values[j] / 4095.0 * 255.0;

      //raussschreiben an die leds
      leds[30 + j] = ColorFromPalette( currentPalette, j + start_index, led_values[j], currentBlending);
      leds[29 - j] = ColorFromPalette( currentPalette, j + start_index, led_values[j], currentBlending);
    }

    FastLED.show();
  }
}
sollte einen laufenden effekt erzeugen.
Bearbeitet von wergor am 27.08.2020, 12:07

slateSC

The Suntoucher
Avatar
Registered: Jul 2004
Location: oö
Posts: 1256
Oh my gosh! Das sieht jetzt ultimativ nice aus :D

Beim Abspielen dieses Videos werden Daten an YouTube übermittelt. Durch einen Klick auf das Video wird es automatisch abgespielt und du akzeptierst damit die Datenschutzerklärung von YouTube bzw. Google.

Das:
Code:
uint8_t start_index = static_cast<uint8_t>((millis() / 100) & 0xFF);
hat jetzt alle "animationen" gestartet.
Die Geschwindigkeit lässt sich über die millis auch super regeln!

Das mit j * 4 funktioniert dann anscheinend wieder nur statisch.
Der Wert von j * 4 skalliert ja quasi die gesamte farbpalette von rot über zu gelb usw. usf.
Gibt es da eine möglichkeit auszuwählen an welcher Stelle die farbpalette beginnt?

Edit: habs nur falsch gschrieben ghabt. So funktionierts:
Code:
      leds[30 + j] = ColorFromPalette( currentPalette, j * 5 + start_index, BRIGHTNESS, currentBlending);
      leds[29 - j] = ColorFromPalette( currentPalette, j * 5 + start_index, BRIGHTNESS, currentBlending);;

Und eine letzte frage hätt ich noch: Gibt es ne Möglichkeit die Richtung der Animation umzukehren, sodass sie
sich nach außen ausbreitet und nicht nach innen?
Bearbeitet von slateSC am 27.08.2020, 19:22

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4137
Zitat aus einem Post von slateSC
Gibt es ne Möglichkeit die Richtung der Animation umzukehren, sodass sie sich nach außen ausbreitet und nicht nach innen?
probier mal das:
Code: C++
      leds[j] = ColorFromPalette( currentPalette, j * 5 + start_index, BRIGHTNESS, currentBlending);
      leds[59 - j] = ColorFromPalette( currentPalette, j * 5 + start_index, BRIGHTNESS, currentBlending);;
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz