Dammeul
Published © CC BY

Code Lock Concept

Only my 2nd attempt at anything. Connected motor to L239D and a joystick for my 1st go and thought a Code Lock would be interesting to setup

BeginnerShowcase (no instructions)2 hours535
Code Lock Concept

Things used in this project

Story

Read more

Schematics

Schematic Image

Fritizing File

Code

Code Lock Code

C/C++
#include "IRremote.h"
#include "IR.h"
#include "pitches.h"
#include "LiquidCrystal.h"
#define BLUE 6
#define GREEN 9
#define RED 10
#define LCD 13

LiquidCrystal lcd(2, 4, 7, 3, 5, 8);
IRrecv irrecv(RECEIVER);     // create instance of 'irrecv'
decode_results results;      // create instance of 'decode_results'

boolean isPowerButtonPressed = false;
boolean isLedOn = false;
int redValue;
int greenValue;
int blueValue;
int duration = 150;  // 500 miliseconds
int codeDigitCount = 0;
int attemptsRemaining = 3;
String codeInputted = "";

void PlayMelody(const char* type)
{
  int success[] = { NOTE_B5, NOTE_C6, NOTE_B5, NOTE_C6, NOTE_B5, NOTE_C6, NOTE_B5, NOTE_C6 };
  int error[] = { NOTE_C5, NOTE_D5, NOTE_C5, NOTE_D5 };
  int off[] = { NOTE_C6, NOTE_B5, NOTE_A5, NOTE_G5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_C5 };
  int on[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6 };
  int alarm[] = { NOTE_A5, NOTE_A4, NOTE_A5, NOTE_A2, NOTE_A5, NOTE_A2, NOTE_A5, NOTE_A4,NOTE_A5, NOTE_A4, NOTE_A5, NOTE_A2, NOTE_A5, NOTE_A2, NOTE_A5, NOTE_A4,};
  if (type == "success") {
    for (int thisNote = 0; thisNote < 8; thisNote++) {
      tone(12, success[thisNote], duration);
      delay(100);
    }
  } else if (type == "error") {
    for (int thisNote = 0; thisNote < 4; thisNote++) {
      tone(12, error[thisNote], duration);
      delay(100);
    }
  } else if (type == "off") {
    for (int thisNote = 0; thisNote < 8; thisNote++) {
      tone(12, off[thisNote], duration);
      delay(100);
    }
  } else if (type == "on") {
    for (int thisNote = 0; thisNote < 8; thisNote++) {
      tone(12, on[thisNote], duration);
      delay(100);
    }
  } else if (type == "alarm") {
    for (int thisNote = 0; thisNote < 16; thisNote++) {
      tone(12, alarm[thisNote], 500);
      delay(500);
    }
  }
}

void PowerOff()
{
  redValue = 0;
  greenValue = 0;
  blueValue = 0;
  codeDigitCount = 0;
  codeInputted = "";
  isPowerButtonPressed = false;
  SetLedColour(redValue, greenValue, blueValue);
  PlayMelody("off");
  attemptsRemaining = 3;
  ClearLcdScreen();
  digitalWrite(LCD, LOW);
}

void PowerOn()
{
  redValue = 0;
  greenValue = 0;
  blueValue = 255;
  codeDigitCount = 0;
  codeInputted = "";
  isPowerButtonPressed = false;
  SetLedColour(redValue, greenValue, blueValue);
  PlayMelody("on");
  ClearLcdScreen();
  ResetLcdScreen();
  digitalWrite(LCD, HIGH);
}

void TooManyIncorrectAttempts()
{
  redValue = 255;
  greenValue = 0;
  blueValue = 0;
  SetLedColour(redValue, greenValue, blueValue);
  lcd.setCursor(0, 0);
  ClearLcdScreen();
  lcd.setCursor(0, 0);
  lcd.print("Too bad...");
  lcd.setCursor(0, 1);
  lcd.print("Alarm Triggered!!!");
  PlayMelody("alarm");
}

