Alright, I'll go have a look at that!
This is the encoder I got: http://uk.farnell.com/alps/ec11b15242/encoder-rotary-11mm-switch/dp/1191733?Ntt=1191733
And here's my code: (some of it is commented out, since I haven't connected those electronic parts yet).
/* read a rotary encoder with interrupts
Encoder hooked up with common to GROUND,
encoder0PinA to pin 2, encoder0PinB to pin 4 (or pin 3 see below)
it doesn't matter which encoder pin you use for A or B
uses Arduino pullups on A & B channel outputs
turning on the pullups saves having to hook up resistors
to the A & B channel outputs
*/
#define max_category 22
#define max_age 99
//encoder0
#define encoder0PinA 2 //interrupt 0 on pin 2
#define encoder0PinB 4
//encoder1
//#define encoder1PinA 3 //interrupt 1 on pin 3
//#define encoder1PinB 5
//rocker0
#define rocker0Pin 21 //interrupt 2 on pin 21
//keySwitch0
#define keySwitch0Pin 20 //interrupt 3 on pin 20
//button0
#define scanButtonPin 19 //interrupt 4 on pin 19
#define scanLedPin 6
#define scanTimeOut 3000
//button1
#define deleteButtonPin 18 //interrupt 5 on pin 18
//segment0
#define segment0PinA 43
#define segment0PinB 45
#define segment0PinC 27
#define segment0PinD 25
#define segment0PinE 23
#define segment0PinF 41
#define segment0PinG 39
#define segment0PinDP 29
int segment0Pins[8] = {
segment0PinA,
segment0PinB,
segment0PinC,
segment0PinD,
segment0PinE,
segment0PinF,
segment0PinG,
segment0PinDP
};
//segment1
#define segment1PinA 51
#define segment1PinB 53
#define segment1PinC 35
#define segment1PinD 33
#define segment1PinE 31
#define segment1PinF 49
#define segment1PinG 47
#define segment1PinDP 37
int segment1Pins[8] = {
segment1PinA,
segment1PinB,
segment1PinC,
segment1PinD,
segment1PinE,
segment1PinF,
segment1PinG,
segment1PinDP
};
/*
//segment2
#define segment2Pin1 38
#define segment2Pin2 39
#define segment2Pin3 40
#define segment2Pin4 41
#define segment2Pin5 42
#define segment2Pin6 43
#define segment2Pin7 44
#define segment2Pin8 45
//segment3
#define segment3Pin1 46
#define segment3Pin2 47
#define segment3Pin3 48
#define segment3Pin4 49
#define segment3Pin5 50
#define segment3Pin6 51
#define segment3Pin7 52
#define segment3Pin8 53
*/
//inverse
byte seven_seg_digits[10][7] = {
{ 0,0,0,0,0,0,1 }, // = 0
{ 1,0,0,1,1,1,1 }, // = 1
{ 0,0,1,0,0,1,0 }, // = 2
{ 0,0,0,0,1,1,0 }, // = 3
{ 1,0,0,1,1,0,0 }, // = 4
{ 0,1,0,0,1,0,0 }, // = 5
{ 0,1,0,0,0,0,0 }, // = 6
{ 0,0,0,1,1,1,1 }, // = 7
{ 0,0,0,0,0,0,0 }, // = 8
{ 0,0,0,1,1,0,0 } // = 9
};
volatile int encoder0Pos = 0;
volatile int encoder1Pos = 0;
volatile boolean rocker0Pos;
volatile boolean keySwitch0Pos;
volatile int fixCounter = 0;
void setup() {
//input / output
setupEncoders();
setupRocker();
setup7Segments();
setupScanButton();
setupKeySwitch();
setupDeleteButton();
//serial connection
Serial.begin(9600);
}
void setupEncoders() {
//encoder0
pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor
digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor
attachInterrupt(0, doEncoder0, CHANGE); // encoder interrupt 0 on pin 2
/*
//encoder1
pinMode(encoder1PinA, INPUT);
pinMode(encoder1PinB, INPUT);
digitalWrite(encoder1PinA, HIGH); // turn on pullup resistor
digitalWrite(encoder1PinB, HIGH); // turn on pullup resistor
attachInterrupt(1, doEncoder1, CHANGE); // encoder interrupt 1 on pin 3
*/
}
void setupRocker() {
//rocker0
pinMode(rocker0Pin, INPUT);
digitalWrite(rocker0Pin, HIGH); // turn on pullup resistor
attachInterrupt(2, doRocker0, CHANGE); // rocker interrupt 2 on pin 21
rocker0Pos = digitalRead(rocker0Pin); // can we do this here already? need to test it.
}
void setup7Segments() {
for(int i = 0; i < 8; i++) {
pinMode(segment0Pins[i], OUTPUT);
}
for(int i = 0; i < 8; i++) {
pinMode(segment1Pins[i], OUTPUT);
}
disableDots(); // start with the "dot" off
}
void setupScanButton() {
pinMode(scanButtonPin, INPUT);
digitalWrite(scanButtonPin, HIGH);
pinMode(scanLedPin, OUTPUT);
digitalWrite(scanLedPin, HIGH);
}
void setupKeySwitch() {
pinMode(keySwitch0Pin, INPUT);
digitalWrite(keySwitch0Pin, HIGH); // turn on pullup resistor
attachInterrupt(3, doKeySwitch, CHANGE); // rocker interrupt 2 on pin 21
keySwitch0Pos = digitalRead(keySwitch0Pin); // can we do this here already? need to test it.
}
void setupDeleteButton() {
pinMode(deleteButtonPin, INPUT);
digitalWrite(deleteButtonPin, HIGH);
attachInterrupt(5, doDeleteButton, FALLING);
}
void loop(){
if(digitalRead(scanButtonPin) == LOW) {
Serial.println("scanButtonPushed!");
digitalWrite(scanLedPin, LOW);
delay(scanTimeOut);
digitalWrite(scanLedPin, HIGH);
}
delay(10);
if(fixCounter < 100) { fixCounter++; }
}
//category
void doEncoder0() {
if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {encoder0Pos--;}
else {encoder0Pos++;}
if(encoder0Pos < 0) {encoder0Pos = max_category;}
if(encoder0Pos > max_category) {encoder0Pos = 0;}
Serial.println(encoder0Pos, DEC);
displayCategory(encoder0Pos);
}
//age
/*
void doEncoder1() {
if (digitalRead(encoder1PinA) == digitalRead(encoder1PinB)) {encoder1Pos++;}
else {encoder1Pos--;}
if(encoder1Pos < 1) {encoder1Pos = max_age;}
if(encoder1Pos > max_age) {encoder1Pos = 1;}
Serial.println(encoder1Pos, DEC);
displayAge(encoder1Pos);
}
*/
//gender
void doRocker0() {
rocker0Pos = digitalRead(rocker0Pin);
Serial.println(rocker0Pos, DEC);
}
//delete lock
void doKeySwitch() {
keySwitch0Pos = digitalRead(keySwitch0Pin);
}
//delete
void doDeleteButton() {
if(!keySwitch0Pos) {
Serial.println("delete");
}
}
void disableDots() {
digitalWrite(segment0PinDP, HIGH);
digitalWrite(segment1PinDP, HIGH);
//digitalWrite(segment2PinDP, LOW);
//digitalWrite(segment3PinDP, LOW);
}
void displayCategory(int category) {
int firstNumber = floor(category / 10);
int secondNumber = category % 10;
sevenSegWrite(0, firstNumber);
sevenSegWrite(1, secondNumber);
}
/*
void displayAge(int age) {
int firstNumber = floor(age / 10);
int secondNumber = age % 10;
sevenSegWrite(2, firstNumber);
sevenSegWrite(3, secondNumber);
}
*/
void sevenSegWrite(int segment, byte digit) {
switch(segment) {
case 0:
for(byte segCount = 0; segCount < 7; ++segCount) {
digitalWrite(segment0Pins[segCount], seven_seg_digits[digit][segCount]);
}
break;
case 1:
for(byte segCount = 0; segCount < 7; ++segCount) {
digitalWrite(segment1Pins[segCount], seven_seg_digits[digit][segCount]);
}
break;
}
}