i got it working, but did write my "own" little library based on some others... and yes, it has to be connected to ground. Heres the library code:
cpp-header-file:
/******************************************************************************
* RotaryEncoder.h - Arduino library for reading RotaryEncoder encoders.
* Version 0.90
******************************************************************************/
#ifndef RotaryEncoder_h
#define RotaryEncoder_h
#define DIGITAL_PINS (13)
class RotaryEncoder
{
public:
RotaryEncoder(int encoderPin1, int encoderPin2, int buttonPin);
void minimum(int min);
int minimum(void);
void maximum(int max);
int maximum(void);
void nominimum(void);
void nomaximum(void);
int position(void);
void position(int pos);
int pressed(void);
static void isr(void);
private:
int _readEncoderPins(void);
int _readButtonPin(void);
int _encoderPin1, _encoderPin2, _buttonPin;
volatile int _position;
int _min, _max;
bool _usingmin, _usingmax, _buttonState, _buttonPrevious;
volatile int _previous, _time;
static RotaryEncoder* _instance;
};
inline void RotaryEncoder::minimum(int min)
{
_min = min;
_usingmin = 1;
// adjust position if lower than new minimum
//_position = max(_position, min);
_position = _position > min ? _position : min;
}
inline int RotaryEncoder::minimum()
{
return _min;
}
inline void RotaryEncoder::maximum(int max)
{
_max = max;
_usingmax = 1;
// adjust position if higher than new maximum
//_position = min(_position, max);
_position = _position < max ? _position : max;
}
inline int RotaryEncoder::maximum()
{
return _max;
}
inline void RotaryEncoder::nominimum(void)
{
_usingmin = 0;
}
inline void RotaryEncoder::nomaximum(void)
{
_usingmax = 0;
}
inline int RotaryEncoder::position(void)
{
return _position;
}
inline void RotaryEncoder::position(int pos)
{
_position = pos;
}
inline int RotaryEncoder::pressed(void)
{
return _buttonState;
}
#endif // RotaryEncoder_h
cpp-file:
/******************************************************************************
* RotaryEncoder.cpp - Arduino library for reading RotaryEncoder encoders.
* Version 0.90
******************************************************************************/
#include "RotaryEncoder.h"
extern "C" {
#include <inttypes.h>
#include <avr/interrupt.h>
#include "WConstants.h" //all things wiring / arduino
}
const int _quadrature [4][4] = {
{ 0, 0, 0, 0 }, // 00 -> 10 is silent CW
{ 1, 0, 0, 0 }, // 01 -> 00 is CW
{ -1, 0, 0, 0 }, // 10 -> 11 is CW
{ 0, 0, 0, 0 } // 11 -> 01 is silent CW
};
RotaryEncoder * RotaryEncoder::_instance;
RotaryEncoder::RotaryEncoder(int encoderPin1, int encoderPin2, int buttonPin)
: _encoderPin1(encoderPin1), _encoderPin2(encoderPin2), _buttonPin(buttonPin), _position(0), _min(0), _max(0), _usingmin(0), _usingmax(0), _buttonState(0), _buttonPrevious(0), _time(0) // constructor initializer list
{
pinMode(encoderPin1, INPUT);
pinMode(encoderPin2, INPUT);
pinMode(buttonPin, INPUT);
digitalWrite(encoderPin1, HIGH); // activate internal pullups
digitalWrite(encoderPin2, HIGH);
digitalWrite(buttonPin, HIGH);
_previous = _readEncoderPins(); // read initial position
TIMSK2 |= (1 << TOIE2); // enable timer 2 overflow interrupt
_instance = this;
}
inline int RotaryEncoder::_readEncoderPins(void)
{
return digitalRead(_encoderPin2) << 1 | digitalRead(_encoderPin1);
}
inline int RotaryEncoder::_readButtonPin(void)
{
return digitalRead(_buttonPin) == HIGH ? 0 : 1;
}
inline void RotaryEncoder::isr(void)
{
//____________________________________________
// Read Encoder
int quadbits = _instance->_readEncoderPins();
if (quadbits != _instance->_previous)
{
int position = _instance->_position + _quadrature[_instance->_previous][quadbits];
// limit to minimum if assigned
position = _instance->_usingmin ? max(_instance->_min, position) : position;
// limit to maximum if assigned
_instance->_position = _instance->_usingmax ? min(_instance->_max, position) : position;
_instance->_previous = quadbits;
}
//____________________________________________
// Read Button
int reading = _instance->_readButtonPin();
// if we just pressed the button (i.e. the input went from LOW to HIGH),
// and we've waited long enough since the last press to ignore any noise...
if (reading != _instance->_buttonPrevious)// && millis() - _instance->_time > 100)
{
_instance->_buttonState = reading;
// ... and remember when the last button press was
//_instance->_time = millis();
}
_instance->_buttonPrevious = reading;
}
ISR(TIMER2_OVF_vect)
{
RotaryEncoder::isr();
}
Ciao Sunny