#include <LiquidCrystal.h>
#define TEMP_PIN A0
#define BPM_PIN A1
#define GREEN_LED 8
#define RED_LED 9
#define BUZZER_PIN 10
#define CONTRAST_PIN 11
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#define TEMP_LOW 20.0
#define TEMP_HIGH 40.0
#define BPM_LOW 40
#define BPM_HIGH 150
void setup() {
lcd.begin(16, 2);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(CONTRAST_PIN, OUTPUT);
analogWrite(CONTRAST_PIN, 60);
Serial.begin(9600);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
lcd.setCursor(0, 0);
lcd.print(" Health Monitor");
lcd.setCursor(0, 1);
lcd.print(" Initializing..");
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, HIGH);
delay(1000);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
delay(1000);
lcd.clear();
}
void loop() {
int tempRaw = analogRead(TEMP_PIN);
float voltage = tempRaw * (5.0 / 1023.0);
float tempC = (voltage - 0.5) * 100.0;
int bpmRaw = analogRead(BPM_PIN);
int bpm = map(bpmRaw, 0, 1023, 180, 30);
bpm = constrain(bpm, 30, 180);
bool tempAlert = false;
bool bpmAlert = false;
if (tempC > TEMP_HIGH) tempAlert = true;
else if (tempC < TEMP_LOW) tempAlert = true;
if (bpm > BPM_HIGH) bpmAlert = true;
else if (bpm < BPM_LOW) bpmAlert = true;
bool anyAlert = tempAlert || bpmAlert;
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(tempC, 1);
lcd.print("C ");
lcd.print("BPM:");
lcd.print(bpm);
lcd.print(" ");
lcd.setCursor(0, 1);
if (!anyAlert) {
lcd.print("Status: Normal ");
} else if (tempAlert && bpmAlert) {
if ((millis() / 1500) % 2 == 0) {
if (tempC > TEMP_HIGH) lcd.print("ALRT:Fever! ");
else lcd.print("ALRT:Low Temp! ");
} else {
if (bpm > BPM_HIGH) lcd.print("ALRT:High BPM! ");
else lcd.print("ALRT:Low BPM! ");
}
} else if (tempAlert) {
if (tempC > TEMP_HIGH) lcd.print("ALERT: Fever! ");
else lcd.print("ALERT: Low Temp!");
} else if (bpmAlert) {
if (bpm > BPM_HIGH) lcd.print("ALERT: High BPM!");
else lcd.print("ALERT: Low BPM! ");
}
if (anyAlert) {
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, HIGH);
tone(BUZZER_PIN, 800);
delay(300);
tone(BUZZER_PIN, 1500);
delay(300);
} else {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
noTone(BUZZER_PIN);
}
Serial.print("RawBPM: ");
Serial.print(bpmRaw);
Serial.print(" | BPM: ");
Serial.print(bpm);
Serial.print(" | Temp: ");
Serial.print(tempC, 1);
Serial.print("C | TempAlert: ");
Serial.print(tempAlert ? "YES" : "NO");
Serial.print(" | BPMAlert: ");
Serial.print(bpmAlert ? "YES" : "NO");
Serial.print(" | Status: ");
if (!anyAlert) {
Serial.println("Normal");
} else if (tempAlert && bpmAlert) {
Serial.println("DUAL ALERT - Temp + BPM");
} else if (tempAlert) {
Serial.println("ALERT - Temperature");
} else {
Serial.println("ALERT - BPM");
}
delay(1000);
}