#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

#define led1 13
#define led2 12
#define relay 11
#define speak 10

#define pin_select 7
#define pin_up 6
#define pin_down 5

void setup() {
  lcd.init();
  lcd.init();
  lcd.backlight();
  lcd.print("Hello World");
  delay(500);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(relay, OUTPUT);
  pinMode(speak, OUTPUT);

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(relay, LOW);

  pinMode(pin_select, INPUT_PULLUP);
  pinMode(pin_up, INPUT_PULLUP);
  pinMode(pin_down, INPUT_PULLUP);
}

void blink(){
  digitalWrite(led1, (millis()/1000)%2);
}

void limpa(){
  for(int c=0; c<17; c++){
    for(int l=0; l<2;l++){
      lcd.setCursor(c, l);
      lcd.print(" ");
    }
  }
}

void menu(){
  const int MX_OPT = 5;
  int dy = 0, opt = 0;
  bool key = 0, opSt[MX_OPT] = {0}, blk = 0;

  String msg[2][MX_OPT] = {
    {"L1 On", "L2 On", "Rly On", "Rst", "Blk On"},
    {"L1 Off", "L2 Off", "Rly Off", "Rst", "Blk Off"}
  };

  // lcd.clear();
  limpa();
  while(1){
    lcd.setCursor(0,0);
    lcd.print(opt);
    if(!dy) lcd.print(">");
    else lcd.print(" ");
    lcd.print(msg[opSt[opt]][opt]);

    lcd.setCursor(0, 1);
    lcd.print(opt+1);
    if(dy) lcd.print(">");
    else lcd.print(" ");
    lcd.print(msg[opSt[opt + 1]][opt + 1]);

    //mover opçoes
    if(key && !digitalRead(pin_down)){
      //lcd.clear();
      limpa();
      tone(speak, 150, 10);
      if(!dy) dy = 1;
      else if (++opt >= MX_OPT - 1){
        dy = 0;
        opt = 0;
      }
    }

    if(key && !digitalRead(pin_up)){
      // lcd.clear();
      limpa();
      tone(speak, 160, 10);
      if(dy) dy = 0;
      else if (--opt < 0){
        dy = 1;
        opt = MX_OPT - 2;
      }
    }

    //trava dos botoes
    key = 1;
    // for(int i=5; i<7; i++) if(!digitalRead(i)) key = 0;
    if(!digitalRead(pin_select)) key = 0;
    if(!digitalRead(pin_down)) key = 0;
    if(!digitalRead(pin_up)) key = 0;
    delay(10);

    //controle das portas
    if(!digitalRead(pin_select)){
      // lcd.clear();
      limpa();
      while(!digitalRead(pin_select));
      opSt[opt+dy] = !opSt[opt+dy];
      switch(opt + dy){
        case 0: digitalWrite(led1, opSt[opt+dy]); break;
        case 1: digitalWrite(led2, opSt[opt+dy]); break;
        case 2: digitalWrite(relay, opSt[opt+dy]); break;
        case 3: setup(); return; break;
        case 4: blk = !blk; break;
      }//end switch opt
    }//end if select

    if(blk){
      blink();
    }

  }//end while 1
}//end void menu

void loop() {
  menu();
  //blink();

}