Hi All,
I'm attempting to implement a debounce algorithm for an old Western Electric Touchtone Phone Keypad. Everything is working properly except the debounce is a bit finicky.
Any thoughts?
// Arduino to keypad row, column
#define ROWA 10
#define ROWB 5
#define ROWC 9
#define ROWD 3
#define COLA 8
#define COLB 11
#define COLC 7
int row = -1;
int col = -1;
long time = 0;
long debounce = 40;
long keyStartTime = 0;
long debounceKeyTime = 200;
char keys[4][3] = {
{
'1','2','3' }
,
{
'4','5','6' }
,
{
'7','8','9' }
,
{
'*','0','#' }
};
void setup() {
pinMode (11, INPUT);
digitalWrite (11, 1);
pinMode (10, INPUT);
digitalWrite (10, 1);
pinMode (9, INPUT);
digitalWrite (9, 1);
pinMode (8, INPUT);
digitalWrite (8, 1);
pinMode (7, INPUT);
digitalWrite (7, 1);
pinMode (3, INPUT);
digitalWrite (3, 1);
pinMode (5, INPUT);
digitalWrite (5, 1);
// Phone Hook
pinMode (4, INPUT);
digitalWrite (4, 1);
Serial.begin(9600);
}
int hooksw, last_hooksw;
char last_key = -1;
void loop() {
// hookswitch debounce
if (digitalRead (4)) {
hooksw= 1;
time= millis() + debounce;
}
if (millis() > time) {
hooksw= 0;
}
if (hooksw != last_hooksw) {
last_hooksw= hooksw;
Serial.print("hook=");
Serial.println(hooksw);
}
if (hooksw) {
if ((keypress() != last_key) && keypress()) {
// TO DO
// ADD DEBOUNCE HERE
if (millis() - keyStartTime > debounceKeyTime) {
Serial.print("key=");
Serial.write(keypress());
Serial.println("");
keyStartTime = millis();
}
}
}
}
char keypress() {
int row = -1;
int col = -1;
if (! digitalRead (ROWA)) row = 0;
if (! digitalRead (ROWB)) row = 1;
if (! digitalRead (ROWC)) row = 2;
if (! digitalRead (ROWD)) row = 3;
if (! digitalRead (COLA)) col = 0;
if (! digitalRead (COLB)) col = 1;
if (! digitalRead (COLC)) col = 2;
if (row == -1 && col == -1) return (0);
return (keys[row][col]);
}
I'll get readouts like key=9 / key=# / key=9 etc....
Thanks in advance for any input!