#include <WiFi.h>
#include <FirebaseESP32.h>

#include <LiquidCrystal_I2C.h>

#define HOST "https://iot02-79cbd-default-rtdb.firebaseio.com/"
#define AUTH "C5GQ0XlIg7MMGT7fhW3NqAKkuo0g3ZQhalK3dJAQ"
#define SSID "Wokwi-GUEST"
#define PASS ""

#include "HX711.h"

#define trigPin 23
#define echoPin 36

#define I2C_ADDR    0x27
#define LCD_COLUMNS 20
#define LCD_LINES   4

int jarak = 0; 
float tinggi;
float unit;
float ons;
int Kg;

HX711 scale;

FirebaseData firebaseData;
FirebaseJson Data1;
FirebaseJson Data2;
FirebaseJson Data3;

LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);

void setup() {
  Serial.begin(115200);
  pinMode (trigPin, OUTPUT);
  pinMode (echoPin, INPUT);

  WiFi.begin(SSID, PASS);
  Serial.print("Menghubungkan Wi-Fi");
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(300);
  }
  Serial.println();
  Serial.print("terhubung dengan IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();

  Firebase.begin(HOST, AUTH);
  Firebase.reconnectWiFi(true);

  Firebase.setReadTimeout(firebaseData, 1000 * 60);
  Firebase.setwriteSizeLimit(firebaseData, "tiny");
  
  Serial.println("------------------------------------");
  Serial.println("Terhubung...");

  Serial.println("Initializing the scale");
  scale.begin(5, 4);

  lcd.init();
  lcd.backlight();
}

void loop() {
  tinggiBadan();
  beratBadan();

  float bbi = Kg / (tinggi * tinggi) * 10000;

  if (bbi > 18 && bbi < 23) {
    Serial.println("Berat Badan Normal");
    Data3.set("Index", "Normal");
    lcd.setCursor(0, 2);
    lcd.print("Berat Badan Normal");
  } else if (bbi > 23 && bbi < 27.5) {
    Serial.println("Berat Badan Berlebih");
    Data3.set("Index", "Berlebih");
    lcd.setCursor(0, 2);
    lcd.print("Berat Badan Berlebih");
  } else if (bbi < 18.5 ) {
    Serial.println("Berat Badan Kurang");
    Data3.set("Index", "Kurang");
    lcd.setCursor(0, 2);
    lcd.print("Berat Badan Kurang");
  } else if (bbi > 27.5) {
    Serial.println("Obesitas");
    Data3.set("Index", "Obesitas");
    lcd.setCursor(0, 2);
    lcd.print("Obesitas");
  }

  Data1.set("Tinggi", tinggi);
  Data2.set("Berat", Kg);

  Firebase.updateNode(firebaseData,"Hasil",Data1);
  Firebase.updateNode(firebaseData,"Hasil",Data2);
  Firebase.updateNode(firebaseData,"Hasil",Data3);

  lcd.setCursor(0, 0);
  lcd.print("Tinggi : ");
  lcd.setCursor(9, 0);
  lcd.print(tinggi);
  lcd.setCursor(17, 0);
  lcd.print("cm");
  lcd.setCursor(0, 1);
  lcd.print("Berat  : ");
  lcd.setCursor(9, 1);
  lcd.print(Kg);
  lcd.setCursor(17, 1);
  lcd.print("Kg");

  delay(1000);
}

void tinggiBadan() {
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);

  delayMicroseconds (10);

  digitalWrite(trigPin, LOW);
  duration = pulseIn (echoPin, HIGH);
  distance = (duration/2) / 29.1;

  tinggi = 200-distance;

  Serial.print("Tinggi badan anda ");
  Serial.print(tinggi); 
  Serial.println("cm");
}

void beratBadan() {
  unit = scale.get_units();
  ons = unit / 11.9067997;
  Kg = ons / 35.274;
  Serial.print(Kg);
  Serial.println(" Kg");
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
cell1:VCC
cell1:DT
cell1:SCK
cell1:GND
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL