Die beiden Taster sollen je eine Folge von leuchtenden LEDs in verschiedenen Farben auslösen. Dabei soll der jeweils andere Taster den Programmablauf unterbrechen und „seine“ Folge leuchtender LEDs starten.
Der NeoPixel-Ring besteht aus mehreren miteinander verbundenen RGB-LEDs. Jede besitzt einen eigenen Controller und kann einzeln angesteuert werden. Er benötigt nur einen digitalen Eingang. Der NeoPixel-Ring ist in verschiedenen Bauformen zwischen 12 und 60 LEDs erhältlich.
Die Programmierung unterscheidet sich nicht. Es muss nur die Anzahl der LEDs angepasst werden.
RGB ist eine Mischung der Farben Rot, Grün und Blau. Jede Farbe kann von 0 bis 255 gesetzt werden, die Werte werden durch Kommata getrennt.
🔗RGB-Codes (externer Link abgerufen am 06.03.23)
Beispiele:
Benötigte Bauteile:
- NeoPixel-Ring
- 2 Taster
- Leitungsdrähte
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Achte auf die Polung. Sie kann bei den NeoPixel-Ringen verschiedener Hersteller unterschiedlich sein.
Jede LED kann einzeln angesprochen werden.
Die Zählung beginnt mit 0!
Benötigte Bibliothek:
Sketch → Bibliothek einbinden → Bibliotheken verwalten
Funktionen der Bibliothek Adafruit_NeoPixel (Auswahl)
Schlüsselwort | Aktion |
---|---|
begin() | LED-Ring starten |
numPixels() | Anzahl der LEDs lesen |
show() | LED-Ring einschalten |
clear() | LED-Ring ausschalten |
setPixelColor(LED-Nummer, rot, grün, blau) | Farbe einer LED setzen LED-Nummer rot -> 0 - 255 grün -> 0 - 255 blau -> 0 - 255 |
setBrightness() | Helligkeit setzen (0−255) |
Color(rot, grün, blau) | Farbe für alle LEDs setzen rot -> 0 - 255 grün -> 0 - 255 blau -> 0 - 255 Beispiel rot: int Farbe = LEDStreifen.Color(255, 0, 0); Beispiel grün: int Farbe = LEDStreifen.Color(0, 255, 0); Beispiel blau: int Farbe = LEDStreifen.Color(0, 0, 255); |
fill(Farbe, Start, Ende) | Farbe für die mit Start und Ende bezeichneten Pixel setzen |
Probiere die folgenden Beispiele:
Farbwechsel
# include "Adafruit_NeoPixel.h"
# define RING 7
// Anzahl der LEDs → muss angepasst werden
# define AnzahlLED 32
// LEDRing -> Name des LED-Rings
Adafruit_NeoPixel LEDRing(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);
void setup()
{
// setBrightness(0..255)
LEDRing.setBrightness(200);
// NeoPixel Bibliothek initialisieren
LEDRing.begin();
}
void loop()
{
// rot
LEDRing.fill(LEDRing.Color(255, 0, 0), 0, AnzahlLED);
LEDRing.show();
delay(1000);
// grün
LEDRing.fill(LEDRing.Color(0, 255, 0), 0, AnzahlLED);
LEDRing.show();
delay(1000);
// blau
LEDRing.fill(LEDRing.Color(0, 0, 255), 0, AnzahlLED);
LEDRing.show();
delay(1000);
// gelb
LEDRing.fill(LEDRing.Color(255, 255, 0), 0, AnzahlLED);
LEDRing.show();
delay(1000);
// pink
LEDRing.fill(LEDRing.Color(255, 20, 147), 0, AnzahlLED);
LEDRing.show();
delay(1000);
LEDRing.clear();
LEDRing.show();
delay(2000);
}
"Jagdeffekt":
# include "Adafruit_NeoPixel.h"
int RING = 7;
// Anzahl der LEDs -> muss angepasst werden
int AnzahlLED = 32;
// LED-Ring -> Name des LED-Rings
Adafruit_NeoPixel LEDRing(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);
void setup()
{
// NeoPixel Bibliothek initialisieren
LEDRing.begin();
// setBrightness(0..255)
LEDRing.setBrightness(200);
}
void loop()
{
int WarteZeit = 100;
for (int ii = 0; ii < 3; ii ++)
{
for (int i = 0; i < LEDRing.numPixels(); i += 3)
{
// jede dritte LED einschalten
// 0, 0, 255 -> blau RGB-Farbcode
LEDRing.setPixelColor(i + ii, 0, 0, 255);
}
LEDRing.show();
delay(WarteZeit);
for (int i = 0; i < LEDRing.numPixels(); i += 3)
{
// jede dritte LED ausschalten
LEDRing.setPixelColor(i + ii, 0);
}
}
}
Ein Programmablauf kann nur unterbrochen werden, wenn jedem Taster ein Interrupt zugeordnet wird.
Definiere die Variablen und binde die benötigte Bibliothek ein. Beachte die Kommentare.
# include "Adafruit_NeoPixel.h"
# define RING 7
// Anzahl der LEDs -> muss angepasst werden
# define AnzahlLED 32
// Variable für den gedrückten Taster
volatile bool Links = false;
volatile bool Rechts = false;
// Minimum/Maximum für die Farbwerte festlegen
# define Minimum 0
# define Maximum 255
// Leuchtdauer der LEDs
# define Wartezeit 50
// LED-Ring -> Name des LED-Rings
Adafruit_NeoPixel LEDRing(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);
// Taster definieren
# define TASTERLINKS 2
# define TASTERRECHTS 3
Der setup-Teil. Beachte die Kommentare.
void setup()
{
// Zufallsgenerator starten
randomSeed(analogRead(A0));
// NeoPixel Bibliothek initialisieren
LEDRing.begin();
// setBrightness(0..255)
LEDRing.setBrightness(200);
LEDRing.clear();
LEDRing.show();
pinMode(TASTERLINKS, INPUT_PULLUP);
pinMode(TASTERRECHTS, INPUT_PULLUP);
// Funktion für das Auslösen des Interrupts definieren
// Taster links
attachInterrupt(digitalPinToInterrupt(TASTERLINKS), LEDSchaltenLinks, CHANGE);
// Taster rechts
attachInterrupt(digitalPinToInterrupt(TASTERRECHTS), LEDSchaltenRechts, CHANGE);
}
Der loop-Teil. Beachte die Kommentare.
void loop()
{
// linke Taste gedrückt
if (Links)
{
// zufällige Farbwerte
int ROT = ZufallsFarbe();
int GRUEN = ZufallsFarbe();
int BLAU = ZufallsFarbe();
/*
feste Farbwerte:
ROT:
int ROT = 255;
int GRUEN = 0;
int BLAU = 0;
----------------
GRUEN
int ROT = 0;
int GRUEN = 255;
int BLAU = 0;
-----------------
BLAU
int ROT = 0;
int GRUEN = 0;
int BLAU = 255;
-----------------
GELB
int ROT = 255;
int GRUEN = 255;
int BLAU = 0;
*/
for (int LEDNummer = 0; LEDNummer <= LEDRing.numPixels() ; LEDNummer++)
{
LEDRing.setPixelColor(LEDNummer, LEDRing.Color(ROT, GRUEN, BLAU));
LEDRing.show();
// Unterbrechung wenn der rechte Taster gedrückt wurde
if (Rechts) break;
delay(Wartezeit);
}
// zurück LEDs ausschalten
for (int LEDNummer = LEDRing.numPixels(); LEDNummer >= 0 ; LEDNummer--)
{
LEDRing.setPixelColor(LEDNummer, 0);
LEDRing.show();
// Unterbrechung wenn der rechte Taster gedrückt wurde
if (Rechts) break;
delay(Wartezeit);
}
/*
wenn der Streifen nach einem Durchlauf nicht stoppen soll:
// Links = false;
*/
Links = false;
LEDRing.clear();
LEDRing.show();
}
// rechte Taste gedrückt
if (Rechts)
{
int ROT = ZufallsFarbe();
int BLAU = ZufallsFarbe();
int GRUEN = ZufallsFarbe();
for (int LEDNummer = LEDRing.numPixels(); LEDNummer >= 0 ; LEDNummer--)
{
LEDRing.setPixelColor(LEDNummer, LEDRing.Color(ROT, BLAU, GRUEN));
LEDRing.show();
// Unterbrechung wenn der rechte Taster gedrückt wurde
if (Links) break;
delay(Wartezeit);
}
// LEDs ausschalten
for (int LEDNummer = LEDRing.numPixels(); LEDNummer >= 0 ; LEDNummer--)
{
LEDRing.setPixelColor(LEDNummer, 0);
LEDRing.show();
// Unterbrechung wenn der linke Taster gedrückt wurde
if (Links) break;
delay(Wartezeit);
}
/*
wenn der Ring nach einem Durchlauf nicht stoppen soll:
// Rechts = false;
*/
Rechts = false;
LEDRing.clear();
LEDRing.show();
}
}
Die Funktion ZufallsFarbe() ermittelt zufällige Farbwerte.
int ZufallsFarbe()
{
int Farbe = random(0, 255);
return Farbe;
}
Jetzt fehlen noch die Funktionen LEDSchaltenRechts() und LEDSchaltenLinks(). Sie tun nichts anderes als den Zustand der Taster mit true/false zu markieren.
void LEDSchaltenRechts()
{
Rechts = true;
Links = false;
}
void LEDSchaltenLinks()
{
Links = true;
Rechts = false;
}
Verwandte Anleitungen:
- Interrupt: Lauflicht
- Interrupt - Lauflicht mit Drehgeber
- Interrupt: Licht ein- und ausschalten
- Interrupt: Licht schalten mit Bewegungsmelder
- Interrupt: Morsegerät
- Interrupt: Lauflicht mit Fernbedienung
Letzte Aktualisierung: