Hallo zusammen,
der Thread ist zwar schon älter, aber ich habe was ähnliches vor... Mein Sketch ist ein wenig umfangreicher, jedoch funktioniert der Tastendruck nicht.. Kann das jemand testen? Oder sogar einen Fehler finden?
#include "FastLED.h" // Bibliothek der LEDs laden.
#include <EEPROM.h> // EEPROM-Lib für die Speicherung des aktuellen Zustandes
#define NUM_LEDS 63 // Wie viele LEDs sind in dem Strang verkettet?
#define DATA_PIN 7 // Welcher Pin gibt den Signalausgang?
#define debounce_delay 15 //Entprellzeit für den Taster
CRGB leds[NUM_LEDS];
bool taster_state, taster_state_alt; // Variablendeklaration (global)
const int tasterPin = 2; //Taster an Pin 2 angeschlossen
const int ledPin = 7; //Signalausgang
int lichtmodus = 0; //Variable für den Ablauf
int tasterStatus = LOW; //Variable zum Speichern des Tasterstatus
int einsLed = 63;
int LED = 0;
byte brightness = 255; // Helligkeit zwischen 0 und 255
long lWaitMillis = 0; // Hilfsvariable zur Zeitmessung bei effekten
uint8_t gHue = 0; // rotatierende "base color" von sämtlichen effekten
byte maxModi = 5; // Anzahl der Modi (ist modi der plural von modus?!)
int buttonState = LOW; // variable for reading the pushbutton status
int buttonread = 0;
void setup() // Folgende Funktion schaltet die LEDs und übermittelt die Informationen an den Arduino
{
// sanity check delay - allows reprogramming if accidently blowing power w/leds
delay(2000);
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
pinMode(ledPin, OUTPUT); //Setzt den LEDpin als Ausgang
pinMode(tasterPin, INPUT); //Setzt den Taster als Eingang
loadFromEEPROM(); // Lade werte aus dem EEPROM
AllOff(); // Egal welche LED zufällig leuchten sollte: ALLES AUS!
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(tasterPin, INPUT);
Serial.begin(9600);
}
void loop() {
// read the state of the pushbutton value:
buttonread = digitalRead(tasterPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonread == HIGH) { //Check if Button was pressed before and being pressed now
if (buttonState == LOW)
{
// turn LED on:
digitalWrite(ledPin, HIGH);
buttonState = HIGH;
Serial.println(tasterStatus);
}
}
else {
if (buttonState == HIGH) {
digitalWrite(ledPin, LOW);
buttonState = LOW;
}
}
getButtons();
FastLED.setBrightness(brightness);
switch (lichtmodus) // Hier werden die einzelnen voids für die Lichtprogramme aufgerufen. Jede Void hat ihren eigenen Takt in der eine aktualisierung stattfindet der nicht das komplette Programm blockt.
{
case 1:
modusOrange();
break;
case 2:
modus2();
break;
case 3:
modus3();
break;
case 4:
modus4();
break;
case 5:
modus5();
break;
}
}
void saveToEEPROM()
{
EEPROM.write(0, lichtmodus); // Speichere an Position 0 im EEPROM den lichtmodus
//EEPROM.write(1, brightness); // Speichere an Position 1 im EEPROM die helligkeit
}
void loadFromEEPROM()
{
lichtmodus = EEPROM.read(0);
//brightness = EEPROM.read(255);
}
void getButtons()
{
static uint32_t debounce_time;
if (millis()-debounce_time>debounce_delay)taster_state = digitalRead(tasterPin); //einlesen des Tasters
if (taster_state != taster_state_alt) // bei Pegelwechsel
{
debounce_time=millis();
taster_state_alt = taster_state;
if(!taster_state)//wenn Taster gedrückt
{
lichtmodus++; //Lichtmodus +1
if (lichtmodus > maxModi) lichtmodus = 0; //beim vierten Tastendruck fängt das ganze von vorne an
}
}
}
void AllOff()
{
fill_solid(leds, NUM_LEDS, CRGB::Black);
FastLED.show();
}
void modusOrange()
fill_solid(leds, NUM_LEDS, CRGB::Orange);
FastLED.show();
}
void modus2()
{
if ((long)(millis() - lWaitMillis) >= 0)
{
static byte heat[NUM_LEDS];
for (int i = 0; i < NUM_LEDS; i++) heat[i] = qsub8(heat[i], random8(0, ((55 * 10) / NUM_LEDS) + 2));
for (int k = NUM_LEDS - 1; k >= 2; k--) heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
if (random8() < 120) {
int y = random8(7);
heat[y] = qadd8(heat[y], random8(160, 255)); // FARBE
}
for (int j = 0; j < NUM_LEDS; j++)
{
CRGB color = HeatColor(heat[j]);
int pixelnummer;
pixelnummer = j;
leds[pixelnummer] = color;
}
lWaitMillis += 50; // GESCHWINDIGKEIT
}
FastLED.show();
}
void modus3()
{
fill_rainbow( leds, NUM_LEDS, gHue, 255 / NUM_LEDS);
}
void modus4()
{
// built-in FastLED rainbow, plus glitzer
modus3();
addGlitter(80);
}
void addGlitter( uint8_t chanceOfGlitter)
{
if ( random8() < chanceOfGlitter) {
leds[ random16(NUM_LEDS) ] += CRGB::White;
}
}
void modus5()
{
fadeToBlackBy( leds, NUM_LEDS, 20);
int pos = beatsin16(40, 0, NUM_LEDS); // ERSTER WERT = GESCHWINDIGKEIT
static int prevpos = 0;
if ( pos < prevpos ) {
fill_solid( leds + pos, (prevpos - pos) + 1, CHSV(gHue, 220, 255));
} else {
fill_solid( leds + prevpos, (pos - prevpos) + 1, CHSV( gHue, 220, 255));
}
prevpos = pos;
}
Habe das ganze mit dem Arduino ausprobiert und W2812B LEDs, welche ich selbst verlötet habe. Einen Fehler zeigt es mir keinen an. Beim ausprobieren, wird auch nicht auf den Taster reagiert und die Programme bzw. die LEDs spielen "verrückt".
Angschlossen wurde der Taster mit 10kOhm gegen Masse..