#include "MultitapKeypad.h"
#include <LiquidCrystal_I2C.h>
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
const byte ROW0 = 5;
const byte ROW1 = 7;
const byte ROW2 = 8;
const byte COL0 = 9;
const byte COL1 = 4;
const byte COL2 = 6;
bool hold = false;
bool encoderCheck = false;
int encoder_value = 0;
// matrix 3 x 3 keypad and key for keypad object
MultitapKeypad kpd( ROW0, ROW1, ROW2, COL0, COL1, COL2);
Key key;
//screen init
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void setup() {
lcd.init();
lcd.backlight();
pinMode(ENCODER_CLK, INPUT); //pin2 for encoder clock
pinMode(ENCODER_DT, INPUT); //pin3 for encoder data
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
Serial.begin(9600);
Serial.println( F( "Keypad test" ) );
lcd.print("Keypad test:");
lcd.setCursor(0, 1); //x,y
lcd.print("Press key");
}
void loop() {
check_buttons();
//Serial.println("go");
if (encoderCheck) {
Serial.println("encoder checker passed");
encoderCheck = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Encoder ");
lcd.setCursor(0, 1);
lcd.print( encoder_value );
}
}
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
encoderCheck = true;
encoder_value++;
Serial.println("++");
}
if (dtValue == LOW) {
encoderCheck = true;
encoder_value--;
Serial.println("--");
}
}
void check_buttons() {
key = kpd.getKey();
if ( key.character > 0 && key.character < 250) {
switch ( key.state ) {
case KEY_DOWN:
hold = false;
break;
case LONG_TAP:
hold = true;
Serial.print( F( "Key " ) );
Serial.print( char( key.character ) );
Serial.println( F( " pressed long" ) );
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Key ");
lcd.print( char( key.character ) );
lcd.setCursor(0, 1);
lcd.print( F( " pressed long" ) );
break;
case KEY_UP:
if (!hold) {
Serial.print( F( "Key " ) );
Serial.print( char( key.character ) );
Serial.println( F( " pressed short" ) );
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Key ");
lcd.print( char( key.character ) );
lcd.setCursor(0, 1);
lcd.print( F( " pressed short" ) );
}
break;
}
}
}