#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
// Push Button Pin di digital pin
#define PB_1 7
#define PB_2 8
#define PB_3 9
// Relay & LED pin
#define RELAY_1 10
#define RELAY_2 11
#define RELAY_3 12
#define LED_1 6
// Oled Konfigurasi
#define OLED_RESET -1
Adafruit_SSD1306 oled3C(OLED_RESET);
// Timer
int mode = 0;
int seconds;
int data;
unsigned long previous_time = 0;
unsigned long current_time = 0;
// Kondisi Button
int buttonState1;
int buttonState2;
int buttonState3;
// millis pb
int debouncePeriodPb_set = 20; // debounce delay of 20ms
int debounceMillisPb_set = 0; // similar to previousMillis
int debouncePeriodPb_down = 20; // debounce delay of 20ms
int debounceMillisPb_down = 0; // similar to previousMillis
int debouncePeriodPb_up = 20; // debounce delay of 20ms
int debounceMillisPb_up = 0; // similar to previousMillis
bool relayState1 = false;
bool relayState2 = false;
int dataRelay1;
int dataTempRelay1;
void eeprom_write(int address, int data) {
byte byte1 = (data >> 8) && 0xFF;
byte byte2 = data & 0xFF;
EEPROM.write(address, byte1);
EEPROM.write(address + 1, byte2);
}
void eeprom_read(int address) {
byte byte1 = EEPROM.read(address);
byte byte2 = EEPROM.read(address + 1);
data = (byte1 << 8) + byte2;
return data;
}
void eeprom_write1(int address1, int dataTempRelay1) {
byte byte3 = (dataTempRelay1 >> 8) && 0xFF;
byte byte4 = dataTempRelay1 & 0xFF;
EEPROM.write(address1, byte3);
EEPROM.write(address1 + 1, byte4);
}
void eeprom_read1(int address1) {
byte byte3 = EEPROM.read(address1);
byte byte4 = EEPROM.read(address1 + 1);
data = (byte3 << 8) + byte4;
return dataTempRelay1;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
oled3C.begin(SSD1306_SWITCHCAPVCC, 0x3C);
eeprom_read(1);
pinMode(PB_1, INPUT_PULLUP);
pinMode(PB_2, INPUT_PULLUP);
pinMode(PB_3, INPUT_PULLUP);
pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
pinMode(RELAY_3, OUTPUT);
pinMode(LED_1, OUTPUT);
// inisiasi awal Mematikan Relay
digitalWrite(RELAY_1, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_3, LOW);
oled3C.clearDisplay(); // clear display
oled3C.setTextSize(1); // Atur ukuran text
oled3C.setTextColor(WHITE); // Atur warna text
oled3C.setCursor(0, 0); // Atur posisi text pada display
oled3C.println("Timer"); // Text yang dicetak
oled3C.setCursor(0, 15); // Atur posisi text pada display
oled3C.println("Pengatur Waktu"); // Text yang dicetak
delay(2000);
oled3C.clearDisplay(); // clear display
displayMessage("Mode Aktivasi", seconds, data, dataRelay1, dataTempRelay1);
}
void loop() {
// put your main code here, to run repeatedly:
current_time = millis();
unsigned long currentMillis = millis(); // store the current time
buttonState1 = digitalRead(PB_1);
buttonState2 = digitalRead(PB_2);
buttonState3 = digitalRead(PB_3);
/* -----------------------------------------------------
Sistem 1
----------------------------------------------------
*/
if ((currentMillis - debounceMillisPb_set) > debouncePeriodPb_set) {
debounceMillisPb_set = currentMillis; // save the last debounce delay time
if (buttonState1 == LOW) {
mode++;
if (mode > 3) {
mode = 0;
}
}
}
if (mode == 1) {
if ((currentMillis - debounceMillisPb_up) > debouncePeriodPb_up && mode) {
debounceMillisPb_up = currentMillis; // save the last debounce delay time
eeprom_write(1, data);
eeprom_read(1);
seconds = data;
if (buttonState2 == LOW) {
data++;
seconds++;
if (seconds > 100) {
seconds = 0;
} if (data > 100) {
data = 0;
}
}
}
if ((currentMillis - debounceMillisPb_down) > debouncePeriodPb_down && mode) {
debounceMillisPb_down = currentMillis;
if (buttonState3 == LOW) {
data--;
seconds--;
if (seconds < 0) {
seconds = 99;
} if (data < 0) {
data = 99;
}
}
}
}
if (mode == 2){
if ((currentMillis - debounceMillisPb_up) > debouncePeriodPb_up && mode) {
debounceMillisPb_up = currentMillis; // save the last debounce delay time
eeprom_write1(5, dataTempRelay1);
eeprom_read1(5);
dataRelay1 = dataTempRelay1;
if (buttonState2 == LOW) {
dataTempRelay1++;
dataRelay1++;
if (dataRelay1 > 100) {
dataRelay1 = 0;
} if (dataTempRelay1 > 100) {
dataTempRelay1 = 0;
}
}
}
if ((currentMillis - debounceMillisPb_down) > debouncePeriodPb_down && mode) {
debounceMillisPb_down = currentMillis;
if (buttonState3 == LOW) {
dataTempRelay1--;
dataRelay1--;
if (seconds < 0) {
dataRelay1 = 99;
} if (dataTempRelay1 < 0) {
dataTempRelay1 = 99;
}
}
}
}
else if (mode == 3 && seconds > 0) {
if ((current_time - previous_time) >= 1000) {
seconds--;
digitalWrite(RELAY_1, HIGH);
digitalWrite(RELAY_2, HIGH);
digitalWrite(RELAY_3, HIGH);
if (digitalRead(LED_1) == HIGH) {
digitalWrite(LED_1, LOW); // Matikan LED jika menyala
} else {
digitalWrite(LED_1, HIGH); // Nyalakan LED jika mati
}
previous_time = current_time;
}
}
if (mode == 0) {
digitalWrite(LED_1, HIGH);
displayMessage("Mode Aktivasi", seconds, data, dataRelay1, dataTempRelay1);
}
if (mode == 1) {
//EEPROM.write(1, seconds);
//data = seconds;
displayMessage("Mode Pengaturan Timer", seconds, data, dataRelay1, dataTempRelay1);
}
if (mode == 2){
displayMessage("Mode Pengaturan Relay", seconds, data, dataRelay1, dataTempRelay1);
}
if (mode == 3) {
//data = seconds;
displayMessage("Mode Timer", seconds, data, dataRelay1, dataTempRelay1);
if (seconds == 0) {
mode = 0;
digitalWrite(RELAY_1, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_3, LOW);
}
}
}
void displayMessage(String message, int seconds, int data, int dataRelay1, int dataTempRelay1) {
oled3C.clearDisplay();
oled3C.setTextSize(1);
oled3C.setTextColor(WHITE);
oled3C.setCursor(0, 0);
oled3C.println(message);
oled3C.setCursor(0, 10);
oled3C.print("Timer: ");
oled3C.print(seconds);
oled3C.setCursor(0, 20);
oled3C.print("Relay Time: ");
oled3C.print(dataRelay1);
oled3C.setCursor(0, 30);
oled3C.print("Save: ");
oled3C.setCursor(0, 40);
oled3C.print("T: ");
oled3C.print(data);
oled3C.setCursor(0, 50);
oled3C.print("R: ");
oled3C.print(dataTempRelay1);
oled3C.display();
}