цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Имитация механизма защиты сейфа на основе Arduino и потенциометров




Имитация механизма защиты сейфа на основе Arduino и потенциометров

Автор: Mike(admin) от 3-07-2022, 23:55

Если вы любите смотреть фильмы про ограбления банков, то, вероятно, замечали, что в некоторых из них похитители вращают различные ручки сейфов, чтобы уловить определенную комбинацию, при которых сейф откроется.


Имитация механизма защиты сейфа на основе Arduino и потенциометров

В качестве учебного примера мы сделаем проект на Arduino, который будет повторять по своему принципу действия механизм открытия сейфа посредством вращающихся ручек. Для этого нам понадобятся помимо Arduino еще потенциометры, ЖК-дисплей, зуммер, светодиоды, кнопка и некоторые пассивные компоненты.


Мы реализовали проект с тремя разными наборами последовательностей комбинаций. Если пользователь вводит правильную первую комбинацию, то доступ предоставляется, иначе он перейдет к следующей сохраненной последовательности комбинаций, чтобы пользователь мог повторить попытку.


И если следующая комбинация будет неправильной, пользователь перейдет к последней сохраненной последовательности, чтобы он мог попробовать еще раз. Когда пользователь не сможет войти три раза подряд, «система» выключится.


На следующих изображениях представлены схемы подключения компонентов (макетная и принципиальная).


Имитация механизма защиты сейфа на основе Arduino и потенциометров

Имитация механизма защиты сейфа на основе Arduino и потенциометров

Код программы Arduino представлен далее.



#include <LiquidCrystal_I2C.h>

int pot1, pot2, pot3, pot4;
const int buzzer = 9;
const int buttonPin = 2;

const int D1_LED = 7;
const int D2_LED = 6;
const int D3_LED = 5;
const int D4_LED = 4;

unsigned long firstDigitTime;
unsigned long lastDigitTime;

int timeLimit = 8000;
int i = 0;
int t = 0;
int load = 0;

int line;
int count;

int password[5] = {1, 2, 3, 4};

byte loadingBar[] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};

LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  Serial.begin(9600);
  pinMode(D1_LED, OUTPUT);
  pinMode(D2_LED, OUTPUT);
  pinMode(D3_LED, OUTPUT);
  pinMode(D4_LED, OUTPUT);
  pinMode(buttonPin, INPUT);

  lcd.init();
  lcd.createChar(0, loadingBar);
}

