#include "HX711.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

#define SOUND_SPEED 0.034
long duration;
float distanceCm;
float distanceInch;
const int trigPin = 18;
const int echoPin = 5;

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 23;
const int LOADCELL_SCK_PIN = 19;

HX711 scale;

void setup() {
  Serial.begin(57600);
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  Serial.println(F("SSD1306 allocation failed"));
  for(;;);
  }
  delay(500);
  display.clearDisplay();
  display.setTextSize(1.2);
  display.setTextColor(WHITE);
}

void loop() {
  long reading;
  if (scale.is_ready()) {
   reading  = scale.read();
   
  } else {
    Serial.println("HX711 not found.");
  }

  int berat = map(reading,0,21000,0,200);
  Serial.print("Berat: ");
  Serial.print(berat);
  Serial.println("Kg");

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);

  distanceCm = duration * SOUND_SPEED/2;

  Serial.print("Distance (cm): ");
  Serial.println(distanceCm);

  display.clearDisplay();
  display.setCursor(0, 5);
  display.print("Tinggi :");
  display.print(distanceCm);
  display.print(" cm");
  //display.display();
  display.setCursor(0, 20);
  display.print("Berat  :");
  display.print(berat);
  display.print(" kg");
  display.display();

  double bmi = berat / ((distanceCm / 100.00) * (distanceCm / 100.00));
  display.setCursor(0, 35);
  display.print("BMI    :");
  display.print(bmi);
  display.display();
  display.setCursor(0, 50);
  display.print("Class  :");
  if(bmi < 18.5){
    display.print("Underweight");
  }
  else if(bmi >= 18.5 && bmi <= 24.9){
    display.print("Normal");
  }
  else if(bmi >= 25.0 && bmi <= 29.9){
    display.print("Overweight");
  }
  else if(bmi >= 30.0 && bmi <= 34.9){
    display.print("Obesity 1");
  }
  else if(bmi >= 35.0 && bmi <= 39.9){
    display.print("Obesity 2");
  }
  else if(bmi >= 40.0){
    display.print("Obesity 3");
  }
  display.display();
  delay(1000);
  
}