#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
#define buttondatetime 4
#define buttonstopwatch 2
#define buttonstart 15
#define led 5
int stopwatch;
int datetime;
int statusonoff;
int statusreset;
//int statusreset;
String swState = "OFF";
//int dataValue=0;
//int presState=0;
int miliSecond=0;
int second=0;
int minute=0;
int hour=0;
void setup() {
pinMode(led, OUTPUT);
pinMode(buttondatetime, INPUT_PULLUP);
pinMode(buttonstopwatch, INPUT_PULLUP);
pinMode(buttonstart, INPUT_PULLUP);
Wire.begin();
rtc.begin();
//DateTime dt(2020, 10, 17, 20, 03, 0, 7); // set tanggal dan waktu (format): tahun, bulan,tanggal, jam, menit, detik, hari (1=minggu, 7=sabtu)
//rtc.setDateTime(dt);
Wire.beginTransmission(0x3F);
if (Wire.endTransmission())
{
lcd = LiquidCrystal_I2C(0x27, 16, 2);
}
lcd.init();
lcd.backlight();
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
// When time needs to be set on a new device, or after a power loss, the
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
//lcddatetime();
//stopwatchOff();
}
void loop() {
//lcddatetime();
//delay(1000);
datetime = digitalRead(buttondatetime);
stopwatch = digitalRead(buttonstopwatch);
statusonoff = digitalRead(buttonstart);
//statusreset = digitalRead(buttonstopwatch);
if(datetime==LOW){
lcd.clear();
lcddatetime();
delay(1000);
}
if(stopwatch==LOW){
lcd.clear();
stopwatchOff();
reset();
digitalWrite(led, LOW);
}
if(statusonoff==LOW ){
if (swState=="OFF"){
swState="ON ";
digitalWrite(led, HIGH);
} else if (swState=="ON "){
swState="OFF";
digitalWrite(led, LOW);
}
lcd.setCursor(13,0);
lcd.println(swState);
delay(200);
}
if(swState=="ON "){
lcdstopwatch();
}
if(swState=="OFF"){
reset();
}
}
void lcddatetime() {
DateTime now = rtc.now();
lcd.setCursor(9, 0);
lcd.println(daysOfTheWeek[now.dayOfTheWeek()]); //tampilan hari
lcd.setCursor(0, 1);
if(now.day()<10){
lcd.print("0");
}
lcd.print(now.day(), DEC); // tanggal
lcd.print("/");
if(now.month()<10){
lcd.print("0");
}
lcd.print(now.month(), DEC);//bulan
lcd.print("/");
lcd.print(now.year(), DEC); //tahun
lcd.setCursor(0, 0);
if(now.hour()<10){
lcd.print("0");
}
lcd.print(String(now.hour()));
lcd.print(":");
if(now.minute()<10){
lcd.print("0");
}
lcd.print(String(now.minute()));
lcd.print(":");
if(now.second()<10){
lcd.print("0");
}
lcd.print(String(now.second()));
}
void lcdstopwatch() {
miliSecond++;
if(miliSecond>5){
miliSecond=0;
second++;
}
lcd.setCursor(11,1);
if(miliSecond<10){
lcd.print("0");
}
lcd.print(miliSecond);
if(second>11){
second=0;
minute++;
}
lcd.setCursor(8,1);
if(second<10){
lcd.print("0");
}
lcd.print(second);
if(minute>5){
minute=0;
hour++;
}
lcd.setCursor(5,1);
if(minute<10){
lcd.print("0");
}
lcd.print(minute);
if(hour>11){
hour=0;
}
lcd.setCursor(2,1);
if(hour<10){
lcd.print("0");
}
lcd.print(hour);
}
void stopwatchOff() {
lcd.setCursor(0,0);
lcd.println("STOP WATCH : OFF");
lcd.setCursor(2,1);
lcd.println("00:00:00:00");
}
void reset(){
swState="OFF";
int miliSecond=0;
int second=0;
int minute=0;
int hour=0;
}