/*
2023-08-14
versi 2.0
- croscek = done
- lcd 2 baris
- simpan ke eeprom =
*/
/*
:Project:Allarm_Clock
:Author: Tiziano Bianchettin
:Date: 10/02/2017
:Revision: 2
:License: Public Domain
thanks to:
http://arduinoenonsolo.blogspot.it/2012/12/orologio-con-arduino-e-il-ds1307.html
http://www.mauroalfieri.it/
http://www.danielealberti.it/
http://www.maffucci.it/
My electronics laboratory professor "Perito Carli"
*/
//************libraries**************//
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
//************************************//
LiquidCrystal_I2C lcd(0x27,20,4); // Display I2C 20 x 4
//RTC_DS1307 RTC;
RTC_DS3231 RTC;
//************Button*****************//
int P1=5; // Button SET MENU'
int P2=18; // Button +
int P3=4; // Button -
int P4=2; // SWITCH Alarm
//**************Alarm***************//
#define LED 23
#define buzzer 15
//************Variables**************//
int hourupg;
int minupg;
int yearupg;
int monthupg;
int dayupg;
int menu =0;
int setAll =0;
uint8_t alarmHours = 0, alarmMinutes = 0; // Holds the current alarm time
//-------------------------------------
#include "EEPROM.h"
#define EEPROM_SIZE 64
int addr = 0;
void setup(){
//lcd.begin();
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(P1,INPUT_PULLUP); // https://www.arduino.cc/en/Tutorial/InputPullupSerial
pinMode(P2,INPUT_PULLUP);
pinMode(P3,INPUT_PULLUP);
pinMode(P4,INPUT_PULLUP);
pinMode(LED,OUTPUT);
pinMode(buzzer, OUTPUT); // Set buzzer as an output
printAllOff();
Serial.begin(9600);
Wire.begin();
RTC.begin();
//if (! RTC.isrunning()) {
if (! RTC.begin()) {
Serial.println("RTC is NOT running!");
// Set the date and time at compile time
RTC.adjust(DateTime(__DATE__, __TIME__));
}
// RTC.adjust(DateTime(__DATE__, __TIME__)); //removing "//" to adjust the time
// The default display shows the date and time
int menu=0;
if (!EEPROM.begin(EEPROM_SIZE)){
Serial.println("failed to initialise EEPROM"); delay(1000000);
}
//tes
// EEPROM.write(0, 17);
// EEPROM.write(1, 0);
// EEPROM.commit();
alarmHours = EEPROM.read(0);
alarmMinutes = EEPROM.read(1);
delay(5);
setAll=1;
}
bool seting_alarm = true;
void loop(){ // check if you press the SET button and increase the menu index
if(digitalRead(P1)== LOW) {
delay(50);
menu=menu+1;
lcd.clear();
}
// if (seting_alarm){
if((digitalRead(P2)== LOW) && (digitalRead(P3)== LOW)){
DisplaySetHourAll();
DisplaySetMinuteAll();
lcd.clear();
lcd.setCursor(5,0);
lcd.print("ALARM");
lcd.setCursor(5,1);
lcd.print(alarmHours, DEC);
lcd.print(":");
lcd.print(alarmMinutes, DEC);
delay(1000);
lcd.clear();
seting_alarm = false;
}
// in which subroutine should we go?
if (menu==0){
DisplayDateTime(); // void DisplayDateTime
Alarm(); // Alarm control
}
if (menu==1) DisplaySetHour();
if (menu==2) DisplaySetMinute();
if (menu==3) DisplaySetYear();
if (menu==4) DisplaySetMonth();
if (menu==5) DisplaySetDay();
if (menu==6){
StoreAgg();
delay(500);
menu=0;
}
delay(100);
}
void DisplayDateTime (){
// We show the current date and time
DateTime now = RTC.now();
// lcd.setCursor(0, 2);
lcd.setCursor(0, 1);
//lcd.print("Jam : ");
if (now.hour()<=9) lcd.print("0");
lcd.print(now.hour(), DEC);
hourupg=now.hour();
lcd.print(":");
if (now.minute()<=9) lcd.print("0");
lcd.print(now.minute(), DEC);
minupg=now.minute();
lcd.print(":");
if (now.second()<=9) lcd.print("0");
lcd.print(now.second(), DEC);
lcd.setCursor(6, 0);
//lcd.print("Tgl : ");
if (now.day()<=9) lcd.print("0");
lcd.print(now.day(), DEC);
dayupg=now.day();
lcd.print("-");
if (now.month()<=9) lcd.print("0");
lcd.print(now.month(), DEC);
monthupg=now.month();
lcd.print("-");
lcd.print(now.year(), DEC);
yearupg=now.year();
//char DOW[][10]={"Sunday ","Monday ","Tuesday ","Wednesday","Thursday ","Friday ","Saturday "};
char DOW[][10]={"Minggu","Senin ","Selasa","Rabu ","Kamis ","Jumat ","Sabtu "};
lcd.setCursor(0, 0);
//lcd.print("Hari : ");
lcd.print(DOW[now.dayOfTheWeek()]); // if it appears error in the code, enter the code given below
//lcd.print(DOW[now.dayOfWeek()]);
}
void DisplaySetHour(){// time setting
//lcd.clear();
DateTime now = RTC.now();
if(digitalRead(P2)==LOW){
if(hourupg==23){
hourupg=0;
}
else{
hourupg=hourupg+1;
}
}
if(digitalRead(P3)==LOW){
if(hourupg==0){
hourupg=23;
}
else {
hourupg=hourupg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Set Jam:");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(hourupg,DEC);
delay(200);
}
void DisplaySetMinute(){// Setting the minutes
//lcd.clear();
if(digitalRead(P2)==LOW){
if (minupg==59){
minupg=0;
}
else {
minupg=minupg+1;
}
}
if(digitalRead(P3)==LOW){
if (minupg==0) {
minupg=59;
}
else {
minupg=minupg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Set Menit:");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(minupg,DEC);
delay(200);
}
void DisplaySetYear(){// setting the year
//lcd.clear();
if(digitalRead(P2)==LOW){
yearupg=yearupg+1;
}
if(digitalRead(P3)==LOW){
yearupg=yearupg-1;
}
lcd.setCursor(0,0);
lcd.print("Set Tahun:");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(yearupg,DEC);
delay(200);
}
void DisplaySetMonth(){// Setting the month
//lcd.clear();
if(digitalRead(P2)==LOW){
if (monthupg==12) {
monthupg=1;
}
else {
monthupg=monthupg+1;
}
}
if(digitalRead(P3)==LOW){
if (monthupg==1){
monthupg=12;
}
else{
monthupg=monthupg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Set Bulan:");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(monthupg,DEC);
delay(200);
}
void DisplaySetDay(){// Setting the day
//lcd.clear();
if(digitalRead(P2)==LOW) {
if (dayupg==31) {
dayupg=1;
}
else {
dayupg=dayupg+1;
}
}
if(digitalRead(P3)==LOW){
if (dayupg==1) {
dayupg=31;
}
else {
dayupg=dayupg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Set Tanggal:");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(dayupg,DEC);
delay(200);
}
void StoreAgg() {// Variable saving
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PROSES");
lcd.setCursor(0,1);
lcd.print("SIMPAN");
RTC.adjust(DateTime(yearupg,monthupg,dayupg,hourupg,minupg,0));
delay(200);
}
void DisplaySetHourAll(){ // Setting the alarm minutes
while(digitalRead(P1)==HIGH){
//lcd.clear();
if(digitalRead(P2)==LOW) {
if(alarmHours==23) {
alarmHours=0;
}
else {
alarmHours=alarmHours+1;
}
}
if(digitalRead(P3)==LOW) {
if(alarmHours==0) {
alarmHours=23;
}
else {
alarmHours=alarmHours-1;
}
}
lcd.setCursor(0,0);
lcd.print("Set Jam Alarm :");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(alarmHours,DEC);
delay(200);
}
EEPROM.write(0, alarmHours);
delay(5);
EEPROM.commit();
delay(200);
}
void DisplaySetMinuteAll(){ // Setting the alarm minutes
while(digitalRead(P1)==HIGH){
//lcd.clear();
if(digitalRead(P2)==LOW) {
if (alarmMinutes>=59){
alarmMinutes=0;
}
else {
alarmMinutes=alarmMinutes+1;
}
}
if(digitalRead(P3)==LOW){
if (alarmMinutes>=0){
alarmMinutes=59;
}
else {
alarmMinutes=alarmMinutes-1;
}
}
lcd.setCursor(0,0);
lcd.print("Set Menit Alarm:");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(alarmMinutes,DEC);
delay(200);
}
EEPROM.write(1, alarmMinutes);
delay(5);
EEPROM.commit();
delay(200);
}
void printAllOn(){
alarmHours = EEPROM.read(0);
alarmMinutes = EEPROM.read(1);
///lcd.setCursor(0,3);
lcd.setCursor(11,1);
//lcd.print("Alarm: ");
if (alarmHours <= 9) lcd.print("0");
lcd.print(alarmHours, DEC);
lcd.print(":");
if (alarmMinutes <= 9) lcd.print("0");
lcd.print(alarmMinutes, DEC);
}
void printAllOff() {
//lcd.setCursor(0, 3);
//lcd.setCursor(11, 1);
//lcd.print("Alarm: Off ");
lcd.setCursor(11,1);
lcd.print("--:--");
}
void Alarm(){
if(digitalRead(P4)== LOW) {
setAll=setAll+1;
}
if (setAll==0) {
printAllOff();
noTone (buzzer);
digitalWrite(LED,LOW);
}
if (setAll==1) {
printAllOn();
DateTime now = RTC.now();
if ( now.hour() == alarmHours && now.minute() == alarmMinutes ) {
lcd.noBacklight();
DateTime now = RTC.now();
digitalWrite(LED,HIGH);
tone(buzzer,880); //play the note "A5" (LA5)
delay (300);
tone(buzzer,698); //play the note "F6" (FA5)
lcd.backlight();
}
else{
noTone (buzzer);
digitalWrite(LED,LOW);
}
}
if (setAll==2){
setAll=0;
}
delay(200);
}