Rotary Encoder mit RGB LED

Um irgendwann die Lautstärke des 20W Verstärkers zu steuern habe ich mir einen Rotary Encoder bestellt. Der Encoder hat eine eingebaut RGB LED und der Drehknopf kann gedrückt werden. Nun ging es daran diesen zu testen.

Anschluß

Nach dem Studium des Datenblattes und ein paar Problemen mit der Gemeinsamen Anode des Buttons und der RGB-LED habe ich den Aufbau wie folgt umgesetzt:

Rotary Encoder_Steckplatine
image-229

 

  • Die Rote LED ist über einen 150 Ohm Wiederstand am Digitalen Eingang 3 angeschlossen. Die Grüne und die Blaue LED sind jeweils über 100 Ohm an Eingang 5 und 6. Wichtig ist das die Eingange PWM (Pulsweitenmodulation) unterstützen.
  • Der Button ist an A2 angeschlossen und über einen 10K Ohm am Ground.
  • Die gemeinsame Anode ist an 5V angeschlossen.
  • Die beiden Signalleitungen des Drehknopfes sind an A0 und A1 angeschlossen.
  • Der mittlere PIN an Ground.

Software

Um den Encoder anzusteuern benutze ich die “ClickEncoder” Bibliothek von 0xPIT.  Dafür ist auch noch die “TimerOne” Bibliothek notwendig. Zu finden bei Google code.

Ein Beispielprogramm habe ich mir kurz zusammengeschrieben. Es ist Systemadmistratoren freundlich ziemlich unstrukturiert von oben nach unten geschrieben. Es geht sicher auch schöner.

 

 


// https://github.com/0xPIT/encoder/tree/arduino -> Encoder Bibliothek
// http://playground.arduino.cc/Code/Timer1 -> TimerOne Bibliothek
// http://www.exp-tech.de/Zubehoer/Taste-Schalter/Rotary-Encoder-Illuminated-RGB-right-angle.html?XTCsid=9a3f86856f0072913f25faafbb094414
// https://www.sparkfun.com/products/10982
// http://www.circuitsathome.com/mcu/programming/reading-rotary-encoder-on-arduino

#include <ClickEncoder.h>
#include <TimerOne.h>
#include <Ethernet.h>

// ------------------------------------
// Encoder
// ------------------------------------

ClickEncoder *encoder;
int last, value;
void timerIsr() {
  encoder->service();
}

int LEDred = 3;
int LEDgreen = 5;
int LEDblue = 6;

int VALUEred = 0;
int VALUEgreen = 0;
int VALUEblue = 0;

int SELcolor = 1;

// ==========================================================================================================
//
// ==========================================================================================================

void setup() {

  Serial.begin(9600);

// ------------------------------------
// Encoder
// ------------------------------------
  encoder = new ClickEncoder(A1, A0, A2, 2, HIGH); //Rotary PIN-A, PIN-B, PIN-3, Anzahl der Steps, Knopf an 5V oder Ground
  Timer1.initialize(1000);
  Timer1.attachInterrupt(timerIsr);
  last = -1;
  encoder->setAccelerationEnabled(true);

  pinMode(LEDred, OUTPUT);
  pinMode(LEDgreen, OUTPUT);
  pinMode(LEDblue, OUTPUT);

  analogWrite(LEDred, 255);
  analogWrite(LEDgreen, 255);
  analogWrite(LEDblue, 255);

}

void loop() {
   if (SELcolor == 1) {
      VALUEred += encoder->getValue();
      if (VALUEred >= 256) VALUEred = 255;
      if (VALUEred < 0) VALUEred = 0;

   analogWrite(LEDgreen, 255);
   analogWrite(LEDblue, 255);
   if (VALUEred < 10) analogWrite(LEDred, 255);
   else analogWrite(LEDred, abs(VALUEred-255));
}

   if (SELcolor == 2) {
      VALUEgreen += encoder->getValue();
      if (VALUEgreen >= 256) VALUEgreen = 255;
      if (VALUEgreen < 0) VALUEgreen = 0;

      analogWrite(LEDred, 255);
      analogWrite(LEDblue, 255);
      if (VALUEgreen < 10) analogWrite(LEDgreen, 255);
     else analogWrite(LEDgreen, abs(VALUEgreen-255));
   }   

   if (SELcolor == 3) {
      VALUEblue += encoder->getValue();
      if (VALUEblue >= 256) VALUEblue = 255;
      if (VALUEblue < 0) VALUEblue = 0;

     analogWrite(LEDred, 255);
     analogWrite(LEDgreen, 255);
     if (VALUEblue < 10) analogWrite(LEDblue, 255);
     else analogWrite(LEDblue, abs(VALUEblue-255));
   }

   if (SELcolor == 4) {
      if (VALUEred < 10) analogWrite(LEDred, 255);
      else analogWrite(LEDred, abs(VALUEred-255));
      if (VALUEgreen < 10) analogWrite(LEDgreen, 255);
      else analogWrite(LEDgreen, abs(VALUEgreen-255));
      if (VALUEblue < 10) analogWrite(LEDblue, 255);
      else analogWrite(LEDblue, abs(VALUEblue-255));
    }

   ClickEncoder::Button b = encoder->getButton();
   if (ClickEncoder::Clicked) {
      SELcolor += 1;
      if (SELcolor == 5) SELcolor = 1;
   }

}

One Comment

  1. Dennis

    Hi,

    can you please help me out:

    I have wired everything like you did, except because of the 10kOhm resistor the working of the pushbutton is reversed. I got a tip that I need to change this in the code, but I don’t know how to fix the doubleclick!

    Can you please help me a bit?

    thanks!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.