#include <HX711.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
HX711 scale;
// Pin
#define DT 4
#define SCK 5
#define TRIG 6
#define ECHO 7
#define BTN_NEXT 8
#define BTN_OK 9
#define BUZZ 11
int gender = 0;
int usia = 1;
float berat, tinggi;
// ambang aktifasi
const float BEBAN_MIN = 0.1; // 100 gram
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BTN_NEXT, INPUT_PULLUP);
pinMode(BTN_OK, INPUT_PULLUP);
pinMode(BUZZ, OUTPUT);
scale.begin(DT, SCK);
scale.set_scale(2150.f);
scale.tare();
lcd.init();
lcd.noBacklight(); // LCD awal kondisi mati
lcd.clear();
}
float bacaTinggi() {
digitalWrite(TRIG, LOW);
delayMicroseconds(5);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long dur = pulseIn(ECHO, HIGH);
return dur * 0.034 / 2;
}
void buzzerNormal(){
for(int i=0;i<2;i++){
tone(BUZZ,1000); delay(200);
noTone(BUZZ); delay(200);
}
}
void buzzerBahaya(){
tone(BUZZ, 1000); delay(2000);
noTone(BUZZ);
}
void tungguAdaBayi() {
// LCD dimatikan
lcd.noBacklight();
lcd.clear();
// Tunggu sampai berat >= 100 gram
while (scale.get_units(5) < BEBAN_MIN) {
delay(50);
}
lcd.backlight();
}
void loop() {
// ==========================
// WAIT FOR BABY (LCD OFF)
// ==========================
tungguAdaBayi();
// ==========================
// PILIH GENDER
// ==========================
lcd.clear();
lcd.setCursor(0,0); lcd.print("Pilih Gender");
while (digitalRead(BTN_OK) == HIGH) {
if (digitalRead(BTN_NEXT) == LOW) {
gender = !gender;
delay(250);
}
lcd.setCursor(0,1);
lcd.print(gender == 0 ? "Laki-laki " : "Perempuan ");
}
delay(300);
// ==========================
// PILIH USIA
// ==========================
lcd.clear();
lcd.setCursor(0,0); lcd.print("Pilih Usia");
while (digitalRead(BTN_OK) == HIGH) {
if (digitalRead(BTN_NEXT) == LOW) {
usia++;
if (usia > 24) usia = 1;
delay(250);
}
lcd.setCursor(0,1);
lcd.print("Usia: ");
lcd.print(usia);
lcd.print(" bln ");
}
delay(300);
// ==========================
// BACA SENSOR
// ==========================
berat = scale.get_units(10);
tinggi = bacaTinggi();
lcd.clear();
lcd.setCursor(0,0); lcd.print("BB:");
lcd.print(berat,1); lcd.print("kg");
lcd.setCursor(0,1); lcd.print("TB:");
lcd.print(tinggi,1); lcd.print("cm");
delay(1500);
// ==========================
// DIAGNOSE
// ==========================
float bb_min = 3;
float bb_max = 10;
float tb_min = 40;
float tb_max = 100;
lcd.clear();
lcd.setCursor(0,0);
if(berat>=bb_min && berat<=bb_max && tinggi>=tb_min && tinggi<=tb_max){
lcd.print("Status NORMAL");
buzzerNormal();
}
else if(berat < bb_min){
lcd.print("Under/Stunting");
buzzerBahaya();
}
else{
lcd.print("Over/Obesitas");
buzzerBahaya();
}
delay(2000);
// ==========================
// TUNGGU BAYI DIANGKAT
// ==========================
while (scale.get_units(5) >= BEBAN_MIN) {
delay(100);
}
// LCD mati lagi → standby
lcd.noBacklight();
lcd.clear();
}