// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi
#include <WiFi.h>
#include <Wire.h>
#include <RTClib.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
const int servoPin = 18;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 20, 4);
RTC_DS1307 rtc;
DateTime now;
Servo servo;
String month;
String date_year;
String day;
String hours;
String minutes;
String dispenseTime = "18";
bool dispense_status = false;
char daysOfWeek[7][12] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
String morning_intake[4] = {"1","1","1","1"};
String afternoon_intake[4] = {"0","1","1","0"};
String evening_intake[4] = {"1","0","1","1"};
String night_intake[4] = {"1","0","0","1"};
String medication_time[4][4] = {
morning_intake[4],
afternoon_intake[4],
evening_intake[4],
night_intake[4]
};
void setup() {
Serial.begin(115200);
servo.attach(servoPin, 500, 2400);
servo.write(0);
delay(15);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("RTC Module ");
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Couldn't find RTC Module");
Serial.flush();
abort();
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Local");
LCD.setCursor(0, 1);
LCD.println("Updating time...");
// automatically sets the RTC to the date & time on PC this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
DateTime now = rtc.now();
date_year = (now.year());
month = now.month();
day = now.day();
hours = now.hour();
minutes = now.minute();
String time = hours+minutes;
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
if(time == medication_time[i][j] && dispense_status == false){
Serial.print("Compartment number:");
Serial.println(j);
delay(500);
servo.write(120);
delay(1000);
servo.write(0);
Serial.println("Yes is time to dispense");
Serial.println(dispense_status);
dispense_status = true;
Serial.println(dispense_status);
}
else if(time > dispenseTime && dispense_status == true){
dispense_status = false;
Serial.println(dispense_status);
}
}
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("ESP32 RTC Date Time:");
LCD.setCursor(0, 1);
LCD.println(day+"/"+month+"/"+date_year);
LCD.setCursor(0,2);
LCD.println("Time:");
LCD.setCursor(6, 2);
LCD.println(time);
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.println(now.second(), DEC);
Serial.println(dispense_status);
delay(1000); // delay 1 seconds
}