/*
Button pins:
SwitchScreen = 1
Confirm = 2
Up = 3
Down = 4
Next = 5
Back = 6
PILLSWITCH = 8
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(7, 8, 9, 10, 11, 12);
const int switchScreenPin = 1;
int switchScreenPinState = 0;
const int ConfirmPin = 2;
int confirmPinState = 0;
const int upPin = 3;
int upPinState = 0;
const int downPin = 4;
int downPinState = 0;
const int nextPin = 5;
int nextPinState = 0;
const int backPin = 6;
int backPinState = 0;
const int pillSwitch = 8;
int pillSwitchState = 0;
const int buzzerPin = 10;
int buzzerPinState = 0;
int menu = 0;
int amenu = 0;
int hourupg;
int minupg;
const int debounce = 35;
/*
function to update RTC time using user input
*/
void updateRTC()
{
lcd.clear(); // clear LCD display
lcd.setCursor(0, 0);
lcd.print("Edit Mode...");
// ask user to enter new date and time
const char txt[6][15] = { "year [4-digit]", "month [1~12]", "day [1~31]",
"hours [0~23]", "minutes [0~59]", "seconds [0~59]"};
String str = "";
long newDate[6];
while (Serial.available()) {
Serial.read(); // clear serial buffer
}
for (int i = 0; i < 6; i++) {
Serial.print("Enter ");
Serial.print(txt[i]);
Serial.print(": ");
while (!Serial.available()) {
; // wait for user input
}
str = Serial.readString(); // read user input
newDate[i] = str.toInt(); // convert user input to number and save to array
Serial.println(newDate[i]); // show user input
}
// update RTC
rtc.adjust(DateTime(newDate[0], newDate[1], newDate[2], newDate[3], newDate[4], newDate[5]));
Serial.println("RTC Updated!");
}
/*
function to update LCD text
*/
void updateLCD()
{
/*
create array to convert digit days to words:
0 = Sunday | 4 = Thursday
1 = Monday | 5 = Friday
2 = Tuesday | 6 = Saturday
3 = Wednesday |
*/
const char dayInWords[7][4] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
/*
create array to convert digit months to words:
0 = [no use] |
1 = January | 6 = June
2 = February | 7 = July
3 = March | 8 = August
4 = April | 9 = September
5 = May | 10 = October
6 = June | 11 = November
7 = July | 12 = December
*/
const char monthInWords[13][4] = {" ", "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
"JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
// get time and date from RTC and save in variables
DateTime rtcTime = rtc.now();
int ss = rtcTime.second();
int mm = rtcTime.minute();
int hh = rtcTime.twelveHour();
int DD = rtcTime.dayOfTheWeek();
int dd = rtcTime.day();
int MM = rtcTime.month();
int yyyy = rtcTime.year();
// move LCD cursor to upper-left position
lcd.setCursor(0, 0);
// print date in dd-MMM-yyyy format and day of week
if (dd < 10) lcd.print("0"); // add preceeding '0' if number is less than 10
lcd.print(dd);
lcd.print("-");
lcd.print(monthInWords[MM]);
lcd.print("-");
lcd.print(yyyy);
lcd.print(" ");
lcd.print(dayInWords[DD]);
// move LCD cursor to lower-left position
lcd.setCursor(0, 1);
// print time in 12H format
if (hh < 10) lcd.print("0");
lcd.print(hh);
lcd.print(':');
if (mm < 10) lcd.print("0");
lcd.print(mm);
lcd.print(':');
if (ss < 10) lcd.print("0");
lcd.print(ss);
if (rtcTime.isPM()) lcd.print(" PM"); // print AM/PM indication
else lcd.print(" AM");
}
void homeScreen()
{
DateTime rtcTime = rtc.now();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Date: ");
if (rtcTime.day() < 10) lcd.print("0"); // add '0' if number is less than 10 i.e 05:07
lcd.print(rtcTime.day());
lcd.print(":");
if (rtcTime.minute() < 10) lcd.print("0");
lcd.print(rtcTime.minute());
lcd.print(":");
lcd.print(rtcTime.year());
if (rtcTime.isPM()) lcd.print(" PM");
else lcd.print(" AM");
}
void alarmScreen()
{
if(amenu==0)
{
AlarmSetHour();
}
else if (amenu==1)
{
AlarmSetMinute();
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Alarm 1: ");
lcd.setCursor(0,1);
lcd.print("Alarm 1: ");
}
void setup() {
Serial.begin(9600); // initialize serial
lcd.init(); // initialize lcd
lcd.backlight(); // switch-on lcd backlight
rtc.begin(); // initialize rtc
Serial.begin(9600);
pinMode(8, INPUT); //pillSwitch button
pinMode(10, OUTPUT); //Alarm output to buzzer and LED
}
void loop() {
if(menu == 0)
{
homeScreen();
}
else if (menu == 1)
{
alarmScreen();
}
byte pillSwitchState = digitalRead(4);
if (pillSwitchState == HIGH) && ( (rtcTime.twelveHour() == AlarmSetHour())
&& (rtcTime.minute() == AlarmSetMinute()))
//Combines this HIGH state with time match
//When the time comes for calendar settings, add rtcTime.day, .year, etc.
}
}
void AlarmSetHour()
{
// time setting
lcd.clear();
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print("Set Hour:");
lcd.setCursor(0,1);
lcd.print(hourupg,DEC);
while(!digitalRead(1)){
if(digitalRead(2)==HIGH)
{
if(hourupg==23)
{
hourupg=0;
}
else
{
hourupg=hourupg+1;
}
delay(debounce);
}
if(digitalRead(3)==HIGH)
{
if(hourupg==0)
{
hourupg=23;
}
else
{
hourupg=hourupg-1;
}
delay(debounce);
}
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print("Set Hour:");
lcd.setCursor(0,1);
lcd.print(hourupg,DEC);
lcd.print(" ");
}
menu=2;
delay(debounce);
}
void AlarmSetMinute()
{
// Setting the minutes
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set Minutes:");
lcd.setCursor(0,1);
lcd.print(minupg,DEC);
while(!digitalRead(1)){
if(digitalRead(2)==HIGH)
{
if (minupg==59)
{
minupg=0;
}
else
{
minupg=minupg+1;
}
delay(debounce);
}
if(digitalRead(3)==HIGH)
{
if (minupg==0)
{
minupg=59;
}
else
{
minupg=minupg-1;
}
delay(debounce);
}
lcd.setCursor(0,0);
lcd.print("Set Minutes:");
lcd.setCursor(0,1);
lcd.print(minupg,DEC);
lcd.print(" ");
//delay(200);
}
menu=3;
delay(debounce);
}