OK. ich Teile den Code auf 2 Teile auf.
Teil 1 - >
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(36, PIN, NEO_GRB + NEO_KHZ800);
const int dsIPin[5] = {8,9,10,11,12}; // drehschalterInputPins
byte lichtEffekt = 0; // kein Lichteffekt gewählt
byte Dir = 0; // Dir = die Bewegungsrichtung des Lauflichts. (-1 = links; 0 = stop; +1 = rechts)
byte Step = 1; // Schrittweite, zeigt an um wieviele pixel das Lauflicht in einem Schritt wandert
bool Init = true; // Init aktiviert die initialisierung des jeweiligen Lichteffektes
bool keyRelease = true; // ist true,wenn Taste wieder losgelassen wurde
bool llichtRun = false; // wird benutzt um zu unterscheiden ob Richtungstaste das Erste oder Zweite mal gderueckt
int Interval = 0; /* Verzögerung beim Lauflicht in Millisekunden Von einem Pixel zum nächsten.
(0=kein lauflicht) je kleiner der Wert, desto schneller läuft das Lauflicht. */
unsigned long IntervalStart;
void setup() {
IntervalStart = millis();
strip.begin();
strip.show();
pinMode(3,INPUT_PULLUP); // Taste LINKS, mit internem pullup Widerstand
pinMode(4,INPUT_PULLUP); // Taste STOP, mit internem pullup Widerstand
pinMode(5,INPUT_PULLUP); // Taste RECHTS, mit internem pullup Widerstand
for (int i=0; i<5; i++){
pinMode(dsIPin[i],INPUT_PULLUP); // Pins an denen der Drehschalter hängt auf Input und Pullup-Widerstand einschalten
}
}
void loop() {
if(readButton(3)) {
if (llichtRun == false && keyRelease == true) { // Taste das erste mal gedrückt
lichtEffekt = readDSwitch(); // lichtEffekt erhält die Position des Drehschalters. (1-5)
Init = true; // bei 'true' wird der Lichteffekt Initialisiert und gestartet.
Dir = 1; // "Links"
callLichtEffekt(lichtEffekt); // Lichteffekt ausführen
llichtRun = true; // merken dass lichteffekt gestartet
keyRelease = false; // Taste noch nicht wieder losgelassen
}
else if (llichtRun == true && keyRelease == true) { // Taste das 2. mal gedrückt
Interval = 0; // Interval aussschalten , Lauflicht anhalten
Dir = 0; // Richtung auf 0 ( keine Laufrichtung)
clearStrip(); // Strip löschen
lichtEffekt = 0; // Kein LichtEffekt gewählt
llichtRun = false; // Taste für erneuten start vorbereiten
}
}
if(readButton(4) && keyRelease == true) { // "Stop" - Taste gedrückt
Interval = 0; // Interval aussschalten , Lauflicht anhalten
Dir = 0; // Richtung auf 0 ( keine Laufrichtung)
stop(); // 'Stopp'-Band anzeigen
keyRelease = false; // Taste noch nicht wieder losgelassen
llichtRun = false; // Richtungstasten für erneuten Start vorbereiten
lichtEffekt = 0; // Kein LichtEffekt gewählt
}
if(readButton(5)) {
if (llichtRun == false && keyRelease == true) { // Taste das erste mal gedrückt
lichtEffekt = readDSwitch(); // lichtEffekt erhält die Position des Drehschalters. (1-5)
Init = true; // bei 'true' wird der Lichteffekt Initialisiert und gestartet.
Dir = -1; // "Links"
callLichtEffekt(lichtEffekt); // Lichteffekt ausführen
llichtRun = true; // merken dass lichteffekt gestartet
keyRelease = false; // Taste noch nicht wieder losgelassen
}
else if (llichtRun == true && keyRelease == true) { // Taste das 2. mal gedrückt
Interval = 0; // Interval aussschalten , Lauflicht anhalten
Dir = 0; // Richtung auf 0 ( keine Laufrichtung)
clearStrip(); // Strip löschen
lichtEffekt = 0; // Kein LichtEffekt gewählt
llichtRun = false; // Taste für erneuten start vorbereiten
}
}
if ((readButton(3) + readButton(4) + readButton(5) == 0) && keyRelease == false) keyRelease = true; /* gedrückte Taste
wurde losgelassen */
if (Interval && (millis() - IntervalStart >= Interval)) callLichtEffekt(lichtEffekt); /* bei laufenden Lichtern
nächsten Schritt ausführen */
}
//Ende der Schleife (loop)
//
byte readDSwitch() { // Fragt den Drehschalter ab
byte dsp=0; // hilfsvariable DrehSchalterPosition
for(int n=0; n<5; n++) {
if(digitalRead(dsIPin[n]) == LOW) { // DrehSchalterInputs nacheinander abfragen, wenn LOW, Schalterposition gefunden
dsp = n+1; // dsp bekommt nun den Positionswert (1-5)
break; // Schleife verlassen, weil Pos gefunden
}
}
return dsp; //Positionswert zurückgeben
}
//
int readButton(int pin) { // Taste einlesen
if(digitalRead(pin) == LOW) { // Analog Eingang abfragen
delay(150); // Wartezeit zum erneut abfragen
if(digitalRead(pin) == LOW) // Analog Eingang erneut abfragen
return 1; // war gedrückt
}
return 0; // war nicht gedrückt
}
// Strip löschen (all LED's off)
void clearStrip() {
for(int i=0; i<strip.numPixels(); i++) { // Schleife in der Länge des NeoPixel-Strip
strip.setPixelColor(i,strip.Color(0,0,0)); // Pixel Ausschalten
strip.show();
}
}
//
// Funktion STOP
// zuerst alle Pixel aus, dann die mittleren 6 auf Rot
void stop() {
clearStrip(); // Habe das löschen des Strip's in eine eigene Funktion gepackt, da mehrfach benötigt.
for(int i=0; i<6; i++) {
strip.setPixelColor(15+i,strip.Color(150,0,0));
strip.show();
}
}
void callLichtEffekt(byte LiEf) { // LiEf enthält die Nummer der auszuführenden Funktion
switch(LiEf){
case 1:
run3Points();
break;
case 2:
// Lichteffekt 2 ausführen
lichtEffekt2();
break;
case 3:
// Lichteffekt 3 ausführen
lichtEffekt3();
break;
case 4:
// Lichteffekt 4 ausführen
lichtEffekt4();
break;
case 5:
richtung();
break;
}
IntervalStart = millis();
}
//
-> ende Teil 1