Hi
Habe den Theseus->dony-Code Mal Probelaufen lassen.
Da ich nur WS2812B angeschlossen habe, wurde der Code etwas angepasst (damit nicht immer der ganze definierte RGB-Stripe mitblitzt - im Original also ganz ok).
Ich lasse die ersten 12 LEDs des Stripe 'als Stripe' laufen, die 'Anderen Pixel' als simulierte normale LEDs.
Mein Stripe hängt an Pin 13, weshalb die Pinne 5 und 13 Ihre Plätze tauschten - wurde in den Kommentaren aber erwähnt.
/*RGP-Stripes (WS2812B) + normale LEDs als Lauflicht.
*
* Die RGB-Strip-LEDs flimmern/blitzen/wechseln die Farbe ect.pp. non stop
* In jeder Runde wird auch das Lauflicht aufgerufen.
* Im Ursprungscode lief so das Lauflicht schneller, wenn die Schleife kürzer war (weniger Unterbrechungen durch stripe.show())
* Habe Das per millis() raus geholt.
*
* Die Lauflichtgeschwindigkeit ist mit 100 (100ms Pause zwischen den einzelnen Schritten) noch etwas größer, als möglich wäre
* Wenn Dir das Lauflicht also zu träge ist, kannst Du die wartezeit_lauflicht noch etwas verkleinern.
*
* Theseus->dony-Sketch überarbeitet und 'Probeblinken lassen' by postmaster_ino
* http://forum.arduino.cc/index.php?topic=527454.msg3597233#msg3597233
*/
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 13 //Hier hatte ich Deine 5 in meine 13 geändert
//weshalb hier auch die 5 auftaucht, aber die 13 nicht mehr - Du musst für Deinen Aufbau hier wieder die 5 zur Null machen und hinter der 12 eine 13 eintragen
byte pinArray[] = {0, 0, 0, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0};
const byte pinCount = 14; //Hier die Anzahl an Neopixel eintragen, Die als 'normale LED' dienen - also für Karnevall =0
const byte rgb_pixel = 12; //Hier die Anzahl an NeoPixel eintragen
Adafruit_NeoPixel strip = Adafruit_NeoPixel(rgb_pixel + pinCount, PIN, NEO_GRB + NEO_KHZ800);
byte activePin = 2;
int dx = 1;
uint16_t poti = 0;
uint32_t lastmillis;
uint32_t wartezeit_lauflicht = 100; //alle 100ms soll das Lauflicht 'Eins weiter'
void setup() { //Setup aus beiden Sketch zusammenkopiert
Serial.begin(9600);
for (int i = 0; i < pinCount; i++) {
if (pinArray[i] != 0) {
pinMode(pinArray[i], OUTPUT);
}
}
// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
// End of trinket special code
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void lauflicht() { //loop erster Sketch
if (millis() - lastmillis < wartezeit_lauflicht) {
return;
}
lastmillis+=wartezeit_lauflicht;
for (int i = 0; i < pinCount; i++) {
digitalWriteNot0(pinArray[i], LOW);
}
if (activePin == (pinCount - 1)) {
activePin = (pinCount - 2);
dx = -1;
}
if (activePin == 0) {
activePin = 1;
dx = 1;
}
activePin += dx;
poti = analogRead(0);
if (poti < 1023) {
digitalWriteNot0(pinArray[activePin], HIGH);
digitalWriteNot0(pinArray[activePin - dx], HIGH);
digitalWriteNot0(pinArray[activePin - 2 * dx], HIGH);
}
Serial.print(poti);
Serial.print(" - ");
Serial.println(activePin);
}
void digitalWriteNot0(int pin, boolean state) {
if (pin > 0) {
//digitalWrite(pin, state);
//hier RGB > Position 12 (bei 5, also +7) setzen/löschen - für die normalen LEDs das digitalWrite wieder rein nehmen und Das hier auskommentieren
strip.setPixelColor(pin + 7, state == true ? 0xFFFFFF : 0x000000);
}
}
void loop() {
// Some example procedures showing how to display to the pixels:
colorWipe(strip.Color(255, 0, 0), 50); // Red
colorWipe(strip.Color(0, 255, 0), 50); // Green
colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
// Send a theater pixel chase in...
theaterChase(strip.Color(127, 127, 127), 50); // White
theaterChase(strip.Color(127, 0, 0), 50); // Red
theaterChase(strip.Color(0, 0, 127), 50); // Blue
rainbow(20);
rainbowCycle(20);
theaterChaseRainbow(50);
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i < rgb_pixel; i++) { //strip.numPixels()
strip.setPixelColor(i, c);
strip.show();
lauflicht(); // hier eingefügt
delay(wait);
}
}
void rainbow(uint8_t wait) {
uint16_t i, j;
for (j = 0; j < 256; j++) {
for (i = 0; i < rgb_pixel; i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
}
strip.show();
lauflicht();
delay(wait);
}
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
for (i = 0; i < rgb_pixel; i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
lauflicht();
delay(wait);
}
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
for (int q = 0; q < 3; q++) {
for (uint16_t i = 0; i < rgb_pixel; i = i + 3) {
strip.setPixelColor(i + q, c); //turn every third pixel on
}
strip.show();
lauflicht();
delay(wait);
for (uint16_t i = 0; i < rgb_pixel; i = i + 3) {
strip.setPixelColor(i + q, 0); //turn every third pixel off
}
}
}
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
for (int j = 0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q = 0; q < 3; q++) {
for (uint16_t i = 0; i < rgb_pixel; i = i + 3) {
strip.setPixelColor(i + q, Wheel( (i + j) % 255)); //turn every third pixel on
}
strip.show();
lauflicht();
delay(wait);
for (uint16_t i = 0; i < rgb_pixel; i = i + 3) {
strip.setPixelColor(i + q, 0); //turn every third pixel off
}
}
}
}
// 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 strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
Hier blinkert's im Stripe-Bereich ganz furchterbar, da lobe ich mir den Lauflicht-Bereich
(der blinkert nicht ganz so hektisch).
Bringe die LEDs so an, daß Du davon nicht das Meiste siehst ... oder lasse das Bier weg, sonst 
Würde mir wünschen, wenn's Dich auch nach Karneval wieder hier vorbei spült - hast jetzt ja doch Deinen Sketch mundgerecht bekommen :o (bekommt hier lange nicht Jeder - quasi eine Ehre)
Viel Spaß damit und viele neidische Blicke
MfG
Edit
Theseus->dony Sketch, so viel Ehre muß sein! (hatte den Sketch irrtümlich nur dony in die Schuhe geschoben)
PS: Bis auf 50ms kannst Du runter gehen, eventuell auflaufende Ungenauigkeiten holt der Sketch bei den schnelleren Schleifen wieder auf.
Dazu habe ich mir eine kleine IF-Abfrage in die Pixel-Setz-Funktion integriert:
strip.setPixelColor(pin + 7, state == true ? wartezeit_last==wartezeit_lauflicht?0xFFFFFF:0xFF0000 : 0x000000);
Das setzt den entsprechenden 'Normal-LED-NeoPixel' auf Weiß, wenn die Wartezeit genau erreicht wurde, auf Rot, wenn wir uns verspätet haben und Schwarz, wenn der Pixel eh ausgeschaltet werden soll.
Vereinzelt blitzen weiße LEDs auf, so im Schnitt sind wir aber immer 10ms 'hinter der Zeit'.
Beim Start verschleppt sich Das bis auf knappe 300ms, Die wir 'zu spät sind', bei den kurzen Passagen wird diese Zeit aber wieder aufgeholt.
Wenn man Das nicht will, kann man auch
statt
lastmillis+=wartezeit_lauflicht;
eben
lastmillis=millis();
schreiben. Man hat dann zwar immer einen zeitlichen Versatz, Dieser wird aber nicht 'auf Biegen und Brechen' versucht, wieder aufzuholen.
So, soll erst Mal reichen.