#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>
#include <Keypad.h>
// Konfigurasi HX711
#define LOADCELL_DOUT_PIN 3
#define LOADCELL_SCK_PIN 2
HX711 scale;
// Konfigurasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Konfigurasi Keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'}, // 'A' for Calculate
{'4', '5', '6', 'B'}, // 'B' for Reset
{'7', '8', '9', 'C'}, // 'C' for Laki-laki
{'*', '0', '#', 'D'}, // 'D' for Perempuan
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Variabel untuk menyimpan input
int usia = 0;
char jenis_kelamin = 'C'; // 'C' untuk Laki-laki, 'D' untuk Perempuan
// Struktur data ideal
struct Ideal {
float berat_min;
float berat_max;
float tinggi_min;
float tinggi_max;
float lingkar_kepala_min;
float lingkar_kepala_max;
};
// Data bayi perempuan per usia
Ideal perempuan[19] = {
{3.2, 4.8, 49.8, 55.6, 35.3, 37.8}, // 1 bulan
{3.9, 5.8, 53.0, 59.1, 37.0, 39.5}, // 2 bulan
{4.5, 6.6, 55.6, 61.9, 38.2, 40.8}, // 3 bulan
{5.0, 7.3, 57.8, 64.3, 39.3, 41.9}, // 4 bulan
{5.4, 7.8, 59.6, 66.2, 40.1, 42.8}, // 5 bulan
{5.7, 8.2, 61.2, 68.0, 40.8, 43.5}, // 6 bulan
{6.0, 8.6, 62.7, 69.6, 41.5, 44.2}, // 7 bulan
{6.3, 9.0, 64.0, 71.1, 42.0, 44.7}, // 8 bulan
{6.5, 9.3, 65.3, 72.6, 42.4, 45.2}, // 9 bulan
{6.7, 9.6, 66.5, 73.9, 42.8, 45.6}, // 10 bulan
{6.9, 9.9, 67.7, 75.3, 43.2, 46.0}, // 11 bulan
{7.0, 10.1, 68.9, 76.6, 43.5, 46.3}, // 12 bulan
{7.6, 10.9, 72.0, 80.2, 44.2, 47.1}, // 15 bulan
{7.9, 11.4, 74.0, 82.5, 44.6, 47.5}, // 1.5 tahun
{9.0, 13.0, 79.3, 88.9, 45.7, 48.6} // 2 tahun
};
// Data bayi laki-laki per usia
Ideal laki[19] = {
{3.4, 5.1, 46.1, 60.6, 36.1, 38.5}, // 1 bulan
{4.3, 6.3, 50.8, 64.4, 37.9, 40.3}, // 2 bulan
{5.0, 7.2, 54.4, 67.6, 39.3, 41.7}, // 3 bulan
{5.6, 7.8, 59.7, 70.1, 40.0, 42.9}, // 4 bulan
{6.0, 8.4, 61.7, 56.7, 41.3, 43.8}, // 5 bulan
{6.4, 8.8, 63.3, 69.8, 42.1, 44.6}, // 6 bulan
{6.7, 9.2, 64.8, 71.3, 42.7, 45.3}, // 7 bulan
{6.9, 9.6, 66.2, 72.8, 43.2, 45.8}, // 8 bulan
{7.1, 9.9, 67.5, 74.2, 43.7, 46.3}, // 9 bulan
{7.4, 10.2, 68.7, 75.6, 44.1, 46.7}, // 10 bulan
{7.6, 10.5, 69.9, 76.9, 44.4, 47.1}, // 11 bulan
{7.7, 10.8, 71.0, 78.1, 44.7, 47.4}, // 12 bulan
{8.3, 11.5, 74.1, 81.7, 45.5, 48.2}, // 15 bulan
{8.6, 12.0, 76.0, 83.9, 45.8, 48.6}, // 1.5 tahun
{9.7, 13.6, 81.0, 90.2, 46.8, 49.7} // 2 tahun
};
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Keypad 4x4 Test");
// Menampilkan pesan selamat datang
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Welcome to");
lcd.setCursor(0, 1);
lcd.print("Project Diagnostik");
delay(4000); // Tampilkan pesan selama 4 detik
// Inisialisasi HX711
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
lcd.clear();
lcd.print("Kalibrasi...");
scale.set_scale();
scale.tare();
}
// Main program
void loop(void) {
char key = keypad.getKey();
if (key);
if (key >= '0' && key <= '9') {
// keypad lcd
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Key Pressed:");
lcd.setCursor(0, 1);
lcd.print(key);
delay(500); // Delay for stability
// Input usia
usia = usia * 10 + (key - '0');
lcd.clear();
lcd.print("Input Jenis Kelamin:");
} else if (key == 'A') {
// Pilih jenis kelamin laki-laki
jenis_kelamin = 'L';
lcd.clear();
lcd.print("Laki-laki");
} else if (key == 'B') {
// Pilih jenis kelamin perempuan
jenis_kelamin = 'P';
lcd.clear();
lcd.print("Perempuan");
} else if (key == 'C') {
// Hitung berat ideal
float berat_ideal = hitungBeratIdeal(usia, jenis_kelamin);
// Tampilkan berat ideal di LCD
lcd.clear();
lcd.print("Berat Ideal:");
lcd.setCursor(0, 1);
lcd.print(berat_ideal);
} else if (key == 'D') {
// Reset input
usia = 0;
jenis_kelamin = 'L';
lcd.clear();
lcd.print("Input Usia:");
// Menghasilkan suara buzzer sebanyak 3 kali dengan jeda 500ms
for (int i = 0; i < 3; i++) {
tone(10, 1000, 500); // Menghasilkan suara buzzer dengan frekuensi 1000Hz selama 500ms
delay(500); // Jeda antara setiap bunyi buzzer
}
}
}
// Fungsi untuk menghitung berat ideal berdasarkan usia dan jenis kelamin
float hitungBeratIdeal(int usia, char jenis_kelamin) {
float berat_ideal;
if (jenis_kelamin == 'L') {
// bayi laki-laki
if (usia == 1 || usia == 2 || usia == 3 || usia == 4 || usia == 5 || usia == 6 || usia == 7 || usia == 8 || usia == 9 || usia == 10 || usia == 11 || usia == 12 || usia == 15 || usia == 18 || usia == 24) {
berat_ideal = laki[usia - 1].berat_min + laki[usia - 1].berat_max / 2;
} else {
// usia lainnya
berat_ideal = laki[usia - 1].berat_min + laki[usia - 1].berat_max / 2;
}
} else if (jenis_kelamin == 'P') {
// bayi perempuan
if (usia == 1 || usia == 2 || usia == 3 || usia == 4 || usia == 5 || usia == 6 || usia == 7 || usia == 8 || usia == 9 || usia == 10 || usia == 11 || usia == 12 || usia == 15 || usia == 18 || usia == 24) {
berat_ideal = perempuan[usia - 1].berat_min + perempuan[usia - 1].berat_max / 2;
} else {
// usia lainnya
berat_ideal = perempuan[usia - 1].berat_min + perempuan[usia - 1].berat_max / 2;
}
}
return berat_ideal;
}