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 und Arduino

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 mit Arduino für Rotary Encoder

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 WS2812 Neopixel und Rotary Encoder mit Arduino UNO

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);
}


Arduino CH340G Treiber Probleme Windows 8 / 10 und MAC
In diesem Blog Eintrag behandle ich allgemeine Treiber Probleme oder Fehler die du mit den Arduino Board haben kannst. Dieser Blog Eintrag wird ständi...
DOT Matrix 8x8 Wlan Display mit ESP8266 und Arduino
Programm Beispiel zum ansteuern von einem 8x8 DOT Matrix Display mit MAX7219 Treiber. Verbinde dich mit deinem Handy mit dem ESP8266 und schicke draht...
3 Bemerkungen
Patrick
Patrick

Guten Tag
Gehe ich richtig davon aus, dass das das Programm ist, welches auch für den Bausatz Lampe mit Gestensteuerung / Arduino verwendet wird?
Besten Dank im Voraus und Gruss, Patrick

Andreas
Andreas

Hallo, schöner beitrag :) kannst du mir vlt verraten was ich im code entfernen muss um NUR Dimmen zu können? werde dann andere Farb funktionen hinzufügen, normale vorgegebene RGB farben, die ich runterdimmen möchte. finde dazu einfach kein Beispiel. bei allen sind rainbow, kometen usw abläufe vorprogrammiert. Danke und Gruss

Philippe
Philippe

Hallo Andreas, Willst du den die Fixen Farben für das Neopixel auch über den Encoder ändern oder willst du mit dem Encoder nur noch die Helligkeit verstellen? Gruess Philippe

4711engel
4711engel

Ich habe gemäß Schaltskizze alles geschaltet. Ich verwende aber einen MEGA. Kompilieren fehlerfrei. Scheinbar ist aber der RotaryEncoder ohne Funktion. Egal wie die Stellung ist dreht sich beim NeoPixel-Ring der "Regenbogen". Auch Drücken ändert nichts. Ich kann sogar den Encoder entfernenn. Nichts verändert sich. Was könnte falsch sein?

Philippe
Philippe

Der Arduino MEGA hat eine andere Pinbelegung daher funktioniert es nicht. Falls den Sketch auf dem Mega Betreiben willst musst du anstelle von A2,A3 andere Interrupt Pins verwenden. Du kannst z.B die Pin's 8 und 9 für den Encoder verwenden, das wäre dann im Programm die Interrupt PCINT16 und PCINT17 die du anpassen musst. Für den Drucktaster kannst du den PIN20 nutzen und im Programm definieren tasterEncoder = 20 Gruess Philippe

Zeige 1 bis 1 von 3 (1 Seite(n))
Einen Kommentar hinterlassen
Anmerkung: HTML wird nicht unterstützt!