Neopixel Ring mit WS2812 RGB LED mit Rotary Encoder Ansteuern

In diesem Tutorial möchte ich dir zeigen, wie du Neopixel RGB LED’s ansteuern kannst. Wir werden auch sehen wie du diverse Parameter mit einem Drehgeber oder auch Rotary Encoder genannt einfach einstellen kannst. In diesem Tutorial möchte ich euch auch noch kurz aufzeigen was ein Interrupt ist und wie dieser genutzt wird. Zuerst einmal möchte ich dir die verwendeten Hauptkomponenten vorstellen:


Neopixel WS2812 RGB LED

Ein normales RGB LED braucht normal drei Ausgänge um es anzusteuern und dies pro LED. Wenn du jetzt mehre solche LED's im Einsatz hast gehen dir schnell die Ausgänge auf deinem Arduino Board aus.  Deshalb setzte ich sehr gerne WS2812 RGB LED's ein da diese nur zwei Ausgänge verwenden. Ein weiterer Vorteil ist das die LED's Seriell verbunden werden können so ist es möglich das du 12 LED's seriell schaltest und diese mit nur zwei Ausgängen ansteuern kannst. Für die Ansteuerung gibt es eine einfache Library von Adafruit mit der du die RGB Farbe und Helligkeit von jedem Pixel individuell einstellen kannst. Somit lassen sich wunderschöne LED Effekte realisieren und dies mit minimalen Aufwand. Du kannst auch zwei LED Ringe mit je 12 LED's seriell schalten, es ist möglich alle unsere WS2812 LED's miteinander zu kombinieren. In der Library musst du am Anfang einfach angeben wie viele LED du Ansteuern willst. Anschliessend kannst du über die Position der LED's sie ansteuern.


KY-040 Rotary Encoder Drehgeber

Ein Drehgeber ist so etwas wie ein Drehschalter mit vielen Positionen. Wenn du den Drehgeber drehst gibt er zwei Signale ans Arduino Board retour mit denen die Drehrichtung und Position des Drehgeber bestimmt werden kann. Unser Drehgeber hat bei einer vollen Umdrehung 20 Impulsen also kann man 20 Positionen errechnen. Der Vorteil gegenüber einem Analogen Potentiometer ist das der Encoder unendlich lange gedreht werden kann ohne an einen Anschlag zu kommen. Weiter hat der Encoder noch einen eingebauten Taster der bei Druck auf den Drehknopf geschaltet wird. Somit ist es möglich einen Encoder mit verschiedenen Funktionen zu belegen und beim betätigen des Taster zwischen den Funktionen zu wechseln. Wir nutzen dies in unserem Beispiel das wir die Drehgeschwindigkeit der LED's einstellen können und wenn wir auf den Taster gedrückt haben die Helligkeit einstellen können.


Verwendete Produkte:


Verwendete Librarys

In unserem Programmbeispiel brauchen wir zwei Librarys die wir zuerst installieren müssen. Die Librarys findest du auf Github, falls du nicht weisst wie Librarys installiert werden findest du eine Anleitung in unserem Blog Artikel "Digitales Thermometer mit Hygrometer Bauanleitung für Arduino mit Si7021" Die Library findest du unter folgendem Link:


Interrupt

Bei dem Arduino haben wir die Möglichkeit einen Interrupt zu aktivieren. Ein Interrupt ist ein eine Reaktion die ausgelöst wird sobald das definierte Ereignis eintrifft. Verwendest du in deinem Programm zum Beispiel eine Verweilzeit mit der Funktion delay(2000) muss der Controller beim delay 2 Sekunden warten. Drückt man bei der Wartezeit einen Taster den man auslesen will geschieht nichts bis die zwei Sekunden abgelaufen sind. Definieren wir jedoch den Input wo der Taster angeschlossen ist als Interrupt wir bei einem Druck auf den Taster das delay verlassen und eine Funktion ausgeführt anschliessend wird der Rest der Wartezeit wieder abgewartet. In unserem Beispiel brauchen wir zwei Interrupts. Interrupt 1 wird ausgelöst sobald am Drehgeber gedreht wird und Interrupt 2 wird ausgelöst sobald der Drucktaster vom Drehgeber betätigt wird. 


Verdrahtung

Die Verdrahtung für das Programm Beispiel findest du hier:


