#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
float Ontime=1.0;
int Offtime=2,cycle=20,cycletag;
boolean state=false,RelayState=true;
int progress = 0,option=0;
const int BTN01 = 2;   
const int BTN02 = 3;   
const int BTN03 = 4;  
const int BTN04 = 5;
const int Relay01 = 13;
unsigned long Time,Time1;
void setup() {
  for(int x=2;x<6;x++)pinMode(x, INPUT_PULLUP);
  pinMode(6,OUTPUT);
  digitalWrite(6, HIGH);
  u8g.setFont(u8g_font_tpssb);
  u8g.setColorIndex(1);
  for(int x=0;x<110;x+=10){
    u8g.firstPage();
    do {
     u8g.drawStr(10, 10, "VLab2");
     u8g.drawStr(25, 60, "Loading......");
     u8g.drawFrame(0, 20, 128, 30);
     u8g.drawBox(10, 25, x, 20);
    } while ( u8g.nextPage() );
  }
    u8g.firstPage();
    do {
     u8g.setFont(u8g_font_tpssb);
     u8g.drawStr(10, 10, "VLab2");
     u8g.setFont(u8g_font_profont10);
     u8g.drawStr(20, 22, "ON :          Sec");
     u8g.drawStr(20, 34, "OFF:          Sec");
     u8g.drawStr(20, 46, "Cycle:");
     u8g.setPrintPos(55, 22);
     u8g.print(Ontime,1);
     u8g.setPrintPos(55, 34); 
     u8g.print(Offtime);
     u8g.setPrintPos(55, 46); 
     u8g.print(cycle);
    } while ( u8g.nextPage() ); 
}

void loop() {
   if(!digitalRead(BTN01)){
     delay(500);
     if(!digitalRead(BTN01)){
       setting(); 
     }
   }
   if(!digitalRead(BTN02)){
     delay(50);
     if(!digitalRead(BTN02)){
       state=true;
       Time=millis();
       cycletag=cycle;
       //int cycletag1;
       digitalWrite(Relay01, LOW);
       while(cycletag){
         SetDisplay(); 
         if((millis()-Time)>(Ontime*1000)&&RelayState==true){
          digitalWrite(Relay01, HIGH);
          RelayState=false;
          Time=millis(); 
         }
         if((millis()-Time)>(Offtime*1000)&&RelayState==false){
          digitalWrite(Relay01, LOW);
          RelayState=true;
          Time=millis();
          cycletag--;  
         }
         if(!digitalRead(BTN02)){
           delay(100);
           if(!digitalRead(BTN02)){
             state=false;
             digitalWrite(Relay01, HIGH);
             RelayState=true;
             cycletag=0;
             SetDisplay();
             }}
       }
       state=false;
       digitalWrite(Relay01, HIGH);
       RelayState=true;
       SetDisplay();   
     }
   } 
  
}

void SetDisplay()
{
    u8g.firstPage();
    do {
     u8g.setFont(u8g_font_tpssb);
     u8g.drawStr(10, 10, "VLab2");
     u8g.setFont(u8g_font_profont10);
     u8g.drawStr(20, 22, "ON :          Sec");
     u8g.drawStr(20, 34, "OFF:          Sec");
     u8g.drawStr(20, 46, "Cycle:");
     if(state){
      u8g.drawStr(0, 60, "In-progress:  cycles done"); 
      u8g.setPrintPos(60, 60);
            {u8g.setFont(u8g_font_profont10);
            u8g.print(cycle-cycletag);}
     }
     Menuitem();
     if(option==1)u8g.setColorIndex(false);
      u8g.setPrintPos(55, 22);
           {
             u8g.setFont(u8g_font_profont10);
             u8g.print(Ontime,1); 
           }
     u8g.setColorIndex(true);
     if(option==2)u8g.setColorIndex(false);
     u8g.setPrintPos(55, 34);
          {
            u8g.setFont(u8g_font_profont10);
            u8g.print(Offtime);
           }
     u8g.setColorIndex(true);
     if(option==3)u8g.setColorIndex(false);
     u8g.setPrintPos(55, 46);
          {
            u8g.setFont(u8g_font_profont10);
            u8g.print(cycle);
           }
     u8g.setColorIndex(true);
    } while ( u8g.nextPage() ); 
}
int key()
{
  int Kval=0;
  if(!digitalRead(BTN03)){
    delay(30);
    if(!digitalRead(BTN03)){
     Kval=1; 
    }
   }
  else if(!digitalRead(BTN04)){
    delay(30);
    if(!digitalRead(BTN04)){
     Kval=2; 
    }
  }
  else if(!digitalRead(BTN02)){
    delay(30);
    if(!digitalRead(BTN02)){
     option=0;
     Kval=3; 
    } 
  }
  return Kval;
}
void Menuitem()
{
  switch(option){
    case 1:{
      u8g.drawBox(53,14,32,10);
      break;
    }
    case 2:{
      u8g.drawBox(53,26,32,10);
      break;
    }
    case 3:{
      u8g.drawBox(53,38,32,10);
      break;
    }
  }
}
void setting()
{
  while(key()!=3)
      {
          switch(option){
            case 1 :{
             if(key()==1){
              Ontime+=0.5;
              if(Ontime>60.5)Ontime=60.5; 
             }
             if(key()==2){
              Ontime-=0.5;
              if(Ontime<0.5)Ontime=0.5; 
             }
             break;
            }
            case 2 :{
             if(key()==1){
              Offtime+=1;
              if(Offtime>3600)Offtime=3600; 
             }
             if(key()==2){
              Offtime-=1;
              if(Offtime<1)Offtime=1; 
             }
             break;
            }
            case 3 :{
             if(key()==1){
              cycle+=1;
              if(cycle>100)cycle=100; 
             }
             if(key()==2){
              cycle-=1;
              if(cycle<1)cycle=1; 
             }
             break;
            }
          }
       SetDisplay();
       if(!digitalRead(BTN01)){
          delay(500);
          if(!digitalRead(BTN01)){
          option++;
          if(option>3)option=1;
          } }    
        
      }
      SetDisplay();
      delay(500);
}
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:GND.2
uno:RESET.2
uno:0
uno:1
uno:13
uno:3.3V
uno:AREF
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
uno:A6
uno:A7
uno:5V
uno:RESET
uno:GND.1
uno:VIN
uno:12.2
uno:5V.2
uno:13.2
uno:11.2
uno:RESET.3
uno:GND.3
ssd1306:GND
ssd1306:VCC
ssd1306:SCL
ssd1306:SDA
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
NOCOMNCVCCGNDINLED1PWRRelay Module
relay1:VCC
relay1:GND
relay1:IN
relay1:NC
relay1:COM
relay1:NO