#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 rtc;
#define BUTTON_HEART_RATE 2
#define BUTTON_OXYGEN 3
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
byte smiley[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b10001,
0b01110,
0b00000,
0b00000
};
byte sadFace[8] = {
0b00000,
0b01010,
0b00000,
0b00000,
0b01110,
0b10001,
0b00000,
0b00000
};
int heartRate = 0;
int spo2 = 0;
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.createChar(1, smiley);
lcd.createChar(2, sadFace);
pinMode(BUTTON_HEART_RATE, INPUT_PULLUP);
pinMode(BUTTON_OXYGEN, INPUT_PULLUP);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.setCursor(0, 0);
lcd.print("Press buttons to start");
}
void loop() {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
if (digitalRead(BUTTON_HEART_RATE) == LOW) {
heartRate = random(40, 120);
delay(200);
}
if (digitalRead(BUTTON_OXYGEN) == LOW) {
spo2 = random(80, 100);
delay(200);
}
if (heartRate > 0 && spo2 > 0) {
lcd.setCursor(0, 1);
lcd.print("Heart Rate: ");
lcd.print(heartRate);
lcd.print(" bpm ");
lcd.write((heartRate >= 50 && heartRate <= 100) ? 1 : 2);
lcd.setCursor(0, 2);
lcd.print("Oxygen Saturation: ");
lcd.print(spo2);
lcd.print("% ");
lcd.write((spo2 >= 90) ? 1 : 2);
} else {
lcd.setCursor(0, 1);
lcd.print("Press button for HR ");
lcd.setCursor(0, 2);
lcd.print("Press button for SpO2 ");
}
delay(1000);
}
// Try this in Wokwi and let me know! 🎯