#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include<EEPROM.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for SSD1306 display connected using I2C
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int stsp = A0;
const int inc = A1;
const int dec = A2;
const int set = A3;
const int buzz = 9;
const int relay = 8;
int hrs = 0;
int Min = 0;
int sec = 0;
unsigned int check_val = 50;
int add_chk = 0;
int add_hrs = 1;
int add_min = 2;
bool RUN = true;
bool min_flag = true;
bool hrs_flag = true;
int val;
void INIT()
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
sec = 0;
display.clearDisplay();
// Display Text
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5,10);
display.print("Start / Set Time");
display.setTextSize(1);
display.setCursor(20,42);
if (hrs <= 9)
{
display.print('0');
}
display.print(hrs);
display.print(':');
if (Min <= 9)
{
display.print('0');
}
display.print(Min);
display.print(':');
if (sec <= 9)
{
display.print('0');
}
display.print(sec);
min_flag = true;
hrs_flag = true;
//delay(500);
display.display();
//delay(2000);
display.clearDisplay();
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
// // Clear the buffer.
display.clearDisplay();
// Display Text
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5,10);
display.print(" ELECTRONIC");
display.setTextSize(1);
display.setCursor(20,42);
display.print("COUNTDOWN TIMER");
display.display();
//delay(2000);
display.clearDisplay();
pinMode(stsp, INPUT_PULLUP);
pinMode(inc, INPUT_PULLUP);
pinMode(dec, INPUT_PULLUP);
pinMode(set, INPUT_PULLUP);
pinMode(buzz, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW);
digitalWrite(buzz, LOW);
if (EEPROM.read(add_chk) != check_val)
{
EEPROM.write(add_chk, check_val);
EEPROM.write(add_hrs, 0);
EEPROM.write(add_min, 1);
}
else
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
}
//delay(1500);
INIT();
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(stsp) == LOW)
{
Serial.println("Button OK");
display.clearDisplay();
delay(250);
RUN = true;
while (RUN)
{
if (digitalRead(stsp) == LOW)
{
delay(1000);
if (digitalRead(stsp) == LOW)
{
Serial.println("Button stop");
digitalWrite(relay, LOW);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5,10);
display.print(" TIMER STOPPED");
display.setTextSize(1);
display.setCursor(5,20);
display.print("----------------");
display.display();
display.clearDisplay();
delay(2000);
RUN = false;
INIT();
break;
}
}
digitalWrite(relay, HIGH);
sec = sec - 1;
delay(1000);
if (sec == -1)
{
sec = 59;
Min = Min - 1;
}
if (Min == -1)
{
Min = 59;
hrs = hrs - 1;
}
if (hrs == -1) hrs = 0;
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5,11);
display.print("****************");
display.setTextSize(1);
display.setCursor(20,42);
if (hrs <= 9)
{
display.print('0');
}
display.print(hrs);
display.print(':');
if (Min <= 9)
{
display.print('0');
}
display.print(Min);
display.print(':');
if (sec <= 9)
{
display.print('0');
}
display.print(sec);
if (hrs == 0 && Min == 0 && sec == 0)
{
digitalWrite(relay, LOW);
display.setCursor(20,42);
RUN = false;
for (int i = 0; i < 20; i++)
{
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
}
INIT();
}
display.display();
display.clearDisplay();
}
}
if (digitalRead(set) == LOW)
{
Serial.println("Button set");
delay(500);
while (min_flag)
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5,10);
display.print("SET MINUTE: ");
display.print(Min);
delay(100);
if (digitalRead(inc) == LOW)
{
Min = Min + 1;
if (Min >= 60) Min = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
Min = Min - 1;
if (Min <= -1) Min = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
min_flag = false;
delay(250);
}
display.display();
display.clearDisplay();
}
while (hrs_flag)
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5,10);
display.print("SET HOUR: ");
display.print(hrs);
delay(100);
if (digitalRead(inc) == LOW)
{
hrs = hrs + 1;
if (hrs > 23) hrs = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
hrs = hrs - 1;
if (hrs <= -1) hrs = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
hrs_flag = false;
delay(250);
}
display.display();
display.clearDisplay();
}
if (hrs == 0 && Min == 0)
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5,10);
display.print(" INVAID TIME");
display.display();
display.clearDisplay();
delay(2000);
}
else
{
EEPROM.write(add_hrs, hrs);
EEPROM.write(add_min, Min);
}
INIT();
}
}