This project is an automated health kiosk designed to measure a user's height and weight, calculate their Body Mass Index (BMI), and classify their health category. It utilizes a combination of load cells for mass measurement and a Time-of-Flight (ToF) laser sensor for height detection.
The system operates asynchronously, ensuring a responsive user interface, and includes a power-efficiency mode that automatically turns off the display and indicators when the scale is not in use.
- Accurate Weight Measurement: Utilizes four load cells in a Wheatstone bridge configuration with an HX711 amplifier.
- Laser Height Sensing: Employs a TOF10120 laser range sensor for contactless height measurement.
- Real-time BMI Calculation: Automatically calculates and classifies BMI (Underweight, Normal, Overweight, Obesity).
- Environmental Monitoring: Displays ambient temperature and humidity using a DHT11 sensor.
- Power Efficiency Mode: Enters a sleep state after 15 seconds of inactivity (weight < 2kg) and wakes up instantly when stepped on.
- Asynchronous Operations: Non-blocking I2C communication and sensor polling prevent UI freezing.
- Manual Tare/Reset: A dedicated hardware button allows for safe, software-level taring without hard-resetting the microcontroller.
- Arduino Uno (or compatible microcontroller)
- Breadboard & Jumper Wires
- DHT11 Temperature and Humidity Sensor
- TOF10120 Laser Range Sensor
- Active Buzzer
- Red LED
- Blue LED
- Yellow LED
- Tactile Push Button
- 3x 220k
$\Omega$ resistor - 10k
$\Omega$ resistor - I2C Module
- 20x4 I2C LCD Display
- HX711 Load Cell Amplifier Module
- 4x 50kg Half-Bridge Load Cells
| Component | Arduino Pin | Notes |
|---|---|---|
| I2C LCD (20x4) | A4 (SDA), A5 (SCL) |
I2C Address: 0x27 |
| TOF10120 Sensor | A4 (SDA), A5 (SCL) |
I2C Address: 0x52 (82 decimal) |
| HX711 Amplifier | D4 (DT/DOUT), D5 (SCK) |
Ensure load cells are wired correctly to E+/E-/A+/A- |
| DHT11 Sensor | D7 (DATA) |
Requires a 10k pull-up resistor if not on a breakout board |
| Push Button | D2 |
Connect to GND (uses internal pull-up INPUT_PULLUP) |
| Green LED | D13 |
Includes inline current-limiting resistor |
| Blue LED | D12 |
Includes inline current-limiting resistor |
| Red LED | D11 |
Includes inline current-limiting resistor |
| Yellow LED | D10 |
Includes inline current-limiting resistor |
| Active Buzzer | D9 |
Connect negative pin to GND |
Before compiling the code, ensure the following libraries are installed in your Arduino IDE:
- LiquidCrystal I2C by Frank de Brabander (For the 20x4 LCD).
- HX711_ADC by Olav Kallhovd (Provides advanced, non-blocking load cell functions).
- dht (Standard DHT11/DHT22 library for temperature and humidity).
Note: You can install these via the Arduino IDE Library Manager (Sketch -> Include Library -> Manage Libraries...).
- Assemble the hardware according to the pin wiring table above.
- Ensure the laser sensor is mounted perfectly parallel to the ground, facing downward.
- Open the provided
.inofile in the Arduino IDE. - Update the
SENSOR_HEIGHT_CMconstant in the code to match the exact physical height (in centimeters) from the floor/scale base to the lens of the TOF10120 sensor. - Calibrate your scale:
- Run a standard HX711 calibration sketch to find your specific calibration factor.
- Update the
CALIBRATION_VALUEconstant in the code (currently set to696.0).
- Compile and upload the code to your Arduino Uno.
EJ S. Ramirez