void MarqueeScroll() {
  for (int positionCounter = 7; positionCounter > 0; positionCounter--) {
    lcd.scrollDisplayLeft();
    delay(250);
  }
  delay(250);
  for (int positionCounter = 7; positionCounter > 0; positionCounter--) {
    lcd.scrollDisplayRight();
    delay(250);
  }
  delay(250);
  for (int positionCounter = 7; positionCounter > 0; positionCounter--) {
    lcd.scrollDisplayRight();
    delay(250);
  }
  delay(250);
  for (int positionCounter = 7; positionCounter > 0; positionCounter--) {
    lcd.scrollDisplayLeft();
    delay(250);
  }
  delay(250);
}

void TextMarquee() {
  MarqueeScroll();
  
  ClearLcdScreen();
  lcd.setCursor(6, 1);
  lcd.print(".42.");
  lcd.setCursor(0, 0);
  delay(1000);
  
  ClearLcdScreen();
  lcd.setCursor(6, 0);
  lcd.print(".42.");
  
  ClearLcdScreen();
  lcd.setCursor(6, 1);
  lcd.print(".42.");
  
  ClearLcdScreen();
  lcd.setCursor(6, 0);
  lcd.print(".42.");
}

void CodeAccepted()
{
  redValue = 0;
  greenValue = 255;
  blueValue = 0;
  SetLedColour(redValue, greenValue, blueValue);
  lcd.setCursor(0, 0);
  lcd.print("Code Accepted!!!");
  PlayMelody("success");
  delay(2000);

  ClearLcdScreen();
  lcd.setCursor(0, 0);
  lcd.print("The answer to");
  lcd.setCursor(0, 1);
  lcd.print("the ultimate ");
  delay(2000);

  ClearLcdScreen();
  lcd.setCursor(0, 0);
  lcd.print("question of life,");
  lcd.setCursor(0, 1);
  lcd.print("the universe");
  delay(2000);

  ClearLcdScreen();
  lcd.setCursor(0, 0);
  lcd.print("and everything");
  lcd.setCursor(0, 1);
  lcd.print("is...");
  delay(2500);

  ClearLcdScreen();
  lcd.setCursor(6, 0);
  lcd.print(".42.");
  lcd.setCursor(0, 0);
  delay(1000);

  TextMarquee();

}

void IncorrectCode()
{
  attemptsRemaining = attemptsRemaining - 1;
  redValue = 255;
  greenValue = 0;
  blueValue = 0;
  SetLedColour(redValue, greenValue, blueValue);

  lcd.setCursor(0, 0);
  lcd.print("Incorrect code!");
  lcd.setCursor(0, 1);
  String message = (String(attemptsRemaining) + "/3 attempts.");
  lcd.print(message);
  PlayMelody("error");
  delay(2000);


  redValue = 0;
  blueValue = 255;
  SetLedColour(redValue, greenValue, blueValue);
  ClearLcdScreen();
  ResetLcdScreen();
}

void SetupRgbLed()
{
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  digitalWrite(RED, LOW);
  digitalWrite(GREEN, LOW);
  digitalWrite(BLUE, HIGH);
  PlayMelody("on");
}

void SetupIrReceiever()
{
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode");
  irrecv.enableIRIn();
}

void SetLedColour(int redValue, int greenValue, int blueValue)
{
  analogWrite(RED, redValue);
  analogWrite(GREEN, greenValue);
  analogWrite(BLUE, blueValue);
}

void  SetupLcdDisplay()
{
  pinMode(LCD, OUTPUT);
  digitalWrite(LCD, HIGH);
  lcd.begin(16, 2);
  lcd.print("Please enter");
  lcd.setCursor(0, 1);
  lcd.print("unlock code...");
}

void ClearLcdScreen()
{
  lcd.setCursor(0, 0);
  lcd.print("                                ");
  lcd.setCursor(0, 1);
  lcd.print("                                ");
}

void ResetLcdScreen()
{
  lcd.setCursor(0, 0);
  lcd.print("Please enter");
  lcd.setCursor(0, 1);
  lcd.print("unlock code...");
}

