I've been scrounging components and put together a test circuit with a 2-digit display (from a Sony DigiBeta tape deck) and a continuous scroll wheel (from a Panasonic VCR remote control). Arduino makes testing and learning about these components so easy!
For kicks, I recorded a video with Cycorder (iPhone, via Cydia) and uploaded it for sharing's sake:
The code is verbose and I wonder if anybody would suggest some tighter ways of achieving the same things; I find it confusing to dive into more complex examples, esp. the matrix stuff, and am still struggling with assigning the values I want to non-int data types.
Thanks in advance for any clues!
/* Scroll and Count test
by J.M. Saltzman
Interface with a scroll controller from a Panasonic VCR remote and a 2-digit 7-segment LED display from a Sony DigiBeta deck.
This will become the next version of the coffee grinder timer
v.1: 11/12/2008: Just starting: first task: count
second task: mess w/LED... that'll eat a lot of pins...:o
11/15/2008: Counting 0-99 on the display! Will keep code verbose for now
Got the scroller working-- simple! Adding different modes...
*/
// SCROLLER
int upPin = 16; // pin for scroll up direction
int dnPin = 17; // pin for scroll down direction
int upPinVal = 0;
int dnPinVal = 0;
int upPinLast = LOW;
int dnPinLast = LOW;
// 2-DIGIT LED DISPLAY
int ledPins[] = { 7, 6, 5, 0, 0, 4, 3, 2,15,14,13,12,11,10, 9, 8 }; // add 14 to analog pins
int numPins = 16;
// HORRIBLY INEFFICIENT BUT EFFECTIVE WAY TO GET NUMBERS OUT
int pos1poss[] = { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 };
int pos2poss[] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 };
int d0[] = { 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0 };
int d1[] = { 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0 };
int d2[] = { 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1 };
int d3[] = { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1 };
int d4[] = { 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1 };
int d5[] = { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1 };
int d6[] = { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 };
int d7[] = { 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0 };
int d8[] = { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int d9[] = { 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
// BUTTON
int btnPin = 19;
int btnVal = 0;
// VARS FOR DEBOUNCING
long time = 0; // the last time the output pin was toggled
long debounce = 200; // the debounce time, increase if the output flickers
int prev = 0; // previous value of debounce input
// PROGRAM VARS
int mode = 0; // 0: counting up, 1: counting down, 2: dialing, 3: rotating
int ct = 0; // count value
int ctDelay = 100;
int chaseVal = 0; // 0-7: chase position
// GENERAL VARS
int i; // for keeping track of things
int j; // for keeping track of ms maths
// UNUSED PINS
int unusedPins[] = {0, 1, 18}; // Need two more pins for grinder timer: second button and relay
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void setup() {
// SETUP SCROLL INPUT PINS
pinMode(upPin, INPUT);
pinMode(dnPin, INPUT);
// SET UP LED OUTPUTS
for (i = 0; i < numPins; i++) { // the array elements are numbered from 0 to num_pins - 1
if (ledPins[i] != 0) pinMode((ledPins[i]), OUTPUT);
}
// SET UP INPUT BUTTON
pinMode(btnPin, INPUT);
// WRITE ZEROES TO THE DIGITS
displayDigits(0);
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void loop() {
// DEBOUNCE BUTTON AND INCREMENT MODE
btnVal = digitalRead(btnPin);
if (btnVal == HIGH && prev == LOW && millis() - time > debounce) {
mode++;
if (mode > 4) mode=0;
time = millis();
}
prev = btnVal;
// COUNT UP
if (mode == 0) {
if (ct < 100) ct++;
else ct = 0;
delay(ctDelay);
}
// COUNT DOWN
else if (mode == 1) {
if (ct > -1) ct--;
else ct = 99;
delay(ctDelay);
}
// DIAL VALUE
else if (mode == 2) {
upPinVal = digitalRead(upPin);
dnPinVal = digitalRead(dnPin);
if ((upPinLast == LOW) && (upPinVal == HIGH)) ct++;
else if ((dnPinLast == LOW) && (dnPinVal == HIGH)) ct--;
ct = max(min(ct, 99), 0);
upPinLast = upPinVal;
dnPinLast = dnPinVal;
}
// CHASE
else if (mode == 3) {
displayChase(chaseVal);
chaseVal++;
if (chaseVal == 8) chaseVal = 0;
delay(ct);
}
// CHASE 2
else if (mode == 4) {
displayChase2(chaseVal);
chaseVal++;
if (chaseVal == 8) chaseVal = 0;
delay(ct);
}
// DISPLAY THE NUMBER
displayDigits(ct);
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void displayChase(int val) {
for (i = 0; i < numPins; i++) {
if (val == 0 && i==14) digitalWrite(ledPins[i], HIGH);
else if (val == 1 && i==9) digitalWrite(ledPins[i], HIGH);
else if (val == 2 && i==11) digitalWrite(ledPins[i], HIGH);
else if (val == 3 && i==7) digitalWrite(ledPins[i], HIGH);
else if (val == 4 && i==5) digitalWrite(ledPins[i], HIGH);
else if (val == 5 && i==2) digitalWrite(ledPins[i], HIGH);
else if (val == 6 && i==1) digitalWrite(ledPins[i], HIGH);
else if (val == 7 && i==13) digitalWrite(ledPins[i], HIGH);
else digitalWrite(ledPins[i], LOW);
}
}
void displayChase2(int val) {
for (i = 0; i < numPins; i++) {
if (val == 0 && (i==14 || i==9)) digitalWrite(ledPins[i], HIGH);
else if (val == 1 && (i==9 || i==11)) digitalWrite(ledPins[i], HIGH);
else if (val == 2 && (i==11 || i==7)) digitalWrite(ledPins[i], HIGH);
else if (val == 3 && (i==7 || i==5)) digitalWrite(ledPins[i], HIGH);
else if (val == 4 && (i==5 || i==2)) digitalWrite(ledPins[i], HIGH);
else if (val == 5 && (i==2 || i==1)) digitalWrite(ledPins[i], HIGH);
else if (val == 6 && (i==1 || i==13)) digitalWrite(ledPins[i], HIGH);
else if (val == 7 && (i==13 || i==14)) digitalWrite(ledPins[i], HIGH);
else digitalWrite(ledPins[i], LOW);
}
}
void displayDigits(int val) {
int pos2digit = val%10;
int pos1digit = (val-pos2digit)/10;
displayDigit(1, pos1digit);
displayDigit(2, pos2digit);
}
void displayDigit(int pos, int digit) {
for (i = 0; i < numPins; i++) {
if (pos == 1) {
if (digit == 0) { if (pos1poss[i] && d0[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 1) { if (pos1poss[i] && d1[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 2) { if (pos1poss[i] && d2[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 3) { if (pos1poss[i] && d3[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 4) { if (pos1poss[i] && d4[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 5) { if (pos1poss[i] && d5[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 6) { if (pos1poss[i] && d6[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 7) { if (pos1poss[i] && d7[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 8) { if (pos1poss[i] && d8[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 9) { if (pos1poss[i] && d9[i]) digitalWrite(ledPins[i], HIGH);
else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
}
else if (pos == 2) {
if (digit == 0) { if (pos2poss[i] && d0[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 1) { if (pos2poss[i] && d1[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 2) { if (pos2poss[i] && d2[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 3) { if (pos2poss[i] && d3[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 4) { if (pos2poss[i] && d4[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 5) { if (pos2poss[i] && d5[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 6) { if (pos2poss[i] && d6[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 7) { if (pos2poss[i] && d7[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 8) { if (pos2poss[i] && d8[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
if (digit == 9) { if (pos2poss[i] && d9[i]) digitalWrite(ledPins[i], HIGH);
else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
}
}
}