Regenbogen mit WS2812

Hallo ich stehe mit der FastSPI Libary gerade etwas auf dem Schlauch. Ich möchte einen Regenbogeneffekt mit der Weite der angegeben Leds (NUM_LEDS) erzeugen.
Komme aber gerade nicht weiter, wie ich diese letzten Endes richtig zuweise. Derzeit macht er jeden Zyklus alle LEDs nacheinander.

Kurzes Beispiel:
1 Durchlauf rt; rt; rt; rt;
2 Durchlauf rt → gr; rt → gr; rt → gr; rt → gr;
3 Durchlauf gr → bl; gr → bl; gr → bl; gr → bl;

void regenbogen(uint8_t wZeit) 
{
	static uint8_t j;
	static uint8_t i;
	uint32_t aZeit = millis();

	static uint32_t vZeit;
	if(aZeit-vZeit > wZeit) 
	{
		if(j < 255) j++;
		else j = 0;
		vZeit = aZeit;
	}

	static uint32_t vZeit2;
	if(aZeit - vZeit2 > wZeit)
	{
		if(i < NUM_LEDS) i++;
		else i = 0;
		vZeit2 = aZeit;
	}

	if(j <= 85) {
		leds[i] = CRGB(j * 3, 255 - j * 3, 0);
	} else if(j <= 170) {
		leds[i] = CRGB(255 - j * 3, 0, j * 3);
	} else {
		leds[i] = CRGB(0, j * 3, 255 - j * 3);
	}

	FastLED.show();
}

Diese zwei if else Anweisungen (bei j++ und i++) haben garkeine geschweiften klammern?! Kann / darf man das so schreiben?

Ja. Wenn du nur einen Befehl ausführen möchtest geht das.

@Fr33man, ja darf und kann man machen :wink: Gilt natürlich nicht nur für if-Abfragen.

Habe eine Hilfestellung in einem Sketch von Elco’s ShiftPWM gefunden, entsprechend noch kurz angepasst an die FastSPI Lib und nun gehts.

#include <FastSPI_LED2.h>
#define NUM_LEDS 15
#define DATA_PIN 4
CRGB leds[NUM_LEDS];

#include <Streaming.h>  

void setup()
{
	// Serielle Schnittstelle
	Serial.begin(115200);
	// Konfiguration WS2812
	FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);
}


void loop()
{
	// regenbogen(uint32_t warteZeit, uint8_t saettigung, uint8_t hellwert)
	regenbogen(10000, 255, 255);
}

void regenbogen(uint32_t warteZeit, uint8_t saettigung, uint8_t hellwert)
	// warteZeit = Dauer um den Farbkreis einmal zu durchlaufen
	// saettigung = 0 - 255; 255 voll gesaettigte Farben
	// hellwert = 0 - 255; 255 volle Helligkeit
{
	uint32_t aktuelleZeit = millis();
	uint8_t farbverschiebung = (255 * aktuelleZeit / warteZeit) % 255;

	for(uint8_t led = 0; led < NUM_LEDS; led++)
	{
		uint8_t farbwert = (led * 255 / (NUM_LEDS - 1) + farbverschiebung) % 255;
		leds[led] = CHSV(farbwert, saettigung, hellwert);
	}
	FastLED.show();
}

Hab ein kleines Problem mit COM Monitor in Visual Studio 2012 Professional.

Ich ändere über einen Potentiometer die Helligkeitsstufe des LED Strips.
Werte unter 85 lasse ich als 0 interpretieren, da dort die Auflösung nicht reicht, das entsprechende Farbspektrum ansatzweise wiederzugeben.

In der Arduino IDE werden die Werte mir angezeigt sobald sich am Poti was tut. Nur in VS nicht wirklich. Das kompilierte Programm funktioniert mit dem Poti, nur die Anzeige im Monitor dazu passt nicht. Nach einem Reconnect innerhalb der VS geht er dann auf den aktuellen Wert und behält diesen.