Arduino UNO Programm für WS2812 mit Rotary Encoder

/*******************************************************************************************
 *******************************************************************************************
 **                                www.bastelgarage.ch                                    **
 ** Der Onlineshop mit Videoanleitungen und kompletten Bausätzen für Anfänger und Profis! **
 *******************************************************************************************
 *******************************************************************************************
 ** Programm Beispiel zum Ansteuern von Neopixel LED mit einem Rotary Encoder (Drehgeber) **
 ** Wir möchten in diesem Beispiel ein RGB LED ring mit 12x WS2812 LED's ansteuern.       **
 ** Mit dem Encoder soll die Drehgeschwindigkeit und die Helligkeit der LED's verstellt   **
 ** werden. Mit einem Druck auf den Encoder kann zwischen Geschwindigkeit und Helligkeit  **
 ** gewechselt werden. Für die LED wird die Adafruit_NeoPixel Library verwendet die du in **                                                                  
 ** der Arduin IDE under dem Library Manager findest. Für den Encoder habe ich die Library**
 ** von GitHub:                                                                           **
 ** https://github.com/mathertel/RotaryEncoder                                            **
 **                                                                                       **
 ** Autor: Philippe Keller                                                                **
 ** Datum: August 2016                                                                    **
 ** Version: 1.0                                                                          **
 * *****************************************************************************************
*/
/************************( Importieren der genutzten Bibliotheken )************************/
#include <Adafruit_NeoPixel.h>
#include <RotaryEncoder.h>
/******************************( Bibliotheken initialisieren )*****************************/
// Parameter 1 = Anzahl der verbauten RGB LED's
// Parameter 2 = Arduino Pin Nummer
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, 13, NEO_GRB + NEO_KHZ800);
RotaryEncoder encoder(A2, A3);
/****************************( Definieren der Globale Variablen )**************************/
int SpeedLed = 10;            // Initialwert für die Geschwindigkeit
int Helligkeit = 25;          // Initialwert für die Helligkeit (0 bis 50)
int SpeedLedMap = 10;         // Initialwert für die Skalierte Geschwindigkeit
bool EncoderSpeed = 1;        // Hilfs Bit Encoder auf Speed eingestellt
bool EncoderHelligkeit = 0;   // Hilfs Bit Encoder auf Helligkeit eingestellt
const int tasterEncoder = 3;  // Taster von Encoder auf Pin 3 (Pin3 = Interrupt 1)
/*****************************************( setup )****************************************/
void setup() {
  pinMode(tasterEncoder, INPUT);                       // Pin als Input definieren
  digitalWrite(tasterEncoder, HIGH);                   // Interner Pull Up Widerstand aktivieren
  attachInterrupt(1, TasterEncoderBetaetigt, FALLING); //Interrupt aktivieren für Pin3
  strip.begin();                                       // Neopixel LED Starten
  strip.show();                                        // Alle LED ausschalten
  encoder.setPosition(SpeedLed);                       // Encoder auf SpeedLed Wert einstellen
  PCICR |= (1 << PCIE1);                      // Bei Signalwechsel wird Interrupt 1 ausgeführt
  PCMSK1 |= (1 << PCINT10) | (1 << PCINT11);  // Interrupt aktivieren für pin A2 und A3
}
/*****************************( Interrupt Funktion für Encoder )***************************/
// Funktion die bei der auslössung von Interrupt 1 ausgeführt wird
ISR(PCINT1_vect) {
  encoder.tick(); // Encoder Tick aufrufen und Impulse Zählen
  
  if (encoder.getPosition() < 0) {  // Wenn Encoder Wert kleiner 0
    encoder.setPosition(0);         // Encoder auf 0 setzen (dient zum begrenzen)
  }
  if (encoder.getPosition() > 50) { // Wenn Encoder Wert grösser 50
    encoder.setPosition(50);        // Encoder auf 50 setzen (dient zum begrenzen)
  }
  if (EncoderSpeed == 1) {          // Wenn Encoder auf Speed Variable SpeedLed ändern
    SpeedLed = encoder.getPosition();
    SpeedLedMap =map(encoder.getPosition(), 0, 50, 0, 40);
  }
  else
  {
    Helligkeit = encoder.getPosition(); // Sonst Helligkeit ändern
  }
}
/*************************( Funktion wenn Taste Encoder gedrückt )************************/
void TasterEncoderBetaetigt() {
  if (EncoderSpeed == 1) {
    SpeedLed = encoder.getPosition();
    EncoderHelligkeit = 1;
    EncoderSpeed = 0;
    encoder.setPosition(Helligkeit);
  }
  else
  {
    Helligkeit = encoder.getPosition();
    EncoderHelligkeit = 0;
    EncoderSpeed = 1;
    encoder.setPosition(SpeedLed);
  }
}
/***********************************( Hauptprogramm )*************************************/
void loop() {
  rainbowCycle();
}

