#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <Adafruit_NeoPixel.h>
#define BUTTON_HEART_RATE 2
#define BUTTON_OXYGEN 3
#define BUZZER_PIN 8
#define STEP_PIN 5
#define DIR_PIN 6
#define LED_PIN 4
#define NUM_LEDS 10
int steps;
int delayTime;
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 rtc;
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int heartRate = 0;
int spo2 = 0;
byte smiley[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b10001,
0b01110,
0b00000,
0b00000
};
byte sadFace[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b01110,
0b10001,
0b00000,
0b00000
};
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.createChar(1, smiley);
lcd.createChar(2, sadFace);
strip.begin();
strip.show();
pinMode(BUTTON_HEART_RATE, INPUT_PULLUP);
pinMode(BUTTON_OXYGEN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, setting the time to compile time.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void spinMotor() {
digitalWrite(DIR_PIN, HIGH);
for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(delayTime);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(delayTime);
}
}
void beepBuzzer() {
for (int i = 0; i < 5; i++) {
tone(BUZZER_PIN, 1000);
delay(1500);
noTone(BUZZER_PIN);
delay(1500);
}
}
void pulseLEDStrip() {
for (int pulse = 0; pulse < 10; pulse++) {
for (int brightness = 0; brightness <= 255; brightness += 5) {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, brightness));
}
strip.show();
delay(30);
}
for (int brightness = 255; brightness >= 0; brightness -= 5) {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, brightness));
}
strip.show();
delay(30);
}
}
}
void checkButtons() {
if (digitalRead(BUTTON_HEART_RATE) == LOW) {
heartRate = random(40, 120); // Simulate heart rate
Serial.print("Heart Rate: ");
Serial.println(heartRate);
delay(500);
}
if (digitalRead(BUTTON_OXYGEN) == LOW) {
spo2 = random(70, 100); // Simulate SpO2
Serial.print("SpO2: ");
Serial.println(spo2);
delay(500);
}
}
void checkDispenseTime(int hour, int minute, int dayOfWeek) {
if ((hour == 9 || hour <12)) {
if (dayOfWeek == 0 && hour == 17) {
delayTime = 1250;
steps = 200;
spinMotor();
} else {
delayTime = 500;
steps = 100;
spinMotor();
}
beepBuzzer();
pulseLEDStrip();
}
}
void loop() {
DateTime now = rtc.now();
checkButtons();
lcd.setCursor(0, 0);
lcd.print("Place finger...");
lcd.setCursor(0, 1);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.print(" ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
lcd.setCursor(0, 2);
lcd.print("BMP: ");
lcd.print(heartRate);
lcd.print(" "); // Clear any extra digits
lcd.setCursor(11, 2);
lcd.print(" "); // Clear previous emoji
if (heartRate > 0) {
lcd.setCursor(11, 2);
lcd.write((heartRate >= 50 && heartRate <= 100) ? 1 : 2);
}
lcd.setCursor(0, 3);
lcd.print("SpO2: ");
lcd.print(spo2);
lcd.print("% "); // Clear any extra digits
lcd.setCursor(10, 3);
lcd.print(" "); // Clear previous emoji
if (spo2 > 0) {
lcd.setCursor(10, 3);
lcd.write((spo2 >= 90) ? 1 : 2);
}
delay(1000);
checkDispenseTime(now.hour(), now.minute(), now.dayOfTheWeek());
}
// Let me know if you’d like me to tweak anything! 🚀