//libraries
#define BLYNK_TEMPLATE_ID "TMPL5iI062b8a" // Blynk Template ID
#define BLYNK_TEMPLATE_NAME "Smart Health Monitoring System" // Blynk Template Name
#include <DHT.h> // Library for the DHT sensor
#include <LiquidCrystal.h> // Library for the LCD
#include <WiFi.h> // Library for the WiFi
#include <BlynkSimpleEsp32.h> // Library for the Blynk
#define SPIN 32 // Define SPO2 pin
#define HPIN 35 // Define Heart Rate pin
int bloodPressureMonitor; // Variable for storing heart rate
int spo2; // Variable for storing SPO2
const int DHTPIN = 12; // Define DHT sensor pin
int PirPin = 33; // Define PIR sensor pin
int pirState = LOW; // PIR sensor state
int val = 0; // Variable for storing PIR sensor value
const int RS = 4, E = 15, DB4 = 5, DB5 = 18, DB6 = 21, DB7 = 22; // Configuration LCD pin
LiquidCrystal lcd(RS, E, DB4, DB5, DB6, DB7); // Initialize LCD
int humidity; // Variable for storing humidity
float temperatureCelsius; // Variable for storing temperature in Celsius
float temperatureFahrenheit; // Variable for storing temperature in Fahrenheit
DHT dht(DHTPIN, DHT22); // Initialize DHT sensor
long lastTime = 0; // Taken last time measurement
long timerDelay = 500; // Time delay
const char ssid[] = "Wokwi-GUEST"; // WiFi SSID
const char password[] = ""; // WiFi password
int motionState; // Variable for motion state
// Blynk code defines start
char auth[] = "3PIp32nmDl6WdiigyeKg_5Smw63dII0i"; // Replace with your Blynk Auth Token
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Initialize LCD
lcd.begin(16, 2);
lcd.print("Health Monitoring");
delay(500);
lcd.scrollDisplayLeft();
Serial.println("Hello, Have a nice day!");
// Initialize PIR sensor
pinMode(PirPin, INPUT);
// Connect to the WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("-");
}
Serial.println("");
Serial.print("ESP 32 Connected\n");
Serial.println(WiFi.localIP());
motionState = LOW;
dht.begin();
// Initialize Blynk
Blynk.begin(auth, ssid, password);
delay(2000);
}
void loop() {
// Run Blynk
Blynk.run();
// Check timer
if ((millis() - lastTime) > timerDelay) {
if (WiFi.status() == WL_CONNECTED) {
// Read PIR sensor
val = digitalRead(PirPin);
// Read humidity and temperature from DHT sensor
humidity = dht.readHumidity();
temperatureCelsius = dht.readTemperature();
temperatureFahrenheit = (temperatureCelsius * 1.8) + 32;
// Clear and update LCD display
lcd.clear();
display(temperatureFahrenheit, humidity, bloodPressureMonitor, spo2);
// Get heart rate and SPO2
getBloodPressureMonitor();
getSpo2();
// Check PIR sensor value
if (val == HIGH) {
if (pirState == LOW) {
Serial.println("\nMotion detected!");
motionState = HIGH;
sendData(temperatureFahrenheit, humidity, bloodPressureMonitor, spo2, motionState);
pirState = HIGH;
lcd.setCursor(0, 1);
lcd.print("Motion detected!");
// Log event in Blynk
Blynk.logEvent("health_monitor", "Motion detected!");
}
} else {
if (pirState == HIGH) {
delay(5000);
Serial.println("\nMotion ended!");
motionState = LOW;
sendData(temperatureFahrenheit, humidity, bloodPressureMonitor, spo2, motionState);
pirState = LOW;
lcd.setCursor(0, 1);
lcd.print("Motion ended! ");
}
}
// Send data to Blynk
sendData(temperatureFahrenheit, humidity, bloodPressureMonitor, spo2, motionState);
} else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
void getBloodPressureMonitor() {
// Read analog value from heart rate sensor
int signal2 = analogRead(HPIN);
bloodPressureMonitor = map(signal2, 0, 4095, 0, 200);
}
void getSpo2() {
// Read analog value from SPO2 sensor
int signal3 = analogRead(SPIN);
spo2 = map(signal3, 0, 4095, 0, 200);
}
void display(float temp, int humidity, int bloodPressureMonitor, int spo2) {
// Print sensor values to Serial Monitor
Serial.print("\nHumidity: ");
Serial.print(humidity);
Serial.print(" %"); // Adding percentage symbol for humidity
Serial.print("\tTemperature: ");
Serial.print(temp);
Serial.print(" °F"); // Adding degree Fahrenheit symbol for temperature
Serial.print("\nHeartRate: ");
Serial.print(bloodPressureMonitor);
Serial.print(" bpm"); // Adding beats per minute (bpm) for heart rate
Serial.print("\tSpO2: ");
Serial.print(spo2);
Serial.print(" %"); // Adding percentage symbol for SpO2
// Display sensor values on LCD
lcd.setCursor(0, 0);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("\tTemp: ");
lcd.print(temperatureFahrenheit);
lcd.setCursor(0, 1);
lcd.print("BPM: ");
lcd.print(bloodPressureMonitor);
lcd.print("\tSpO2: ");
lcd.print(spo2);
// Update Blynk virtual pins with sensor values
Blynk.virtualWrite(V0, temp); // Body Temp Gauge
Blynk.virtualWrite(V1, humidity); // Humidity Label
Blynk.virtualWrite(V2, bloodPressureMonitor); // Heart Rate
Blynk.virtualWrite(V3, spo2); // SpO2
}
void sendData(float temp, int humidity, int bloodPressureMonitor, int spo2, int motionState) {
// Send sensor data to Blynk
Blynk.virtualWrite(V0, temp); // Body Temp Gauge
Blynk.virtualWrite(V1, humidity); // Humidity Label
Blynk.virtualWrite(V2, bloodPressureMonitor); // Heart Rate
Blynk.virtualWrite(V3, spo2); // SpO2
Blynk.virtualWrite(V4, motionState); // Motion State
}