/*************************( Funktion für Regenbogenfarben )*******************************/
void rainbowCycle() {
  uint16_t i, j;
  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
          strip.setBrightness(map(Helligkeit, 0, 50, 5, 255));
    }
    strip.show();
    delay(SpeedLedMap);
  }
}
/************************( Funktion um RGB Farben zu erzeugen )***************************/
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);
}



Verbundene Suchwörter

Tutorial Anleitung Code Beispiel LED Arduino WS2812 Encoder Drehgeber Elektro Lernen Programm Beispiel

Kommentare

Hinweis: HTML ist nicht verfügbar!

Im Beitrag erwähnte Produkte

Neopixel Ring 12x WS2812 RGB LED

Neopixel Ring 12x WS2812 RGB LED

Dieser NeoPixel Ring ist mit kleinen RGB LED (5x5mm) bestückt. Auf der Rückseite sind Lötpads vorhan..

7,90CHF

KY-040 Rotary Encoder Drehgeber

KY-040 Rotary Encoder Drehgeber

Der Vorteil im Vergleich mit einem normalen Potentiometer ist, dass der Encoder endlos in eine Richt..

3,90CHF

Breadboard / Lochraster Steckplatine Half-Size

Breadboard / Lochraster Steckplatine Half-Size

Ein Breadboard, auch Steckplatine oder Steckboard in der Umgangssprache, wird zum Aufbauen von Elekt..

4,90CHF

Jumperkabel Dupont Set 10cm 60 Stk.

Jumperkabel Dupont Set 10cm 60 Stk.

Dupont Kabel dienen zum schnellen verbinden von Bauteilen. In der Umgangssprache werden Dupont Kabel..

4,90CHF

Arduino UNO kompatibles Board Atmega328

Arduino UNO kompatibles Board Atmega328

Dieses Arduino UNO kompatible Board ist sehr gut verarbeitet und auch qualitativ hochstehend. Dieses..

12,90CHF

Neopixel Rund 7x WS2812 RGB LED

Neopixel Rund 7x WS2812 RGB LED

Dieser NeoPixel ist mit Sieben kleinen RGB LED (5x5mm) bestückt. Auf der Rückseite sind Lötpads vorh..

5,50CHF

Neopixel Stick - 8x WS2812 RGB LED

Neopixel Stick - 8x WS2812 RGB LED

Dieser NeoPixel RGB LED Stick verfügt über 8 kleine RGB LED (5x5mm). Die LED’s sind bereits auf eine..

4,90CHF

Neopixel WS2812B RGB LED

Neopixel WS2812B RGB LED

Dieses NeoPixel ist mit einem kleinem RGB LED (5x5mm) bestückt. Das LED ist bereits auf eine kleine ..

0,90CHF

Neopixel Ring Set mit 8/12/16/24 Ringen WS2812 RGB LED

Neopixel Ring Set mit 8/12/16/24 Ringen WS2812 RGB LED

Dieses Set besteht aus verschiedenen grossen Neopixel Ringen die einfach ausgebrochen werden können...

21,00CHF

Neopixel Ring 16x WS2812B RGB LED

Neopixel Ring 16x WS2812B RGB LED

Dieser 16 Bit NeoPixel Ring ist mit kleinen RGB LED (5x5mm) bestückt. Auf der Rückseite sind Lötpads..

8,90CHF

Neopixel Ring 8x WS2812B RGB LED

Neopixel Ring 8x WS2812B RGB LED

Dieser 8 Bit NeoPixel Ring ist mit kleinen RGB LED (5x5mm) bestückt. Auf der Rückseite sind Lötpads ..

5,90CHF