#define BLYNK_TEMPLATE_ID "TMPL6Rk-Po8Vk"
#define BLYNK_TEMPLATE_NAME "BMI"
#define BLYNK_AUTH_TOKEN "7hRQKr3JmMEOZgEQnQsYlbKZf0ktsOMW"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h> // Library Blynk untuk ESP32
#include "HX711.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Ultrasonic
#define TRIG_PIN 12
#define ECHO_PIN 14
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// HX711
HX711 scale;
uint8_t dataPin = 2;
uint8_t clockPin = 4;
// Wi-Fi credentials
char ssid[] = "Wokwi-GUEST"; // Ganti dengan SSID Wi-Fi
char pass[] = ""; // Ganti dengan Password Wi-Fi
void setup() {
// Serial Monitor
Serial.begin(115200);
// Blynk Initialization
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// LCD Initialization
lcd.init();
lcd.backlight();
// Ultrasonic Initialization
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// HX711 Initialization
scale.begin(dataPin, clockPin);
scale.set_offset(4294963012);
scale.set_scale(25.637112);
scale.tare(10);
// Splash Screen
lcd.setCursor(0, 0);
lcd.print("BMI");
delay(1000);
lcd.clear();
}
void loop() {
Blynk.run(); // Jalankan koneksi ke Blynk
// Membaca data sensor
int height = ultrasonicRead();
int weight = loadcell();
float bmi = calculateBMI(height, weight);
String category = getBMICategory(bmi);
// Tampilkan hasil di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BMI:");
lcd.print(bmi);
lcd.setCursor(0, 1);
lcd.print(category);
// Kirim data ke Blynk
Blynk.virtualWrite(V0, height); // Kirim BMI ke Virtual Pin V0
Blynk.virtualWrite(V1, weight); // Kirim tinggi ke Virtual Pin V1
Blynk.virtualWrite(V2, bmi); // Kirim berat ke Virtual Pin V2
delay(1000);
}
int loadcell() {
if (scale.is_ready()) {
int unitkg = scale.get_units(1) / 1000;
return unitkg > 0 ? unitkg : 45;
} else {
return 0;
}
}
int ultrasonicRead() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = (duration * 0.0343) / 2;
return distance > 0 ? (int)distance : 0;
}
float calculateBMI(int height, int weight) {
if (height > 0) {
float heightM = height / 100.0;
return weight / (heightM * heightM);
}
return 0;
}
String getBMICategory(float bmi) {
if (bmi < 18.5) {
return "Underweight";
} else if (bmi >= 18.5 && bmi <= 24.9) {
return "Healthy";
} else if (bmi >= 25.0 && bmi <= 29.9) {
return "Overweight";
} else {
return "Obese";
}
}