This circuit is designed to function as a medicine reminder and dispenser. It utilizes an Arduino UNO microcontroller to control a buzzer, a servo motor, an RTC (Real-Time Clock) module, an I2C LCD display, and multiple pushbuttons. The user can set up to three different timings for medicine reminders. At the set times, the buzzer will sound, and the servo motor will dispense the medicine.
Arduino UNO
Buzzer
Micro servo 9G
RTC DS3231
Resistor (10k Ohms)
Pushbutton
16x2 I2C LCD
#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
// Initialize components
RTC_DS3231 rtc;
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pins for push buttons
const int buttonHourPin = 2;
const int buttonMinutePin = 3;
const int buttonConfirmPin = 4;
// Buzzer and Servo pins
const int buzzerPin = 8;
const int servoPin = 9;
// Timing variables
String timings[3] = {"00:00", "00:00", "00:00"};
int currentTimingIndex = 0;
int setHour = 0, setMinute = 0;
bool isSettingMode = true;
// Flag to prevent multiple triggers within the same minute
bool medicineDispensed = false;
void setup() {
Serial.begin(9600);
// Initialize LCD and components
lcd.init();
lcd.backlight();
lcd.print("Hello, World!");
servo.attach(servoPin);
pinMode(buzzerPin, OUTPUT);
// Initialize button pins
pinMode(buttonHourPin, INPUT_PULLUP);
pinMode(buttonMinutePin, INPUT_PULLUP);
pinMode(buttonConfirmPin, INPUT_PULLUP);
// Initialize RTC
if (!rtc.begin()) {
lcd.print("RTC not found!");
while (1);
}
// Initial Servo Position
servo.write(0);
// Start setting mode
lcd.clear();
lcd.print("Set Timing 1");
}
void loop() {
if (isSettingMode) {
setTiming(); // Allow user to set timings
} else {
checkTimings(); // Monitor current time for alarms
}
}
// Function to set timings
// Button state tracking
bool lastHourButtonState = HIGH;
bool lastMinuteButtonState = HIGH;
bool lastConfirmButtonState = HIGH;
void setTiming() {
lcd.setCursor(0, 1);
lcd.print("Time: ");
lcd.print(formatTime(setHour, setMinute));
// Read button states
bool currentHourButtonState = digitalRead(buttonHourPin);
bool currentMinuteButtonState = digitalRead(buttonMinutePin);
bool currentConfirmButtonState = digitalRead(buttonConfirmPin);
// Handle Hour Button
if (lastHourButtonState == HIGH && currentHourButtonState == LOW) {
setHour = (setHour + 1) % 24;
delay(200); // Debounce delay
}
lastHourButtonState = currentHourButtonState;
// Handle Minute Button
if (lastMinuteButtonState == HIGH && currentMinuteButtonState == LOW) {
setMinute = (setMinute + 1) % 60;
delay(200); // Debounce delay
}
lastMinuteButtonState = currentMinuteButtonState;
// Handle Confirm Button
if (lastConfirmButtonState == HIGH && currentConfirmButtonState == LOW) {
timings[currentTimingIndex] = formatTime(setHour, setMinute);
currentTimingIndex++;
if (currentTimingIndex < 3) {
lcd.clear();
lcd.print("Set Timing ");
lcd.print(currentTimingIndex + 1);
setHour = 0;
setMinute = 0;
} else {
lcd.clear();
lcd.print("Timings Set!");
delay(2000);
isSettingMode = false;
}
delay(200); // Debounce delay
}
lastConfirmButtonState = currentConfirmButtonState;
}
// Function to check timings and dispense medicine
void checkTimings() {
DateTime now = rtc.now();
String currentTime = formatTime(now.hour(), now.minute());
for (String timing : timings) {
if (currentTime == timing && !medicineDispensed) {
alertUser();
delay(5000); // Buzzer duration
dispenseMedicine();
medicineDispensed = true;
}
}
// Reset flag after 1 minute
if (millis() % 60000 == 0) {
medicineDispensed = false;
}
delay(1000); // 1-second delay
}
// Function to alert the user
void alertUser() {
lcd.clear();
lcd.print("Take Medicine!");
digitalWrite(buzzerPin, HIGH);
delay(5000); // Buzzer on for 5 seconds
digitalWrite(buzzerPin, LOW);
}
// Function to dispense medicine
void dispenseMedicine() {
delay(30000); // Wait 30 seconds after alert
servo.write(