#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Inisialisasi LCD dengan alamat I2C 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Konfigurasi Keypad 4x4
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Pin untuk baris keypad
byte colPins[COLS] = {5, 4, 3, 2}; // Pin untuk kolom keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
float weight = 0; // Variabel untuk menyimpan berat badan
float height = 0; // Variabel untuk menyimpan tinggi badan
bool inputWeight = true; // Untuk melacak apakah kita input berat atau tinggi
String inputString = ""; // String sementara untuk input
void setup() {
lcd.begin(16, 2); // Mulai LCD
lcd.backlight(); // Hidupkan backlight LCD
lcd.setCursor(0, 0);
lcd.print("BMI Calculator");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input weight (kg):"); // Minta input berat badan
}
void loop() {
char key = keypad.getKey(); // Baca tombol yang ditekan pada keypad
if (key) {
// Jika angka ditekan (0-9)
if (key >= '0' && key <= '9') {
inputString += key; // Tambah angka yang ditekan ke inputString
lcd.setCursor(0, 1);
lcd.print(inputString); // Tampilkan input di baris bawah LCD
}
// Jika tombol '#' ditekan untuk mengonfirmasi input
else if (key == '#') {
if (inputWeight) {
weight = inputString.toFloat(); // Konversi inputString menjadi float untuk berat
inputString = ""; // Reset inputString
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input height (cm):"); // Minta input tinggi badan
inputWeight = false; // Ganti ke mode input tinggi
} else {
height = inputString.toFloat(); // Konversi inputString menjadi float untuk tinggi
lcd.clear();
float bmi = calculateBMI(weight, height); // Hitung BMI
lcd.setCursor(0, 0);
lcd.print("BMI: ");
lcd.print(bmi, 2); // Tampilkan BMI dengan 2 angka desimal
lcd.setCursor(0, 1);
lcd.print(getBMICategory(bmi)); // Tampilkan kategori BMI
delay(5000); // Tampilkan hasil selama 5 detik
resetCalculator(); // Reset untuk input baru
}
}
// Jika tombol '*' ditekan untuk reset input
else if (key == '*') {
inputString = ""; // Reset inputString
lcd.setCursor(0, 1);
lcd.print(" "); // Kosongkan baris kedua
}
// Tombol A untuk menghapus angka terakhir (backspace)
else if (key == 'A') {
if (inputString.length() > 0) {
inputString = inputString.substring(0, inputString.length() - 1); // Hapus karakter terakhir
lcd.setCursor(0, 1);
lcd.print(inputString + " "); // Perbarui tampilan
}
}
// Tombol B untuk mereset input
else if (key == 'B') {
inputString = ""; // Kosongkan input
lcd.setCursor(0, 1);
lcd.print(" "); // Kosongkan baris kedua
}
// Tombol C untuk menampilkan petunjuk
else if (key == 'C') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input weight kg");
lcd.setCursor(0, 1);
lcd.print("# to confirm");
delay(3000); // Tampilkan petunjuk selama 3 detik
lcd.clear();
if (inputWeight) {
lcd.setCursor(0, 0);
lcd.print("Input weight (kg):");
} else {
lcd.setCursor(0, 0);
lcd.print("Input height (cm):");
}
}
// Tombol D untuk mereset kalkulator sepenuhnya
else if (key == 'D') {
resetCalculator(); // Reset kalkulator untuk input baru
}
}
}
// Fungsi untuk menghitung BMI
float calculateBMI(float weight, float height_cm) {
float height_m = height_cm / 100.0; // Konversi tinggi dari cm ke meter
return weight / (height_m * height_m); // Hitung BMI
}
// Fungsi untuk menentukan kategori BMI
String getBMICategory(float bmi) {
if (bmi < 18.5) {
return "Underweight";
} else if (bmi < 24.9) {
return "Normal";
} else if (bmi < 29.9) {
return "Overweight";
} else {
return "Obese";
}
}
// Fungsi untuk mereset kalkulator
void resetCalculator() {
inputWeight = true; // Kembali ke mode input berat
inputString = ""; // Reset inputString
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input weight (kg):"); // Minta input berat lagi
}
//Nila Ulya Zahrotul Himmah
//2023.03.0053