//OPELIOT PROJECT
//wa.me/
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>
//===== I/O =====
#define pinTrig 2
#define pinMenu 4
#define pinPlus 6
#define pinMinus 8
int menuCount = 0;
//===== LCD =====
LiquidCrystal_I2C lcd(0x27, 20, 4);
//===== RTC =====
RTC_DS1307 rtc;
//===== SD =====
File savedFile;
//===== DISPLAY =====
char text[20];
unsigned long lt = 0;
unsigned long hourMeter, secondMeter = 4500, per10; //SETING AWAL HITUNGAN PADA JAM, UNTUK RESET = HAPUS DATA PADA SD CARD
int dispCounter = 0;
void setup() {
//===== INIT I/O =====
pinMode(pinTrig, INPUT_PULLUP);
pinMode(pinMenu, INPUT_PULLUP);
pinMode(pinPlus, INPUT_PULLUP);
pinMode(pinMinus, INPUT_PULLUP);
//===== INIT SERIAL DAN LCD =====
lcd.init(); lcd.backlight();
lcd.setCursor(7, 0); lcd.print("CREATED");
lcd.setCursor(10, 1); lcd.print("BY");
lcd.setCursor(1, 2); lcd.print("SHOGUN P.VAN REPI");
Serial.begin(115200); delay(100);
Serial.println("Inisialisasi...");
// blinkLCD(200, 100, 5);
//===== RTC =====
if (! rtc.begin()) {
Serial.println("RTC ERROR");
lcd.setCursor(0, 1); lcd.print(" RTC ERROR! ");
while (1) {
blinkLCD(250, 250, 2);
delay(1500);
}
}
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
if (! rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
//===== INIT SD =====
if (!SD.begin(10)) {
Serial.println("initialization SD CARD FAILED!");
lcd.setCursor(0, 1); lcd.print(" RTC ERROR! ");
while (1) {
blinkLCD(250, 250, 3);
delay(1500);
}
}
Serial.println("Initialization SD CARD OK");
//===== INIT CONDITION =====
savedFile = SD.open("hm.txt");
if (savedFile) {
Serial.println("Read Data");
if (savedFile.available()) {
String readFromSD = savedFile.readString();
Serial.print(readFromSD);
secondMeter = readFromSD.toInt();
}
savedFile.close();
}
else {
savedFile = SD.open("hm.txt", FILE_WRITE);
if (savedFile) {
savedFile.println(secondMeter);
savedFile.close();
}
}
}
void loop() {
DateTime now = rtc.now();
if (now.unixtime() > lt) {
lcd.setCursor(0, 1);
if (digitalRead(pinTrig) == 0) {
secondMeter++;
savedFile = SD.open("hm.txt", O_WRITE);
if (savedFile) {
savedFile.println(String(secondMeter));
savedFile.close();
}
lcd.print("STATUS : RUNNING ");
}
else {
lcd.print("STATUS : OFF ");
}
lcd.setCursor(0, 0); lcd.print("C/N UNIT: GS30113YM ");
hourMeter = secondMeter / 3600;
per10 = int((secondMeter % 3600) / 360);
sprintf(text, "HM : %06lu.%lu ", hourMeter, per10);
lcd.setCursor(0, 2); lcd.print(text);
//unsigned long ps = 42611, pd = 707512;
if (dispCounter >= 0)sprintf(text, ">LOG DEPT %02d:%02d:%02d<", int(now.hour()), int(now.minute()), int(now.second()));
//else sprintf(text,"<---ELECTRIC DEPT---");
// sprintf(text, "DETIK : %010lu", secondMeter);
lcd.setCursor(0, 3); lcd.print(text);
dispCounter++;
if (dispCounter >= 10)dispCounter = 0;
now = rtc.now();
lt = now.unixtime();
}
if (digitalRead(pinMenu) == LOW) {
menuCount++;
//blinkLCD(200, 200, 1);
if (menuCount > 40) {
settingTime();
}
}
else {
menuCount = 0;
}
cekReset();
delay(50);
}
void cekReset() {
int counter = 0;
if (digitalRead(pinMinus) == LOW)lcd.clear();
while (digitalRead(pinMinus) == LOW) {
lcd.setCursor(0, 0); lcd.print(" [ Reset? ] ");
lcd.setCursor(counter, 1); lcd.write(0xff);
counter++;
if (counter == 20) {
SD.remove("hm.txt");
savedFile = SD.open("hm.txt", FILE_WRITE);
if (savedFile) {
savedFile.println(0);
savedFile.close();
}
lcd.setCursor(0, 1); lcd.print(" RESET DATA ");
blinkLCD(100, 100, 10);
secondMeter = 0;
break;
}
delay(150);
}
}
void settingTime() {
int cursor = 0,
dispCounter = 0;
menuCount = 0;
hourMeter = secondMeter / 3600;
unsigned long hourMeterEdit = hourMeter;
unsigned long per10Edit = per10;
lcd.setCursor(0, 3);
sprintf(text, "ADJUST : %06lu.%lu ", hourMeterEdit, per10Edit);
lcd.print(text);
while (digitalRead(pinMenu) == LOW) {
blinkLCD(200, 200, 1);
}
while (1) {
if (dispCounter >= 30) {
if (cursor == 0) lcd.setCursor(17, 3);
else lcd.setCursor(16 - cursor, 3);
lcd.write(0xff);
dispCounter++;
}
else {
lcd.setCursor(0, 3);
sprintf(text, "ADJUST : %06lu.%lu ", hourMeterEdit, per10Edit);
lcd.print(text);
}
dispCounter++;
if (dispCounter >= 60)dispCounter = 0;
int saveCount = 0;
bool outResult = false;
if (digitalRead(pinMenu) == LOW) {
while (digitalRead(pinMenu) == LOW) {
saveCount++;
if (saveCount > 10) {
blinkLCD(100, 100, 2);
break;
}
delay(100);
}
if (saveCount > 10)break;
else {
cursor++;
if (cursor > 6)cursor = 0;
delay(250);
}
}
if (digitalRead(pinPlus) == LOW) {
unsigned long iAdd = 0;
if (cursor == 0) {
per10Edit++;
if (per10Edit == 10) {
per10Edit = 0;
iAdd++;
}
}
else {
iAdd = 1;
for (int i = 0; i < cursor - 1; i++) {
iAdd = iAdd * 10;
}
}
hourMeterEdit = hourMeterEdit + iAdd;
if (hourMeterEdit > 1000000) {
hourMeterEdit = 0;
}
delay(250);
}
if (digitalRead(pinMinus) == LOW) {
unsigned long iAdd = 0;
if (cursor == 0) {
per10Edit--;
if (per10Edit < 0 || per10Edit > 10) {
per10Edit = 9;
iAdd = 0;
}
}
else {
iAdd = 1;
for (int i = 0; i < cursor - 1; i++) {
iAdd = iAdd * 10;
}
}
if(iAdd < hourMeterEdit){
hourMeterEdit = hourMeterEdit - iAdd;
}
if (hourMeterEdit <= 0) {
hourMeterEdit = 0;
}
delay(250);
}
delay(10);
}
SD.remove("hm.txt");
savedFile = SD.open("hm.txt", FILE_WRITE);
if (savedFile) {
unsigned long secondMeterEdit = hourMeterEdit * 3600 + per10Edit * 60 * 6;
Serial.println(hourMeterEdit);
Serial.println(per10Edit);
Serial.println(secondMeterEdit);
Serial.println("=====");
savedFile.println(secondMeterEdit);
savedFile.close();
}
lcd.setCursor(0, 1); lcd.print(" SAVE DATA ");
blinkLCD(100, 100, 10);
savedFile = SD.open("hm.txt");
if (savedFile) {
Serial.println("Read Data");
if (savedFile.available()) {
String readFromSD = savedFile.readString();
Serial.print(readFromSD);
secondMeter = readFromSD.toInt();
}
savedFile.close();
}
while (digitalRead(pinMenu) == LOW) {
blinkLCD(200, 200, 1);
}
menuCount = 0;
}
void blinkLCD(int timeOn, int timeOff, int perulangan) {
for (int i = 0; i < perulangan; i++) {
lcd.noBacklight(); delay(timeOn);
lcd.backlight(); delay(timeOff);
}
}