IoT Health Monitor for Final Year Project: Complete Guide
An IoT-based health monitoring system is one of the most impactful final year project topics for Indian engineering students — it combines electronics, signal processing, wireless communication, and cloud software into a complete system that directly addresses India’s healthcare infrastructure gaps. With only 0.7 hospital beds per 1,000 people (versus WHO recommendation of 3.5) and a severe shortage of nurses for continuous patient monitoring, low-cost wearable IoT health monitors have genuine deployment potential in primary health centres, old-age homes, and home care settings.
This guide covers a complete IoT health monitoring system: pulse oximetry (SpO2), heart rate, temperature, and fall detection sensors; ESP32 firmware with MQTT reporting; a cloud dashboard with alerting; and the project report structure that earns distinction grades in Indian engineering colleges.
System Architecture
The IoT health monitor has three components:
- Wearable Node: ESP32 with MAX30102 (SpO2/HR), DS18B20 or MLX90614 (body temperature), MPU6050 (accelerometer for fall detection), and a small LiPo battery. Wrist or chest-worn band.
- WiFi/MQTT Transmission: ESP32 connects to hospital/home WiFi and publishes readings via MQTT every 30 seconds. Alert conditions (SpO2 below 95%, fall detected) trigger immediate publish.
- Monitoring Dashboard: Node-RED + InfluxDB + Grafana (self-hosted) or ThingSpeak (cloud). Shows real-time vital signs, historical trends, and sends Telegram/email alerts to caregivers.
Key design consideration for India: Many rural primary health centres have intermittent electricity and WiFi. Add a local SD card logger and a 7-segment or OLED display so vital signs are readable locally even without cloud connectivity. Sync to cloud when connection is available.
Recommended Product
ESP32 Development Board
The ESP32’s dual-core processor handles sensor reading on Core 1 and WiFi/MQTT on Core 0 simultaneously — preventing data loss during WiFi reconnection events. Onboard Bluetooth also enables future expansion to phone-based monitoring apps without hardware changes.
Sensor Selection and Accuracy
| Vital Sign | Sensor | Accuracy | Cost |
|---|---|---|---|
| Heart Rate + SpO2 | MAX30102 | ±2 bpm, ±2% SpO2 | Rs. 250 |
| Body temperature | MLX90614 IR | ±0.5°C | Rs. 400 |
| Body temperature | DS18B20 (contact) | ±0.5°C | Rs. 120 |
| Motion/fall | MPU6050 6-axis IMU | ±2g / ±250 dps | Rs. 100 |
| Room environment | DHT22 | ±0.5°C, ±2% RH | Rs. 120 |
Important disclaimer for project reports: These sensors are not medical-grade (CE/FDA certified). Explicitly state in your project report that this is a research prototype for academic purposes and has not been validated for clinical use. This is legally required and also demonstrates intellectual honesty that examiners appreciate.
MAX30102: Heart Rate and SpO2 Code
The MAX30102 uses two LEDs (red and infrared) to measure blood oxygen saturation and pulse via photoplethysmography:
#include <Wire.h>
#include <MAX30105.h>
#include <heartRate.h>
#include <spo2_algorithm.h>
MAX30105 particleSensor;
uint32_t irBuffer[100];
uint32_t redBuffer[100];
int32_t spo2, heartRate;
int8_t validSPO2, validHeartRate;
void setup() {
Wire.begin();
particleSensor.begin(Wire, I2C_SPEED_FAST);
particleSensor.setup(50, 4, 2, 100, 411, 4096);
// brightness=50, avg=4, mode=2(SpO2), rate=100 sps,
// pulseWidth=411, ADC=4096
}
void loop() {
// Collect 100 samples (~4 seconds at 25 sps effective)
for (byte i = 0; i < 100; i++) {
while (!particleSensor.available())
particleSensor.check();
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample();
}
// Calculate SpO2 and Heart Rate
maxim_heart_rate_and_oxygen_saturation(
irBuffer, 100, redBuffer,
&spo2, &validSPO2, &heartRate, &validHeartRate
);
if (validSPO2 && validHeartRate) {
Serial.printf("HR: %d bpm | SpO2: %d%%n",
heartRate, spo2);
// Alert if SpO2 below 95%
if (spo2 < 95) {
Serial.println("ALERT: Low oxygen!");
publishAlert("SpO2 low: " + String(spo2) + "%");
}
}
}
Fall Detection with MPU6050
Fall detection uses the MPU6050 accelerometer to detect sudden acceleration followed by a period of inactivity — the characteristic signature of a fall:
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
bool detectFall() {
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// Calculate total acceleration magnitude (g force)
float accelTotal = sqrt(pow(ax/16384.0, 2) +
pow(ay/16384.0, 2) +
pow(az/16384.0, 2));
// Free-fall: total acceleration drops below 0.4g
if (accelTotal < 0.4) {
delay(500); // Wait 500ms
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// Impact: acceleration spikes above 2g after free-fall
float accelPost = sqrt(pow(ax/16384.0, 2) +
pow(ay/16384.0, 2) +
pow(az/16384.0, 2));
if (accelPost > 2.0) {
return true; // Fall detected
}
}
return false;
}
ESP32 Firmware with MQTT
Complete firmware integrating all sensors and publishing via MQTT:
#include <WiFi.h>
#include <PubSubClient.h>
void publishVitals(int heartRate, int spo2,
float bodyTemp, bool fallDetected) {
char payload[200];
snprintf(payload, sizeof(payload),
"{"hr":%d,"spo2":%d,"
""temp":%.1f,"fall":%s,"
""timestamp":"%s"}",
heartRate, spo2, bodyTemp,
fallDetected ? "true" : "false",
getISTTimestamp().c_str());
mqttClient.publish("health/patient1/vitals", payload);
// Immediate alert for critical values
if (spo2 < 90 || bodyTemp > 39.5 || fallDetected) {
mqttClient.publish("health/patient1/alert", payload);
}
}
Cloud Dashboard with Alerts
ThingSpeak setup for the project demonstration:
- Create a ThingSpeak channel with fields: Heart Rate, SpO2, Body Temperature, Fall Status
- Use ThingSpeak Alerts API to send emails when SpO2 drops below 95%
- Add a MATLAB Visualisation widget showing all vitals on one graph
- Embed the public channel URL in your project report as live evidence
For a more professional demonstration, Grafana + InfluxDB + Node-RED hosted free on Oracle Cloud Always Free tier:
- Node-RED: subscribes to MQTT, writes to InfluxDB, sends Telegram alerts
- InfluxDB: stores time-series vital sign data
- Grafana: dashboards with real-time gauges for each vital sign, historical trend lines, and alarm panels showing alert events
Recommended Product
Arduino Sensor Kit with MAX30100
Some Arduino sensor kits include MAX30100/MAX30102 pulse oximeter modules, MPU6050 IMU, DS18B20 temperature probe, and OLED display — all components for the complete health monitor. Check Zbotic’s sensor kit bundles for health monitoring components.
Project Report and Viva Preparation
A distinction-grade final year project report for an IoT health monitor includes:
Chapter 1 — Introduction: India’s healthcare challenges (patient-to-nurse ratio, hospital bed shortage), WHO vital sign monitoring guidelines, problem statement, objectives, and scope of work.
Chapter 2 — Literature Review: Cite 8-10 IEEE/Springer papers on IoT health monitoring (2019-2024). Identify gaps your project addresses (e.g., offline operation, cost, Indian power conditions).
Chapter 3 — System Design: Block diagram of entire system, circuit schematics, PCB layout (if made), sensor selection justification with accuracy comparisons, communication protocol choice reasoning.
Chapter 4 — Implementation: Code architecture description, key algorithm explanations (SpO2 calculation principle, fall detection threshold derivation), calibration methodology, photographs of the built system.
Chapter 5 — Results: At least 2 weeks of collected data. Compare your sensor readings against a certified pulse oximeter (Lifebox or Nellcor) for the same subject. Show percentage error, mean absolute error. Include a 24-hour vital signs graph showing realistic variation.
Chapter 6 — Discussion: System limitations (motion artefacts in MAX30102, finger placement sensitivity), power consumption analysis (battery life calculation), comparison with commercial hospital monitoring systems (cost: Rs. 12,000 vs Rs. 2-3 lakh for hospital-grade).
Viva questions to prepare:
- “How does photoplethysmography work?” — Beer-Lambert Law, different absorption at red vs IR wavelengths by oxyhaemoglobin
- “What is the difference between SpO2 and SaO2?” — SpO2 is peripheral (estimated), SaO2 is arterial (direct blood gas)
- “What are the limitations of MAX30102 for skin tones?” — Darker skin absorbs more light, requiring higher LED brightness setting
- “Why MQTT over HTTP for IoT?” — Lower bandwidth, persistent connection, broker handles fan-out to multiple subscribers
Frequently Asked Questions
How accurate is the MAX30102 SpO2 reading compared to a hospital pulse oximeter?
In controlled conditions (still finger, good perfusion, normal skin tone), MAX30102 achieves approximately ±2-3% SpO2 accuracy — close to the ±2% specification. With motion or poor contact, accuracy degrades significantly. Compare your readings against a commercially available fingertip pulse oximeter (Contec, ChoiceMMed) available for Rs. 800-1,500 at Indian medical stores.
Can I use this project commercially or submit it as a medical device?
No. Medical devices in India require CDSCO (Central Drugs Standard Control Organisation) approval and clinical validation. Your project is an academic prototype demonstrating the concept. Clearly state this in your project. Some IIT labs and AIIMS have collaborated with engineering college students to develop clinically validated versions — consult your guide for research collaboration opportunities.
What is the battery life of the wearable node?
With all sensors active and WiFi transmitting every 30 seconds, a 1000 mAh LiPo battery lasts approximately 6-8 hours. For overnight monitoring, use a 3000 mAh battery. Implement periodic WiFi sleep (scan → connect → publish → disconnect → sleep 30s) to extend battery life by 60-70%.
My college does not have a proper cloud server. What free options work?
ThingSpeak (free, no server setup), Ubidots free tier, or Oracle Cloud Always Free (2 VMs, 200 GB storage, permanent) — all support the project requirements. Oracle Cloud Free Tier is the most powerful option: run Node-RED, InfluxDB, and Grafana all on a single free VM with a public IP address for impressive live demos.
Build India’s Healthcare of the Future
Complete IoT health monitoring project components — ESP32, MAX30102, MPU6050, and sensor kits at Zbotic. Nationwide delivery for engineering students building tomorrow’s healthcare technology.
Add comment