#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Initialize LCD (address: 0x27, 16 cols, 2 rows)
LiquidCrystal_I2C lcd(0x27, 16, 2);
class BMI {
private:
float weight; // in kilograms
float height; // in meters
public:
BMI(float w, float h) : weight(w), height(h) {}
float calculateBMI() {
return weight / (height * height);
}
void displayBMI(float bmi) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BMI: ");
lcd.print(bmi, 2); // Print BMI with 2 decimal places
lcd.setCursor(0, 1);
if (bmi < 18.5) {
lcd.print("Underweight");
} else if (bmi >= 18.5 && bmi < 24.9) {
lcd.print("Normal");
} else if (bmi >= 25 && bmi < 29.9) {
lcd.print("Overweight");
} else {
lcd.print("Obese");
}
}
};
// Ultrasonic sensor pins
const int trigPin = 7;
const int echoPin = 6;
void setup() {
Serial.begin(9600);
Serial.println("Program started."); // Add this for debugging
lcd.begin(16, 2); // Initialize LCD with 16 columns and 2 rows
lcd.backlight();
// Ultrasonic sensor pin modes
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.setCursor(0, 0);
lcd.print("Enter weight (kg)");
}
void loop() {
if (Serial.available() > 0) {
float weight = Serial.parseFloat(); // Read weight from serial input
float height = measureHeight();
if (weight > 0 && height > 0) {
BMI userBMI(weight, height);
float bmi = userBMI.calculateBMI();
userBMI.displayBMI(bmi);
}
}
}
// Function to measure height using ultrasonic sensor
float measureHeight() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2; // Convert to cm
// Convert to meters
return distance / 100.0;
}