Spielt sich in helligkeit() { …} ab

// Beleuchtung Jack Daniels No7 Regal
#include <Streaming.h>

#include <FastSPI_LED2.h>
#define NUM_LEDS 15
#define DATA_PIN 4
CRGB leds[NUM_LEDS];
uint16_t potPin = 0;


void setup()
{
	// Serielle Schnittstelle
	Serial.begin(115200);
	// Konfiguration WS2812
	FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);

}


void loop()
{
	// regenbogen(uint32_t warteZeit, uint8_t saettigung, uint8_t hellwert)
	regenbogen(5000, 255, helligkeit());
}


void regenbogen(uint32_t warteZeit, uint8_t saettigung, uint8_t hellwert)
	// warteZeit = Dauer um den Farbkreis einmal zu durchlaufen
	// saettigung = 0 - 255; 255 voll gesaettigte Farben
	// hellwert = 0 - 255; 255 volle Helligkeit
{
	uint32_t aktuelleZeit = millis();
	uint8_t farbverschiebung = (255 * aktuelleZeit / warteZeit) % 255;

	for(uint8_t led = 0; led < NUM_LEDS; led++)
	{
		uint8_t farbwert = (led * 255 / (NUM_LEDS - 1) + farbverschiebung) % 255;
		leds[led] = CHSV(farbwert, saettigung, hellwert);
	}
	FastLED.show();
}

uint8_t helligkeit()
{
	uint8_t potWert = analogRead(potPin) / 4;
	Serial << potWert << endl;
	if(potWert < 85) return 0;
	else return potWert;
}

In der Arduino IDE werden die Werte mir angezeigt sobald sich am Poti was tut. Nur in VS nicht wirklich.
Das kompilierte Programm funktioniert mit dem Poti, nur die Anzeige im Monitor dazu passt nicht.
Nach einem Reconnect innerhalb der VS geht er dann auf den aktuellen Wert und behält diesen.

Den letzten Satz versteh ich nicht ?

Dem Arduino ist es egal, wer an der anderen Seite von Serial liest.
Da wird dein VS - Programm was anderes machen als der SerialMonitor, wenn die sich unterschiedlich verhalten.

Auf Arduino Seite wäre höchstens zu klären, was operator << (Stream, uint8_t) genau macht.
Macht

Serial << (int)potWert << endl;

einen Unterschied ( im SerialMonitor? , in deinem VS - Programm ? )

Die Streaming Lib überläd eigentlich lediglich den << Operator mit inline Funktionen und ersetzt das << im Hintergrund durch Serial.print

Man könnte natürlich trotzdem mal probieren ob es direkt über Serial.print funktioniert.

Hab es, bevor ich das hier verfasst habe bereits getestet. Geht nicht.

Arduino IDE:
Startwert: 255
Poti wird nach 0 gedreht:255 ... 0

Visual Studio:
Startwert: 255
Poti wird nach 0 gedreht: 255

Er gibt keine Statusänderung aus. Der Wert an sich verändert sich aber intern, denn die LED werden auch entsprechend gedimmt so wie es soll.
Die Serielle Schnittstelle bleibt in VS visuell auf 255, in der Arduino IDE hingegen verhält sie sich so, wie es gewünscht ist.

Tja, dann würde ich mal mit dem Programmierer, der dein VS Programm gestrickt hat, reden :wink:
Oder es hier posten ...

VS => Visual Studio 2012 Professional. Weiß nicht wer der verantwortliche Programmierer bei M$ ist :smiley:

Verwendest du nicht das VisualMicro Plugin um darin Arduino zu programmieren? Das hat seinen eigenen Serial Monitor unter Tools.

Ich verwendet das VisualMicro Plugin. Der Serielle Monitor, der sich nach dem kompilieren und übertragen öffnet ist der besagte Serielle Montior von Tools > Visual Micro (Arduino 1.0.x) > Serial Monitor