//library
#include <LiquidCrystal_I2C.h>
//Rotary Encoder
#define SW 2
#define CLK 3
#define DT 4
//LED RGB
#define R 9
#define G 10
#define B 11
//LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Variabel
int DelayV = 1000;
int Rv = 200;
int Bv = 200;
int Gv = 200;
//setting
typedef enum{
Main_Menu,
Set_Rv,
Set_Gv,
Set_Bv,
Set_Delay,
}
Mode;
Mode mode=Main_Menu;
void geserMenu()
{
switch (mode){
case Main_Menu : mode = Set_Rv; break;
case Set_Rv : mode = Set_Gv; break;
case Set_Gv : mode = Set_Bv; break;
case Set_Bv : mode = Set_Delay; break;
case Set_Delay : mode = Main_Menu; break;
}
updateDisplay();
}
void putar(int delta)
{
switch (mode){
//case Main_Menu : analogWrite(R,Rv);analogWrite(G,Gv);analogWrite(B,Bv);
//delay(DelayV); break;
case Set_Rv : Rv = constrain(Rv+delta,0,255); break;
case Set_Gv : Gv = constrain(Gv+delta,0,255); break;
case Set_Bv : Bv = constrain(Bv+delta,0,255); break;
case Set_Delay : DelayV = constrain(DelayV+delta,0,9999); break;
}
}
void updateDisplay()
{
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("R:");
lcd.print(Rv);
if(mode==Set_Rv)
{
lcd.setCursor(0, 0);
lcd.print(">");
}
lcd.setCursor(9, 0);
lcd.print("G:");
lcd.print(Gv);
if(mode==Set_Gv)
{
lcd.setCursor(8, 0);
lcd.print(">");
}
lcd.setCursor(1, 1);
lcd.print("B:");
lcd.print(Bv);
if(mode==Set_Bv)
{
lcd.setCursor(0, 1);
lcd.print(">");
}
lcd.setCursor(9, 1);
lcd.print("dl:");
lcd.print(DelayV);
if(mode==Set_Delay)
{
lcd.setCursor(8, 1);
lcd.print(">");
}
}
void setup() {
//Rotary Encoder
pinMode(SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SW), geserMenu, FALLING);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
Serial.begin(9600);
//LCD
lcd.init ();
lcd.setBacklight(HIGH);
updateDisplay();
//interupt
//attachInterrupt(digitalPinToInterrupt(CLK), putar, CHANGE);
//lastSW=digitalRead(SW);
//lastCLK=digitalRead(CLK);
}
long int modeLastChanged = 0;
int prevClk = HIGH;
void loop() {
/*if (digitalRead(SW) == LOW && millis() - modeLastChanged > 300) {
modeLastChanged = millis();
GeserMenu();
updateDisplay();
}*/
int clk = digitalRead(CLK);
if (clk != prevClk && clk == LOW) {
int dt = digitalRead(DT);
int delta = dt == HIGH ? 5 : -5;
putar(delta);
updateDisplay();
}
prevClk = clk;
if(mode==Main_Menu)
{
analogWrite(R,Rv);
analogWrite(G,Gv);
analogWrite(B,Bv);
delay(DelayV);
analogWrite(R,0);
analogWrite(G,0);
analogWrite(B,0);
delay(DelayV);
}
}