#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pin definitions for ultrasonic sensor
const int trigPin = 5; // Trigger pin
const int echoPin = 18; // Echo pin
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
// Variables
float height = 0.0; // in meters
float weight = 0.0; // in kg
float bmi = 0.0;
long duration;
float distance;
void setup() {
// Initialize Serial communication
Serial.begin(115200);
lcd.init();
lcd.backlight();
// Configure ultrasonic sensor pins
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Initial LCD display
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BMI Calculator");
delay(500);
}
float measureHeight() {
// Clear trigger pin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Send 10μs pulse
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Measure the response
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2;
float personHeight = (250 - distance) / 100; // Convert cm to m
return personHeight;
}
void calculateBMI() {
bmi = weight / (height);
}
void displayBMI() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Height: ");
lcd.print(height, 2);
lcd.print("m");
lcd.setCursor(0, 1);
lcd.print("BMI: ");
lcd.print(bmi, 1);
Serial.print(bmi);
}
void loop() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter weight(kg):");
// Wait for weight input from Serial
while (!Serial.available()) {
delay(100);
}
if (Serial.available() > 0) {
weight = Serial.parseFloat();
Serial.print("Weight entered: ");
Serial.print(weight);
Serial.println(" kg");
// Measure height
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Measuring height");
delay(100);
height = measureHeight();
Serial.print("Measured height: ");
Serial.print(height);
Serial.println(" m");
// Calculate and display BMI
calculateBMI();
displayBMI();
// Wait before next measurement
delay(2000);
}
}