Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Электронный замок на Arduino с клавиатурой и пользовательским кодом

Компоненты и материалы

КомпонентКоличествоПримечание
Arduino UNO1
Матричная клавиатура 4x41Можно 3x4 с изменениями в коде
Кнопка (для открытия изнутри)1С подтягивающим резистором
LCD I2C (16x2)1Адрес 0x27 (проверьте сканером)
Соленоидный замок (12V)1Вариант 1
МОП-транзистор IRF510N1Для управления соленоидом
Релейный модуль 1 канал1Вариант 2 (вместо соленоида)

Инструменты

О проекте

Классический проект электронного замка с клавиатурой, LCD-дисплеем и возможностью смены кода пользователем (код хранится в EEPROM). Два варианта исполнительного механизма: соленоид (через МОП-транзистор) или релейный модуль (универсальнее, может управлять любым замком до 250V AC). Кнопка внутри позволяет открыть дверь без кода.

Принцип работы соленоида

Соленоид 12V управляется через IRF510N (N-канал). При 5V на Gate транзистор открывается, замыкая цепь соленоида. Резистор на Gate не нужен. При низком уровне — транзистор закрыт.

Принцип работы реле

Реле управляется так же, но логика инвертирована: LOW — включено, HIGH — выключено (зависит от модуля). Реле позволяет коммутировать нагрузку до 250V AC.

Алгоритм (блок-схема)

Основные состояния: ожидание → ввод кода (*) → проверка → открытие / ошибка. Смена кода (#) → ввод старого кода → ввод нового кода дважды → сравнение → сохранение в EEPROM.

Важные нюансы кода

Тестирование

На фото показан процесс: ввод кода, смена кода, открытие кнопкой изнутри. Работает стабильно как с соленоидом, так и с реле.

Код для соленоида (Keypad_doorlock_solenoid.ino)

/* Работает с Keypad 4x4, LCD I2C, IRF510N, кнопкой
 * Открытие по коду или кнопке изнутри
 * Код меняется с клавиатуры, хранится в EEPROM
 */
#include <Keypad.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>

#define SOLENOID 11   // Gate транзистора
#define O_BUTTON 10   // Кнопка внутри
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6};
byte colPins[COLS] = {5,4,3,2};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

char code[] = {'6','6','0','1'};          // Код по умолчанию
char code_buff1[sizeof(code)];
char code_buff2[sizeof(code)];
short a=0, i=0, s=0, j=0;

void setup() {
  lcd.begin(16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home(); lcd.print("Standby");
  pinMode(SOLENOID, OUTPUT);
  pinMode(O_BUTTON, INPUT);
  // Первая загрузка: закомментируйте следующий блок, загрузите, раскомментируйте, загрузите снова
  // for(i=0; i<sizeof(code); i++) EEPROM.get(i, code[i]);
}

void loop() {
  char key = keypad.getKey();
  if (key == '*') {                 // Ввод кода
    lcd.clear(); lcd.setCursor(0,0); lcd.print("Enter code");
    getCode();
    if (a == sizeof(code)) openDoor();
    else { lcd.clear(); lcd.print("Wrong"); }
    delay(2000); lcd.clear(); lcd.print("Standby");
  }
  if (key == '#') {                 // Смена кода
    changeCode();
    lcd.clear(); lcd.print("Standby");
  }
  if (digitalRead(O_BUTTON) == HIGH) { // Кнопка внутри
    digitalWrite(SOLENOID, HIGH);
    delay(3000);
    digitalWrite(SOLENOID, LOW);
  }
}

void getCode() {
  i=0; a=0; j=0;
  while (key != 'A') {
    key = keypad.getKey();
    if (key != NO_KEY && key != 'A') {
      lcd.setCursor(j,1); lcd.print("*");
      j++;
      if (key == code[i] && i < sizeof(code)) { a++; i++; }
      else a--;
    }
  }
  key = NO_KEY;
}

void changeCode() {
  lcd.clear(); lcd.print("Changing code"); delay(1000);
  lcd.clear(); lcd.print("Enter old code");
  getCode();
  if (a == sizeof(code)) {
    lcd.clear(); lcd.print("Changing code");
    getNewCode1(); getNewCode2();
    s=0;
    for(i=0; i<sizeof(code); i++) if (code_buff1[i]==code_buff2[i]) s++;
    if (s == sizeof(code)) {
      for(i=0; i<sizeof(code); i++) { code[i]=code_buff2[i]; EEPROM.put(i, code[i]); }
      lcd.clear(); lcd.print("Code Changed"); delay(2000);
    } else { lcd.clear(); lcd.print("Codes not matching"); delay(2000); }
  } else { lcd.clear(); lcd.print("Wrong"); delay(2000); }
}

void getNewCode1() {
  i=0; j=0;
  lcd.clear(); lcd.print("Enter new code"); lcd.setCursor(0,1); lcd.print("and press A"); delay(2000);
  lcd.clear(); lcd.setCursor(0,1); lcd.print("and press A");
  while (key != 'A') {
    key = keypad.getKey();
    if (key != NO_KEY && key != 'A') {
      lcd.setCursor(j,0); lcd.print("*"); code_buff1[i]=key; i++; j++;
    }
  }
  key = NO_KEY;
}

void getNewCode2() {
  i=0; j=0;
  lcd.clear(); lcd.print("Confirm code"); lcd.setCursor(0,1); lcd.print("and press A"); delay(3000);
  lcd.clear(); lcd.setCursor(0,1); lcd.print("and press A");
  while (key != 'A') {
    key = keypad.getKey();
    if (key != NO_KEY && key != 'A') {
      lcd.setCursor(j,0); lcd.print("*"); code_buff2[i]=key; i++; j++;
    }
  }
  key = NO_KEY;
}

void openDoor() {
  lcd.clear(); lcd.print("Welcome");
  digitalWrite(SOLENOID, HIGH); delay(3000); digitalWrite(SOLENOID, LOW);
}

Код для реле (Keypad_doorlock_relay.ino)

Аналогичен предыдущему, отличие только в управлении реле (инвертированная логика):

#define RELAY 11
// ... в openDoor() и кнопке:
digitalWrite(RELAY, LOW); delay(3000); digitalWrite(RELAY, HIGH);
// при нажатии кнопки:
digitalWrite(RELAY, LOW); delay(3000); digitalWrite(RELAY, HIGH);

Схемы подключения

Две схемы: для соленоида (через IRF510N) и для реле. Обе включают клавиатуру, LCD I2C, кнопку, питание 12V для замка.

Производственный процесс

  1. Внутри банковских хранилищ: история, дизайн и будущее безопасности
  2. Создание умного автозамка двери с использованием Bluetooth-близости смартфона
  3. Многопозиционная система датчиков температуры для интеграции в умный дом
  4. MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
  5. Пожарная безопасность 3D-принтера: умная система обнаружения дыма
  6. Электронный кодовый замок на Arduino с клавиатурой и линейным приводом
  7. Веб-управляемый IoT-индикатор на Arduino, Yaler и IFTTT
  8. Магнитная левитация на отталкивании с Arduino: Простая схема и DIY-руководство
  9. Продвинутый дистанционно управляемый манипулятор-робот для точной работы
  10. CoroFence: термический детектор на GridEye + PIR с IoT