#include <LiquidCrystal_I2C.h>

#include <Keypad.h>

const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
  { '1', '2', '3', 'A' },
  { '4', '5', '6', 'B' },
  { '7', '8', '9', 'C' },
  { '*', '0', '#', 'D' }
};

char typedChars[8];
char typedbuffer[8];

uint8_t colPins[COLS] = { 9, 8, 7, 6 };      // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 13, 12, 11, 10 };  // Pins connected to R1, R2, R3, R4

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2

LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);

String typedString = "";

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.home();
}


void loop() {
  char key = keypad.getKey();



  if (key == '0' || key == '1') {
    typedString += key;
    lcd.print(key);
  }

  if (key == '#') {
    if (typedString.length() == 8) {
      typedString.toCharArray(typedbuffer, typedString.length() - 1);
      int value = 0;
      for (int i = 0; i < 8; i++)  // for every character in the string  strlen(s) returns the length of a char array
      {
        value *= 2;                          // double the result so far
        if (typedString[i] == '1') value++;  //add 1 if needed
      }
      Serial.print(typedString);
      Serial.print(" is ");
      Serial.print(value);
      Serial.print(" in digital.");
      Serial.println("");
      lcd.clear();
      lcd.home();
      lcd.print(value);
      delay(2000);
      lcd.clear();
      lcd.home();


      typedString = "";
    } else {
      Serial.println("Invalid 8-bit binary value!");
      lcd.clear();
      lcd.home();
      lcd.print("INVALID NUMBER!");
      delay(2000);
      lcd.clear();
      lcd.home();
      typedString = "";
    }
  }
}