#include<Keypad.h>
#include<LiquidCrystal_I2C.h>
const byte R = 4, C = 4;
char keys[R][C] = {
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
};
 
int wait = 2500;
byte rpin[R] = {4, 3, 2, 1};
byte cpin[C] = {8, 7, 6, 5};
Keypad keypad = Keypad(makeKeymap(keys), rpin, cpin, R, C);

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

LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
 
int W = 0, H = 0;
float BMI;
char state, ent = '#', rst = 'A', del = 'C';
String strw = "", strh = "";
 
void setup(){
    lcd.init();
    lcd.backlight();
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Kalkulator BMI");
    delay(5000);
    state = rst;
}
 
void loop(){
    if(state == rst){
      	lcd.clear();
        strw = ""; strh = "";
        lcd.setCursor(0, 0);
        lcd.print("Isi berat");
        lcd.setCursor(0, 1);
        lcd.print("Lalu tekan #");
        delay(wait);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Berat (kg): ");

        while((state = keypad.waitForKey()) != ent){
        strw += state;
        lcd.print(state);
        }
        
        if(state == ent){
            W = toint(strw);
            delay(wait);
 
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Isi tinggi");
            lcd.setCursor(0, 1);
            lcd.print("Lalu tekan #");
            delay(wait);
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Tinggi (cm): ");

            while((state = keypad.waitForKey()) != ent){
                strh += state;
                lcd.print(state);
          }
        }
 
            if(state == ent){
                H = toint(strh);
                delay(wait);
                lcd.clear();
                lcd.setCursor(0, 0);
                lcd.print("Hasil:");
 
                lcd.setCursor(7, 0);
                BMI = cnt(W, H);
              	lcd.print(BMI);
 
                lcd.setCursor(0, 1);
                if(BMI >= 30) lcd.print("OBESITAS");
                else if(BMI >= 25) lcd.print("BERAT BERLEBIH");
                else if(BMI >= 18.5) lcd.print("BERAT IDEAL");
                else lcd.print("BERAT RENDAH");
            }
        }
        delay(7000);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Tekan A");
      	lcd.setCursor(0, 1);
      	lcd.print("Untuk ulang");
        state = keypad.waitForKey();
        lcd.clear();
    }

 
int toint(String s){
    int ret = 0;
  	for(int i = 0; i < s.length(); ++i){
      	if(i == 0) ret = s[i] - '0';
      	else ret = ret * 10 + (s[i] - '0');
  	}
    return ret;
}
 
double cnt(int w, int h){
  	double ret = w;
  	ret *= 100;
  	ret /= h;
  	ret *= 100;
  	ret /= h;
    return ret;
}