#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
String dow;
int days;
int months;
int years;
int hours;
int minutes;
int seconds;
int setdays;
int setmonths;
int setyears;
int sethours;
int setminutes;
int setseconds;
//pushButton
const int pbSet = 2;
const int pbCancel = 5;
const int pbTambah = 3;
const int pbKurang = 4;
// status PushButton
int sbSet = 0;
int sbCancel = 0;
int sbTambah = 0;
int sbKurang = 0;
int tambah = 0;
int mode = 0;
int bagian = 0 ;
// int
#define SCREEN_WIDTH 128 // panjang oled
#define SCREEN_HEIGHT 32 // lebar oled
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
pinMode(pbSet, INPUT_PULLUP);
pinMode(pbCancel, INPUT_PULLUP);
pinMode(pbTambah, INPUT_PULLUP);
pinMode(pbKurang, INPUT_PULLUP);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
// cek jika display tidak hidup
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // ga jalan, loop terussssssssss
}
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();
delay(2000); // Pause for 2 seconds
display.clearDisplay();
display.display();
delay(500);
}
void fungsiButton(){
sbSet = digitalRead(pbSet);
sbCancel = digitalRead(pbCancel);
sbTambah = digitalRead(pbTambah);
sbKurang = digitalRead(pbKurang);
if(sbSet == 0 && mode == 0){
mode ++;
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbCancel == 0 && mode == 0){
mode --;
if(mode<0){
mode = 0;
}
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbSet == 0 && mode == 1 && bagian == 0){
bagian ++;
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbSet == 0 && mode == 1 && bagian == 1){
bagian ++;
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbSet == 0 && mode == 1 && bagian == 2){
mode ++;
bagian=0;
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbSet == 0 && mode == 2 && bagian == 0){
bagian ++;
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbSet == 0 && mode == 2 && bagian == 1){
bagian ++;
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbSet == 0 && mode == 2 && bagian == 2){
adjustTime();
mode = 0;
bagian=0;
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbCancel == 0 && mode == 1 && bagian == 0){
mode --;
if(mode<0){
mode = 0;
}
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbCancel == 0 && mode == 1 && bagian == 1){
bagian --;
if(bagian<0){
bagian = 0;
}
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbCancel == 0 && mode == 1 && bagian == 2){
bagian --;
if(bagian<0){
bagian = 0;
}
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbCancel == 0 && mode == 2 && bagian == 0){
mode --;
if(mode<0){
mode = 0;
}
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbCancel == 0 && mode == 2 && bagian == 1){
bagian --;
if(bagian<0){
bagian = 0;
}
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
if(sbCancel == 0 && mode == 2 && bagian == 2){
bagian --;
if(bagian<0){
bagian = 0;
}
Serial.print("mode:");
Serial.println(mode);
Serial.print("bagian:");
Serial.println(bagian);
delay(200);
return;
}
//btn + - time
if(sbTambah == 0 && mode == 1 && bagian == 0){
sethours = hours++;
if (hours > 23) {
hours = 0;}
setTime();
delay(50);
return;
}
if(sbKurang == 0 && mode ==1 && bagian == 0){
sethours = hours--;
if (hours < 0) {
hours = 23;}
setTime();
delay(50);
return;
}
if(sbTambah == 0 && mode == 1 && bagian == 1){
setminutes = minutes++;
if(minutes > 59){
minutes = 0;
hours ++;
}
setTime();
delay(50);
return;
}
if(sbKurang == 0 && mode ==1 && bagian == 1){
setminutes = minutes--;
if(minutes < 0){
minutes = 59;
hours--;
}
setTime();
delay(50);
return;
}
if(sbTambah == 0 && mode == 1 && bagian == 2){
setseconds = seconds++;
if(seconds > 59){
seconds = 0;
minutes++;
}
setTime();
delay(50);
return;
}
if(sbKurang == 0 && mode ==1 && bagian == 2){
setseconds = seconds--;
if(seconds < 0){
seconds = 59;
minutes--;
}
setTime();
delay(50);
return;
}
//btn +- date
if(sbTambah == 0 && mode == 2 && bagian == 0){
setdays = days++;
batasAtasHari();
setDate();
delay(50);
return;
}
if(sbKurang == 0 && mode == 2 && bagian == 0){
setdays = days--;
batasBawahHari();
setDate();
delay(50);
return;
}
if(sbTambah == 0 && mode == 2 && bagian == 1){
setmonths = months++;
batasAtasHari();
setDate();
delay(50);
return;
}
if(sbKurang == 0 && mode == 2 && bagian == 1){
setmonths = months--;
batasBawahHari();
setDate();
delay(50);
return;
}
if(sbTambah == 0 && mode == 2 && bagian == 2){
setyears = years++;
batasAtasHari();
setDate();
delay(50);
return;
}
if(sbKurang == 0 && mode == 2 && bagian == 2){
setyears = years--;
batasBawahHari();
setDate();
delay(50);
return;
}
}
void getTime(){
DateTime now = rtc.now();
dow = daysOfTheWeek[now.dayOfTheWeek()];// ambil hari dari rtc
days = now.day();// ambil hari dari rtc
months = now.month();// ambil bulan dari rtc
years = now.year();// ambil tahun dari rtc
hours = now.hour();// ambil jam dari rtc
minutes = now.minute();// ambil menit dari rtc
seconds = now.second();// ambil detik dari rtc
}
void jamDigital(){
getTime();
display.clearDisplay();
display.setTextSize(1); // atur ukuran Text
display.setTextColor(SSD1306_WHITE);// warna text
display.setCursor(10, 0);// penempatan text
display.print(dow);
display.print(" ");
display.print(String(days).length() == 1 ? "0" + String(days) : String(days));
display.print("/");
display.print(String(months).length() == 1 ? "0" + String(months) : String(months));
display.print("/");
display.print(years);
display.setTextSize(2);
display.setCursor(10, 10);
display.print(String(hours, DEC).length() == 1 ? "0" + String(hours) : String(hours));
display.print(":");
display.print(String(minutes, DEC).length() == 1 ? "0" + String(minutes) : String(minutes));
display.print(":");
display.print(String(seconds, DEC).length() == 1 ? "0" + String(seconds) : String(seconds));
display.display(); // Show initial text
}
void setTime(){
sethours = hours;
setminutes = minutes;
setseconds = seconds;
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);// warna text
display.setTextSize(1);
display.setCursor(0, 0);
display.print(" JAM ");
display.print(":");
display.print(" MIN ");
display.print(":");
display.print(" DET ");
display.setTextSize(2);
display.setCursor(0, 10);
display.print(String(sethours, DEC).length() == 1 ? "0" + String(sethours) : String(sethours));
display.print(":");
display.print(String(setminutes, DEC).length() == 1 ? "0" + String(setminutes) : String(setminutes));
display.print(":");
display.print(String(setseconds, DEC).length() == 1 ? "0" + String(setseconds) : String(setseconds));
display.display();
}
void setDate(){
setdays = days;
setmonths = months;
setyears = years;
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);// warna text
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Day");
display.print(" / ");
display.print("Month");
display.print(" / ");
display.print("Year");
display.setTextSize(2);
display.setCursor(0, 10);
display.print(String(setdays).length() == 1 ? "0" + String(setdays) : String(setdays));
display.print("/");
display.print(String(setmonths).length() == 1 ? "0" + String(setmonths) : String(setmonths));
display.print("/");
display.print(years);
display.display();
}
void batasAtasHari(){
if(years % 4 == 0){
if(months == 2){
if(days > 29){
days = 1;
months++;
}
}
}
if(years % 4 != 0){
if(months == 2){
if(days > 28){
days = 1;
months++;
}
}
}
if ((months == 1 || months == 3 || months == 5 || months == 7 || months == 8 || months == 10 || months == 12) && days > 31) {
if(days > 31){
days = 1;
months++;
}
}
if(months == 4 || months == 6 || months == 9 || months == 11 ){
if(days > 30){
days = 1;
months++;
}
}
if(months > 12){
months = 1;
years++;
}
}
void batasBawahHari(){
if(years % 4 == 0){
if(months == 3){
if(days < 1){
days = 29;
months--;
}
}
}
if(years % 4 != 0){
if(months == 3){
if(days < 1){
days = 28;
months--;
}
}
}
if(months == 5 || months == 7 || months == 10 || months == 12){
if(days < 1){
days = 30;
months--;
}
}
if(months == 1 || months == 8 || months == 2 || months == 4 || months == 6 || months == 9 || months == 11 ){
if(days < 1){
days = 31;
months--;
}
}
if(months < 1){
months = 12;
years--;
}
}
void adjustTime(){
rtc.adjust(DateTime(setyears,setmonths,setdays,sethours,setminutes,setseconds));
}
void loop() {
fungsiButton();
if(mode == 1 && bagian == 0){
setTime();
}
if(mode == 2 && bagian == 0){
setDate();
}
if(mode == 0){
jamDigital();
}
}