#include <LiquidCrystal.h>
#define BTN_UP 2
#define BTN_LEFT 3
#define BTN_OK 4
#define BTN_RIGHT 13
#define BTN_DOWN 6
#define PHOTOR A0
#define LED 5
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int state = 0;
String names[4] = {"Led", "Photo", "Brightness", "Progress Bar"};
String photoModes[2] = {"Manual", "Auto"};
boolean UpWasUp = true;
boolean DownWasUp = true;
boolean LeftWasUp = true;
boolean RightWasUp = true;
boolean OkWasUp = true;
int index = 0;
int photoMode = 0;
int manualBright = 150;
unsigned long timeBlink = 0;
void setup() {
lcd.begin(16, 2);
lcd.print("Start...");
delay(1000);
lcd.clear();
for (int i = 2; i < 7; i++) {
pinMode(i == 5 ? 13 : i, INPUT_PULLUP);
}
pinMode(LED, OUTPUT);
}
void loop() {
if (state == 0) menuScreen();
else if (state == 1) ledScreen();
else if (state == 2) photoScreen();
else if (state == 3) brightnessScreen();
else if (state == 4) progressBarScreen();
boolean Ok = digitalRead(BTN_OK);
if (Ok != OkWasUp) {
delay(20);
Ok = digitalRead(BTN_OK);
if (!Ok) {
lcd.clear();
if (state == 0) {
if (index == 0) state = 1;
if (index == 1) state = 2;
if (index == 2) state = 3;
if (index == 3) state = 4;
} else {
state = 0;
}
}
}
OkWasUp = Ok;
}
void menuScreen() {
lcd.setCursor(0, 0);
lcd.print("Menu");
lcd.setCursor(0, 1);
printLine(names[index]);
boolean Up = digitalRead(BTN_UP);
if (Up != UpWasUp) {
delay(10);
Up = digitalRead(BTN_UP);
if (!Up) index = (index + 1) % 4;
}
UpWasUp = Up;
boolean Down = digitalRead(BTN_DOWN);
if (Down != DownWasUp) {
delay(10);
Down = digitalRead(BTN_DOWN);
if (!Down) index = (index - 1 < 0 ? 3 : index - 1);
}
DownWasUp = Down;
}
void ledScreen() {
lcd.setCursor(0, 0);
lcd.print("LED Mode");
lcd.setCursor(0, 1);
printLine("Photo:" + photoModes[photoMode]);
int value = analogRead(PHOTOR);
value = constrain(value, 0, 1023);
if (photoMode == 1) {
int bright = map(value, 0, 1023, 255, 0);
analogWrite(LED, bright);
}
else {
analogWrite(LED, manualBright);
}
boolean Right = digitalRead(BTN_RIGHT);
if (Right != RightWasUp) {
delay(10);
Right = digitalRead(BTN_RIGHT);
if (!Right) photoMode = (photoMode + 1) % 2;
}
RightWasUp = Right;
boolean Left = digitalRead(BTN_LEFT);
if (Left != LeftWasUp) {
delay(10);
Left = digitalRead(BTN_LEFT);
if (!Left) photoMode = (photoMode == 0 ? 1 : 0);
}
LeftWasUp = Left;
}
void photoScreen() {
int value = analogRead(PHOTOR);
value = constrain(value, 0, 1023);
int percent = map(value, 0, 1023, 0, 100);
lcd.setCursor(0, 0);
lcd.print("Photo:");
lcd.setCursor(7, 0);
lcd.print(photoModes[photoMode]);
lcd.setCursor(0, 1);
lcd.print("Light:");
lcd.print(percent);
lcd.print("% ");
if (photoMode == 1) {
int bright = map(value, 0, 1023, 255, 0);
analogWrite(LED, bright);
}
boolean Right = digitalRead(BTN_RIGHT);
if (Right != RightWasUp) {
delay(10);
Right = digitalRead(BTN_RIGHT);
if (!Right) photoMode = (photoMode + 1) % 2;
}
RightWasUp = Right;
boolean Left = digitalRead(BTN_LEFT);
if (Left != LeftWasUp) {
delay(10);
Left = digitalRead(BTN_LEFT);
if (!Left) photoMode = (photoMode == 0 ? 1 : 0);
}
LeftWasUp = Left;
}
void brightnessScreen() {
lcd.setCursor(0, 0);
lcd.print("Brightness");
int percent = map(manualBright, 0, 255, 0, 100);
lcd.setCursor(0, 1);
lcd.print(percent);
lcd.print("% ");
if (photoMode == 0)
analogWrite(LED, manualBright);
boolean Right = digitalRead(BTN_RIGHT);
if (Right != RightWasUp) {
delay(10);
Right = digitalRead(BTN_RIGHT);
if (!Right) {
manualBright += 5;
if (manualBright > 255) manualBright = 255;
}
}
RightWasUp = Right;
boolean Left = digitalRead(BTN_LEFT);
if (Left != LeftWasUp) {
delay(10);
Left = digitalRead(BTN_LEFT);
if (!Left) {
manualBright -= 5;
if (manualBright < 0) manualBright = 0;
}
}
LeftWasUp = Left;
}
void progressBarScreen() {
int value = analogRead(PHOTOR);
int percent = map(value, 0, 1023, 0, 100);
int bars = percent / 10;
lcd.setCursor(0, 0);
lcd.print("Progress Bar");
lcd.setCursor(0, 1);
for (int i = 0; i < 10; i++) {
if (i < bars) lcd.write(255);
else lcd.print(" ");
}
lcd.setCursor(12, 1);
lcd.print(percent);
lcd.print("% ");
}
void printLine(String s) {
for (int i = 0; i < 16; i++) {
if (i < s.length()) lcd.print(s[i]);
else lcd.print(" ");
}
}