// Define Blynk debug print
#define BLYNK_PRINT Serial
// Define Blynk credentials
#define BLYNK_TEMPLATE_ID "TMPL3SIxrAYtx"
#define BLYNK_TEMPLATE_NAME "HealthCare"
#define BLYNK_AUTH_TOKEN "RUlyKMvf28j-Oed9io2WMfHwlZytzO-u"
// Include libraries
#include <DallasTemperature.h>
#include <OneWire.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// WiFi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// OLED display setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Sensor & output pins
#define PULSE_PIN 35
#define alertLed 5
#define BUZZER_PIN 25
// Thresholds for heart rate and body temperature
int minHeartRate = 50;
int maxHeartRate = 120;
int minBodyTemp = 25;
int maxBodyTemp = 40;
// Temperature sensor setup
const int tempSensor = 13;
OneWire onewire(tempSensor);
DallasTemperature sensor(&onewire);
// Timer for Blynk
BlynkTimer timer;
// Variables to store sensor data
float temp = 0;
int16_t pulse;
float voltage;
int heartRate;
// Spinner characters for loading animation
char spinner[] = {'|', '/', '-'};
// Function to print text on OLED
void printLed(String str1, int c1, int r1,
String str2 = " ", int c2=0, int r2=0) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(c1, r1);
display.println(str1);
display.setCursor(c2, r2);
display.println(str2);
display.display();
}
// Function to show loading animation
void loading() {
for (int i = 0; i < 3; i++) {
printLed(String(spinner[i]), 61, 30);
delay(50);
}
}
// Function to read sensors and send data to Blynk
void dataToBlynk() {
sensor.requestTemperatures();
temp = sensor.getTempCByIndex(0);
// Read pulse value
pulse = analogRead(PULSE_PIN);
// Convert analog reading to voltage
voltage = pulse * (5 / 4095.0);
// Calculate heart rate based on voltage
heartRate = (voltage / 3.3) * 675;
// Check for invalid temperature reading
if(isnan(temp)){
Serial.println("Failed to fetch data from Temp Sensor");
printLed("Failed to fetch data", 0, 28, "from Temp-Sensor", 0, 34);
display.clearDisplay();
return;
}
// Check for invalid pulse reading
if(isnan(pulse)){
Serial.println("Failed to fetch data from Pulse Sensor");
printLed("Failed to fetch data", 0, 28, "from Pulse-Sensor", 0, 34);
display.clearDisplay();
return;
}
// Display temperature and heart rate on OLED
display.clearDisplay();
display.setTextSize(1.05);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 20);
display.print("Temperature: ");
display.print(temp);
display.println(" C");
Serial.print("Temperature : ");
Serial.print(temp);
Serial.println(" C");
display.setCursor(0, 40);
display.print("Heart P/R : ");
display.print(heartRate);
display.println(" BPM");
Serial.print("Heart Pulse Rate : ");
Serial.print(heartRate);
Serial.println(" BPM");
display.display();
// Send data to Blynk virtual pins
Blynk.virtualWrite(V0, heartRate);
Blynk.virtualWrite(V1, temp);
Serial.println("Data successfully sent to Blynk");
}
// Function to handle alert conditions
void adverseSituation() {
if (heartRate < minHeartRate) {
// Heart rate too low
display.clearDisplay();
display.setCursor(0, 0);
display.println("Heart Rate is LOW");
display.setCursor(20, 30);
display.print(String(heartRate) + " bpm");
display.setCursor(10, 50);
display.print("ALERT TRIGGERED");
display.display();
digitalWrite(alertLed, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
Blynk.virtualWrite(V2, 255); // Alert ON in Blynk
}
else if (heartRate > maxHeartRate) {
// Heart rate too high
display.clearDisplay();
display.setCursor(0, 0);
display.println("Heart Rate HIGH!");
display.setCursor(20, 30);
display.print(String(heartRate) + " bpm");
display.setCursor(10, 50);
display.print("ALERT TRIGGERED");
display.display();
digitalWrite(alertLed, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
Blynk.virtualWrite(V2, 255); // Alert ON in Blynk
}
else if (temp > maxBodyTemp) {
// Body temperature too high
display.clearDisplay();
display.setCursor(0, 0);
display.println("Body Temperature HIGH!");
display.setCursor(20, 30);
display.print(String(temp) + " C");
display.setCursor(10, 50);
display.print("ALERT TRIGGERED");
display.display();
digitalWrite(alertLed, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
Blynk.virtualWrite(V2, 255); // Alert ON in Blynk
}
else if (temp < minBodyTemp) {
// Body temperature too low
display.clearDisplay();
display.setCursor(0, 0);
display.println("Body Temperature LOW");
display.setCursor(20, 30);
display.print(String(temp) + " C");
display.setCursor(10, 50);
display.print("ALERT TRIGGERED");
display.display();
digitalWrite(alertLed, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
Blynk.virtualWrite(V2, 255); // Alert ON in Blynk
}
else {
// Normal condition
digitalWrite(alertLed, LOW);
digitalWrite(BUZZER_PIN, LOW);
Blynk.virtualWrite(V2, 0); // Alert OFF in Blynk
}
delay(2000);
}
// Setup function
void setup() {
Serial.begin(9600);
sensor.begin(); // Start temperature sensor
Wire.begin(21, 22); // Initialize I2C
pinMode(alertLed, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Start OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED init failed"));
while (1);
}
// Connect to WiFi
WiFi.begin(ssid, pass);
while(WiFi.status() != WL_CONNECTED)
{
printLed("Connecting...", 20, 29);
delay(100);
loading();
loading();
loading();
}
Serial.println("WiFi Connected Successfully !");
printLed("WiFi Connected", 20, 24, "Successfully!", 23, 34);
delay(1000);
// Connect to Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
Serial.println("Blynk ready to use !");
printLed("Blynk Ready to Use", 9, 31);
delay(1000);
// Clear display
printLed(" ", 0, 0);
// Set a timer to send sensor data every 2 seconds
timer.setInterval(2000L, dataToBlynk);
}
// Loop function
void loop() {
Blynk.run(); // Run Blynk
timer.run(); // Run timer
adverseSituation(); // Check for abnormal conditions
}
Loading
ds18b20
ds18b20