// /**
//    Arduino Electronic Safe

//    Copyright (C) 2020, Uri Shaked.
//    Released under the MIT License.
// */

// #include <LiquidCrystal.h>
// #include <Keypad.h>
// #include <Servo.h>
// #include "SafeState.h"
// #include "icons.h"

// /* Locking mechanism definitions */
// #define SERVO_PIN 6
// #define SERVO_LOCK_POS   20
// #define SERVO_UNLOCK_POS 90
// Servo lockServo;

// /* Display */
// LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

// /* Keypad setup */
// const byte KEYPAD_ROWS = 4;
// const byte KEYPAD_COLS = 4;
// byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
// byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
// char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
//   {'1', '2', '3', 'A'},
//   {'4', '5', '6', 'B'},
//   {'7', '8', '9', 'C'},
//   {'*', '0', '#', 'D'}
// };

// Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);

// /* SafeState stores the secret code in EEPROM */
// SafeState safeState;

// void lock() {
//   lockServo.write(SERVO_LOCK_POS);
//   safeState.lock();
// }

// void unlock() {
//   lockServo.write(SERVO_UNLOCK_POS);
// }

// void showStartupMessage() {
//   lcd.setCursor(4, 0);
//   lcd.print("Welcome!");
//   delay(1000);

//   lcd.setCursor(0, 2);
//   String message = "ArduinoSafe v1.0";
//   for (byte i = 0; i < message.length(); i++) {
//     lcd.print(message[i]);
//     delay(100);
//   }
//   delay(500);
// }

// String inputSecretCode() {
//   lcd.setCursor(5, 1);
//   lcd.print("[____]");
//   lcd.setCursor(6, 1);
//   String result = "";
//   while (result.length() < 4) {
//     char key = keypad.getKey();
//     if (key >= '0' && key <= '9') {
//       lcd.print('*');
//       result += key;
//     }
//   }
//   return result;
// }

// void showWaitScreen(int delayMillis) {
//   lcd.setCursor(2, 1);
//   lcd.print("[..........]");
//   lcd.setCursor(3, 1);
//   for (byte i = 0; i < 10; i++) {
//     delay(delayMillis);
//     lcd.print("=");
//   }
// }

// bool setNewCode() {
//   lcd.clear();
//   lcd.setCursor(0, 0);
//   lcd.print("Enter new code:");
//   String newCode = inputSecretCode();

//   lcd.clear();
//   lcd.setCursor(0, 0);
//   lcd.print("Confirm new code");
//   String confirmCode = inputSecretCode();

//   if (newCode.equals(confirmCode)) {
//     safeState.setCode(newCode);
//     return true;
//   } else {
//     lcd.clear();
//     lcd.setCursor(1, 0);
//     lcd.print("Code mismatch");
//     lcd.setCursor(0, 1);
//     lcd.print("Safe not locked!");
//     delay(2000);
//     return false;
//   }
// }

// void showUnlockMessage() {
//   lcd.clear();
//   lcd.setCursor(0, 0);
//   lcd.write(ICON_UNLOCKED_CHAR);
//   lcd.setCursor(4, 0);
//   lcd.print("Unlocked!");
//   lcd.setCursor(15, 0);
//   lcd.write(ICON_UNLOCKED_CHAR);
//   delay(1000);
// }

// void safeUnlockedLogic() {
//   lcd.clear();

//   lcd.setCursor(0, 0);
//   lcd.write(ICON_UNLOCKED_CHAR);
//   lcd.setCursor(2, 0);
//   lcd.print(" # to lock");
//   lcd.setCursor(15, 0);
//   lcd.write(ICON_UNLOCKED_CHAR);

//   bool newCodeNeeded = true;

//   if (safeState.hasCode()) {
//     lcd.setCursor(0, 1);
//     lcd.print("  A = new code");
//     newCodeNeeded = false;
//   }

//   auto key = keypad.getKey();
//   while (key != 'A' && key != '#') {
//     key = keypad.getKey();
//   }

//   bool readyToLock = true;
//   if (key == 'A' || newCodeNeeded) {
//     readyToLock = setNewCode();
//   }

//   if (readyToLock) {
//     lcd.clear();
//     lcd.setCursor(5, 0);
//     lcd.write(ICON_UNLOCKED_CHAR);
//     lcd.print(" ");
//     lcd.write(ICON_RIGHT_ARROW);
//     lcd.print(" ");
//     lcd.write(ICON_LOCKED_CHAR);

//     safeState.lock();
//     lock();
//     showWaitScreen(100);
//   }
// }

// void safeLockedLogic() {
//   lcd.clear();
//   lcd.setCursor(0, 0);
//   lcd.write(ICON_LOCKED_CHAR);
//   lcd.print(" Safe Locked! ");
//   lcd.write(ICON_LOCKED_CHAR);

//   String userCode = inputSecretCode();
//   bool unlockedSuccessfully = safeState.unlock(userCode);
//   showWaitScreen(200);

//   if (unlockedSuccessfully) {
//     showUnlockMessage();
//     unlock();
//   } else {
//     lcd.clear();
//     lcd.setCursor(0, 0);
//     lcd.print("Access Denied!");
//     showWaitScreen(1000);
//   }
// }

// void setup() {
//   lcd.begin(16, 2);
//   init_icons(lcd);

//   lockServo.attach(SERVO_PIN);

//   /* Make sure the physical lock is sync with the EEPROM state */
//   Serial.begin(115200);
//   if (safeState.locked()) {
//     lock();
//   } else {
//     unlock();
//   }

//   showStartupMessage();
// }

// void loop() {
//   if (safeState.locked()) {
//     safeLockedLogic();
//   } else {
//     safeUnlockedLogic();
//   }
// }



/*
 Created by Rui Santos
 
 All the resources for this project:
 https://randomnerdtutorials.com/
 
 Based on some Arduino code examples 
*/

// include the library code
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

// LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

int potPin = A0;       // Analog pin 0 for the LED brightness potentiometer
int ledPin = 6;        // LED Digital Pin with PWM
int potValue = 0;      // variable to store the value coming from the potentiometer
int brightness = 0;    // converts the potValue into a brightness 
int pBari = 0;         // progress bar
int i = 0;             // foor loop

//progress bar character for brightness
byte pBar[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};

void setup() {
  // setup our led as an OUTPUT
  pinMode(ledPin, OUTPUT); 
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD
  lcd.print(" LED Brightness");
  //Create the progress bar character
  lcd.createChar(0, pBar);
}

void loop() {
  // clears the LCD screen
  lcd.clear();
  // Print a message to the LCD
  lcd.print(" LED Brightness");
  //set the cursor to line number 2
  lcd.setCursor(0,1);
  // read the value from the potentiometer
  potValue = analogRead(potPin);        
  // turns the potValue into a brightness for the LED
  brightness=map(potValue, 0, 1024, 0, 255); 
  //lights up the LED according to the bightness
  analogWrite(ledPin, brightness); 
  // turns the brighness into a percentage for the bar 
  pBari=map(brightness, 0, 255, 0, 17);
  //prints the progress bar
  for (i=0; i < pBari; i++)
  {
    lcd.setCursor(i, 1);   
    lcd.write(byte(0));  
  }
  // delays 750 ms
  delay(750);        
}