void LoopIrReceiever()
{
  int tmpValue;
  if (irrecv.decode(&results))
  {
    for (int i = 0; i < 23; i++)
    {
      if ((keyValue[i] == results.value) && (i < KEY_NUM))
      {
        ClearLcdScreen();
        switch (results.value)
        {
          case 0xFFA25D:
            Serial.println("POWER");
            isPowerButtonPressed = true;
            isLedOn = !isLedOn;
            break;
            
          case 0xFFE21D: Serial.println("FUNC/STOP"); break;
          case 0xFF629D: Serial.println("VOL+"); break;
          case 0xFF22DD: Serial.println("FAST BACK");    break;
          case 0xFF02FD: Serial.println("PAUSE");    break;
          case 0xFFC23D: Serial.println("FAST FORWARD");   break;
          case 0xFFE01F: Serial.println("DOWN");    break;
          case 0xFFA857: Serial.println("VOL-");    break;
          case 0xFF906F: Serial.println("UP");    break;
          case 0xFF9867: Serial.println("EQ");    break;
          case 0xFFB04F: Serial.println("ST/REPT");    break;

          case 0xFF6897:
            codeInputted = codeInputted + "0";
            break;

          case 0xFF30CF:
            codeInputted = codeInputted + "1";
            break;

          case 0xFF18E7:
            codeInputted = codeInputted + "2";
            break;

          case 0xFF7A85:
            codeInputted = codeInputted + "3";
            break;

          case 0xFF10EF:
            codeInputted = codeInputted + "4";
            break;

          case 0xFF38C7:
            codeInputted = codeInputted + "5";
            break;

          case 0xFF5AA5:
            codeInputted = codeInputted + "6";
            break;

          case 0xFF42BD:
            codeInputted = codeInputted + "7";
            break;

          case 0xFF4AB5:
            codeInputted = codeInputted + "8";
            break;

          case 0xFF52AD:
            codeInputted = codeInputted + "9";
            break;

          case 0xFFFFFFFF:
            Serial.println(" REPEAT");
            break;

          default:
            Serial.println("other button");
            break;
        }


        Serial.println("codeInputted");
        Serial.println(codeInputted);
        Serial.println("codeDigitCount");
        Serial.println(codeDigitCount);


        if (isPowerButtonPressed && isLedOn) {
          PowerOff();
        } else if (isPowerButtonPressed && !isLedOn) {
          PowerOn();
        } else {
          if (!attemptsRemaining) {
            TooManyIncorrectAttempts();
          } else {
            if (codeDigitCount >= 7) {
              if (codeInputted == "01020304") {
                CodeAccepted();
              } else {
                IncorrectCode();
              }
              codeDigitCount = 0;
              codeInputted = "";
            } else {
              codeDigitCount = codeDigitCount + 1;
              switch (codeDigitCount) {
                case 1:
                  ClearLcdScreen();
                  lcd.setCursor(0, 0);
                  lcd.print("*");
                  break;
                case 2:
                  ClearLcdScreen();
                  lcd.setCursor(0, 0);
                  lcd.print("**");
                  break;
                case 3:
                  ClearLcdScreen();
                  lcd.setCursor(0, 0);
                  lcd.print("***");
                  break;
                case 4:
                  ClearLcdScreen();
                  lcd.setCursor(0, 0);
                  lcd.print("****");
                  break;
                case 5:
                  ClearLcdScreen();
                  lcd.setCursor(0, 0);
                  lcd.print("*****");
                  break;
                case 6:
                  ClearLcdScreen();
                  lcd.setCursor(0, 0);
                  lcd.print("******");
                  break;
                case 7:
                  ClearLcdScreen();
                  lcd.setCursor(0, 0);
                  lcd.print("*******");
                  break;
                case 8:
                  ClearLcdScreen();
                  lcd.setCursor(0, 0);
                  lcd.print("********");
                  break;
              }
            }
          }
        }
      }
      else if (REPEAT == i)
      {
        results.value = tmpValue;
      }
    }
    irrecv.resume();
  }
}

void setup()
{
  SetupRgbLed();
  SetupIrReceiever();
  SetupLcdDisplay();
}

void loop()
{
  LoopIrReceiever();
}

Credits

Dammeul
1 project • 1 follower
Developer by trade. Over 15 years Dev and Infrastructure experience. Complete beginner to Micro-controllers though. Bare with me..!

Comments