#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myServo;
int buzzer = 8;
int button = 2;
// Servo positions (compartments)
int positions[] = {0, 90, 180};
String doses[] = {"Morning", "Afternoon", "Evening"};
void setup() {
lcd.init();
lcd.backlight();
pinMode(buzzer, OUTPUT);
pinMode(button, INPUT); // because using 5V switch
myServo.attach(9);
lcd.setCursor(0,0);
lcd.print("Smart Dispenser");
delay(2000);
}
void dispense(int pos, String doseName) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(doseName);
lcd.setCursor(0,1);
lcd.print("Dispensing...");
// Buzzer ON
tone(buzzer, 1000);
// Servo rotate
myServo.write(pos);
delay(2000);
myServo.write(0);
delay(1000);
lcd.clear();
lcd.print("Flip Switch");
int taken = 0;
long startTime = millis();
// Wait 8 seconds for switch
while(millis() - startTime < 8000) {
if(digitalRead(button) == HIGH) {
taken = 1;
lcd.clear();
lcd.print("Detected!");
delay(1000);
break;
}
}
// Buzzer OFF
noTone(buzzer);
lcd.clear();
if(taken) {
lcd.print("Dose Taken");
} else {
lcd.print("Missed Dose!");
}
delay(3000);
}
void loop() {
lcd.clear();
lcd.print("Waiting...");
delay(3000);
for(int i = 0; i < 3; i++) {
dispense(positions[i], doses[i]);
lcd.clear();
lcd.print("Next Dose...");
delay(3000);
}
}