void loop() {
  for (count = 0; count < 3;) {
    if (count == 0) {
      while (load < 1) {
        safeInit();
        load = 1;
      }
      Combination_original();
    }
    if (count == 1) {
      while (load < 1) {
        lcd.clear();
        lcd.print("Press button once...");
        while (digitalRead(buttonPin) != HIGH) {}
        if (digitalRead(buttonPin) == HIGH) {
          i = 0;
          t = 0;
        }
        delay(100);
        safeInit();
        load = 1;
      }
      Combination_one();
    }
    if (count == 2) {
      while (load < 1) {
        lcd.clear();
        lcd.print("Press button once...");
        while (digitalRead(buttonPin) != HIGH) {}
        if (digitalRead(buttonPin) == HIGH) {
          i = 0;
          t = 0;
        }
        delay(100);
        safeInit();
        load = 1;
      }
      Combination_two();
    }
  }
  delay(3000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("      Goodbye.      ");
  delay(1000);
  tone(buzzer, 2000);
  delay(100);
  noTone(buzzer);
  delay(50);
  tone(buzzer, 2000);
  delay(100);
  noTone(buzzer);
  delay(50);
  lcd.clear();
  lcd.noBacklight();
}

void safeInit() {
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("      Arduino       ");
  lcd.setCursor(0, 1);
  lcd.print("  Combination Safe  ");
  delay(5000);
  lcd.clear();
  lcd.print("      Loading...    ");
  delay(1000);
  lcd.setCursor(0, 1);
  for (line = 0; line < 20; line++) {
    lcd.write(0);
    delay(200);
  }
  delay(250);
  tone(buzzer, 2000);
  delay(100);
  noTone(buzzer);
  delay(50);
  tone(buzzer, 2000);
  delay(100);
  noTone(buzzer);
  delay(50);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print(" Enter combination: ");
}

void Combination_original() {
  while (i < 4) {
    if (pot1_digact(password[0]) == 1) {      
      digitalWrite(D1_LED, HIGH);    
      while (t < 1) {
        firstDigitTime = millis();
        Serial.print("First Digit Time: ");
        Serial.println(firstDigitTime);
        t = 1;
      }
      i = 1;
      if (pot2_digact(password[1]) == 1) {  
        digitalWrite(D2_LED, HIGH); 
        i = 2;
        if (pot3_digact(password[2]) == 1) {  
          digitalWrite(D3_LED, HIGH);  
          i = 3;
          if (pot4_digact(password[3]) == 1) {
            digitalWrite(D4_LED, HIGH); 
            t = 0;      
            while (t < 1) {
              lastDigitTime = millis();
              Serial.print("Last Digit Time: ");
              Serial.println(lastDigitTime);
              t = 1;
            }
            if (lastDigitTime - firstDigitTime < timeLimit) {
              accessGranted();
            }
            else {
              accessDenied();
              count++;
              load = 0;
            }
            delay(1000);
            digitalWrite(D1_LED, LOW);
            digitalWrite(D3_LED, LOW);
            digitalWrite(D2_LED, LOW);
            digitalWrite(D4_LED, LOW);
            i = 4;
          }
          else {
            digitalWrite(D4_LED, LOW);
          }
        }
        else {
          digitalWrite(D3_LED, LOW);
        }
      }
      else {
        digitalWrite(D2_LED, LOW);
      }
    }
    else {
      digitalWrite(D1_LED, LOW);
    }
  }
}

void Combination_one() {
  while (i < 4) {
    if (pot1_digact(password[0]) == 1) {    
      digitalWrite(D1_LED, HIGH); 
      while (t < 1) {
        firstDigitTime = millis();
        Serial.print("First Digit Time: ");
        Serial.println(firstDigitTime);
        t = 1;
      }
      i = 1;
      if (pot3_digact(password[1]) == 1) {  
        digitalWrite(D2_LED, HIGH);  
        i = 2;
        if (pot2_digact(password[2]) == 1) {  
          digitalWrite(D3_LED, HIGH);  
          i = 3;
          if (pot4_digact(password[3]) == 1) {
            digitalWrite(D4_LED, HIGH);
            t = 0;   
            while (t < 1) {
              lastDigitTime = millis();
              Serial.print("Last Digit Time: ");
              Serial.println(lastDigitTime);
              t = 1;
            }
            if (lastDigitTime - firstDigitTime < timeLimit) {
              accessGranted();
            }
            else {
              accessDenied();
              count++;
              load = 0;
            }
            delay(1000);
            digitalWrite(D1_LED, LOW);
            digitalWrite(D3_LED, LOW);
            digitalWrite(D2_LED, LOW);
            digitalWrite(D4_LED, LOW);
            i = 4;
          }
          else {
            digitalWrite(D4_LED, LOW);
          }
        }
        else {
          digitalWrite(D3_LED, LOW);
        }
      }
      else {
        digitalWrite(D2_LED, LOW);
      }
    }
    else {
      digitalWrite(D1_LED, LOW);
    }
  }
}

void Combination_two() {
  while (i < 4) {
    if (pot4_digact(password[0]) == 1) {
      digitalWrite(D1_LED, HIGH);
      while (t < 1) {
        firstDigitTime = millis();
        Serial.print("First Digit Time: ");
        Serial.println(firstDigitTime);
        t = 1;
      }
      i = 1;
      if (pot3_digact(password[1]) == 1) {
        digitalWrite(D2_LED, HIGH);
        i = 2;
        if (pot2_digact(password[2]) == 1) {
          digitalWrite(D3_LED, HIGH);
          i = 3;
          if (pot1_digact(password[3]) == 1) {
            digitalWrite(D4_LED, HIGH);
            t = 0;
            while (t < 1) {
              lastDigitTime = millis();
              Serial.print("Last Digit Time: ");
              Serial.println(lastDigitTime);
              t = 1;
            }
            if (lastDigitTime - firstDigitTime < timeLimit) {
              accessGranted();
            }
            else {
              accessDenied();
              count++;
            }
            delay(1000);
            digitalWrite(D1_LED, LOW);
            digitalWrite(D3_LED, LOW);
            digitalWrite(D2_LED, LOW);
            digitalWrite(D4_LED, LOW);
            i = 4;
          }
          else {
            digitalWrite(D4_LED, LOW);
          }
        }
        else {
          digitalWrite(D3_LED, LOW);
        }
      }
      else {
        digitalWrite(D2_LED, LOW);
      }
    }
    else {
      digitalWrite(D1_LED, LOW);
    }
  }
}

int pot1_digact(int val) {
  pot1 = analogRead(A0);
  switch (val) {
    case 1:
      if ((val == 1) && pot1 >= 100 && pot1 <= 199) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 2:
      if ((val == 2) && pot1 >= 200 && pot1 <= 399) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 3:
      if ((val == 3) && pot1 >= 300 && pot1 <= 399) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 4:
      if ((val == 4) && pot1 >= 400 && pot1 <= 499) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 5:
      if ((val == 5) && pot1 >= 500 && pot1 <= 599) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 6:
      if ((val == 6) && pot1 >= 600 && pot1 <= 699) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 7:
      if ((val == 7) && pot1 >= 700 && pot1 <= 799) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 8:
      if ((val == 8) && pot1 >= 800 && pot1 <= 899) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 9:
      if ((val == 9) && pot1 >= 900) {
        return 1;
      }
      else {
        return 0;
      }
      break;
  }
}

int pot2_digact(int val) {
  pot2 = analogRead(A1);
  switch (val) {
    case 1:
      if ((val == 1) && pot2 >= 100 && pot2 <= 199) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 2:
      if ((val == 2) && pot2 >= 200 && pot2 <= 399) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 3:
      if ((val == 3) && pot2 >= 300 && pot2 <= 399) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 4:
      if ((val == 4) && pot2 >= 400 && pot2 <= 499) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 5:
      if ((val == 5) && pot2 >= 500 && pot2 <= 599) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 6:
      if ((val == 6) && pot2 >= 600 && pot2 <= 699) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 7:
      if ((val == 7) && pot2 >= 700 && pot2 <= 799) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 8:
      if ((val == 8) && pot2 >= 800 && pot2 <= 899) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 9:
      if ((val == 9) && pot2 >= 900) {
        return 1;
      }
      else {
        return 0;
      }
      break;
  }
}

int pot3_digact(int val) {
  pot3 = analogRead(A2);
  switch (val) {
    case 1:
      if ((val == 1) && pot3 >= 100 && pot3 <= 199) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 2:
      if ((val == 2) && pot3 >= 200 && pot3 <= 399) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 3:
      if ((val == 3) && pot3 >= 300 && pot3 <= 399) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 4:
      if ((val == 4) && pot3 >= 400 && pot3 <= 499) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 5:
      if ((val == 5) && pot3 >= 500 && pot3 <= 599) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 6:
      if ((val == 6) && pot3 >= 600 && pot3 <= 699) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 7:
      if ((val == 7) && pot3 >= 700 && pot3 <= 799) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 8:
      if ((val == 8) && pot3 >= 800 && pot3 <= 899) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 9:
      if ((val == 9) && pot3 >= 900) {
        return 1;
      }
      else {
        return 0;
      }
      break;
  }
}

int pot4_digact(int val) {
  pot4 = analogRead(A3);
  switch (val) {
    case 1:
      if ((val == 1) && pot4 >= 100 && pot4 <= 199) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 2:
      if ((val == 2) && pot4 >= 200 && pot4 <= 399) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 3:
      if ((val == 3) && pot4 >= 300 && pot4 <= 399) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 4:
      if ((val == 4) && pot4 >= 400 && pot4 <= 499) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 5:
      if ((val == 5) && pot4 >= 500 && pot4 <= 599) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 6:
      if ((val == 6) && pot4 >= 600 && pot4 <= 699) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 7:
      if ((val == 7) && pot4 >= 700 && pot4 <= 799) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 8:
      if ((val == 8) && pot4 >= 800 && pot4 <= 899) {
        return 1;
      }
      else {
        return 0;
      }
      break;
    case 9:
      if ((val == 9) && pot4 >= 900) {
        return 1;
      }
      else {
        return 0;
      }
      break;
  }
}

void accessGranted() {
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("   Access Granted   ");
  digitalWrite(D1_LED, LOW);
  digitalWrite(D3_LED, LOW);
  digitalWrite(D2_LED, LOW);
  digitalWrite(D4_LED, LOW);
  tone(buzzer, 2000);
  digitalWrite(D1_LED, HIGH);
  digitalWrite(D3_LED, HIGH);
  digitalWrite(D2_LED, HIGH);
  digitalWrite(D4_LED, HIGH);
  delay(100);
  digitalWrite(D1_LED, LOW);
  digitalWrite(D3_LED, LOW);
  digitalWrite(D2_LED, LOW);
  digitalWrite(D4_LED, LOW);
  noTone(buzzer);
  delay(100);
  digitalWrite(D1_LED, HIGH);
  digitalWrite(D3_LED, HIGH);
  digitalWrite(D2_LED, HIGH);
  digitalWrite(D4_LED, HIGH);
  tone(buzzer, 2000);
  delay(100);
  noTone(buzzer);
  delay(100);
}

void accessDenied() {
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("   Access Denied    ");
  tone(buzzer, 1000);
  delay(250);
  noTone(buzzer);
  delay(100);
  tone(buzzer, 1000);
  delay(250);
  noTone(buzzer);
  delay(100);
  tone(buzzer, 1000);
  delay(250);
  noTone(buzzer);
  delay(100);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("    Please reset    ");
  lcd.setCursor(0, 1);
  lcd.print("ALL FOUR knobs to 0");
  lcd.setCursor(0, 2);
  for (line = 0; line < 20; line++) {
    lcd.write(0);
    delay(1000);
  }
}



© digitrode.ru


Теги: Arduino, потенциометр, сейф




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий