Дверной замок Arduino
Привет, я новичок в этом мире arduino и программирования, у меня есть этот код для проекта, который хочет быть электрическим дверным замком с кодом доступа и идентификатором rif, но я хочу добавить, что перед тем, как он скажет мне "закрыта дверь", он должен заставить меня гудеть в течение секунды и показать мне сообщение в течение нескольких секунд, а после этого сообщение с надписью "Дверь закрыта! Появится надпись "Scan id". Кто-нибудь может мне помочь, пожалуйста? Спасибо!
// Include required libraries
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <SPI.h>
// Create instances
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(10, 9); // MFRC522 mfrc522(SS_PIN, RST_PIN)
// Initialize Pins for led's, servo and buzzer
// Blue LED is connected to 5V
const int RELAY_PIN = 8;
constexpr uint8_t greenLed = 7;
constexpr uint8_t redLed = 6;
constexpr uint8_t buzzerPin = 5;
char initial_password[4] = {'1', '2', '3', '4'}; // Variable to store initial password
String tagUID = "19 7F 30 C2";
// String to store UID of tag. Change it with your tag's UID
char password[4]; // Variable to store users password
boolean RFIDMode = true; // boolean to change modes
boolean buzzerFlag = true;
char key_pressed = 0; // Variable to store incoming keys
uint8_t i = 0; // Variable used for counter
// defining how many rows and columns our keypad have
const byte rows = 4;
const byte columns = 4;
// Keypad pin map
char hexaKeys[rows][columns] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Initializing pins for keypad
byte row_pins[rows] = {A0, A1, A2, A3};
byte column_pins[columns] = {2, 1, 0};
// Create instance for keypad
Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
void setup() {
// Arduino Pin configuration
pinMode(buzzerPin, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
lcd.begin(); // LCD screen
lcd.backlight();
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
lcd.clear(); // Clear LCD screen
}
void loop() {
// System will first look for mod
if (RFIDMode == true) {
lcd.setCursor(0, 0);
lcd.print("Door closed!");
lcd.setCursor(0, 1);
lcd.print("Scan ID");
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
//Reading from the card
String tag = "";
for (byte j = 0; j < mfrc522.uid.size; j++)
{
tag.concat(String(mfrc522.uid.uidByte[j] < 0x10 ? " 0" : " "));
tag.concat(String(mfrc522.uid.uidByte[j], HEX));
}
tag.toUpperCase();
//Checking the card
if (tag.substring(1) == tagUID)
{
// If UID of tag is matched.
lcd.clear();
lcd.print("ID correct!");
tone(buzzerPin, 1500);
delay(500);
noTone(buzzerPin);
digitalWrite(greenLed, HIGH);
delay(500);
digitalWrite(greenLed, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Insert");
lcd.setCursor(0, 1);
lcd.print("code: ");
RFIDMode = false; // Make RFID mode false
}
else
{
// If UID of tag is not matched.
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tag ID invalid!");
tone(buzzerPin, 1000);
delay(1000);
noTone(buzzerPin);
lcd.setCursor(0, 1);
lcd.print("Access Denide!");
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLed, HIGH);
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
}
}
// If RFID mode is false, it will look for keys from keypad
if (RFIDMode == false) {
key_pressed = keypad_key.getKey(); // Storing keys
if (key_pressed)
{
password[i++] = key_pressed; // Storing in password variable
lcd.print("*");
}
if (i == 4) // If 4 keys are completed
{
delay(200);
if (!(strncmp(password, initial_password, 4))) // If password is matched
{
lcd.clear();
lcd.print("Correct Code!");
tone(buzzerPin, 1500);
delay(500);
noTone(buzzerPin);
digitalWrite(RELAY_PIN, HIGH);
delay(500);
digitalWrite(greenLed, HIGH);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(RELAY_PIN, LOW);
delay(500);
lcd.clear();
i = 0;
RFIDMode = true; // Make RFID mode true
}
else // If password is not matched
{
lcd.clear();
lcd.print("Code Invalid!");
digitalWrite(buzzerPin, HIGH);
tone(buzzerPin, 1000);
delay(1000);
noTone(buzzerPin);
digitalWrite(redLed, HIGH);
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
i = 0;
RFIDMode = true; // Make RFID mode true
}
}
}
}
@Alex, 👍0
Обсуждение0
Смотрите также:
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
в коде это "Дверь закрыта", первое "если" в пустом цикле.., @Alex
поместите слой разделения между функцией чтения карты и функцией действия ... свайп карты должен устанавливать только флаг ... он не должен выполнять никаких других функций ... клавиатура может установить тот же флаг .... функция разблокировки должна реагировать только на флаг, больше ничего, @jsotola
Чувак, я новичок, я никогда ни в чем не программировал, я взял код из Интернета, чтобы разобраться в некоторых вещах, если ты можешь помочь мне с моим кодом, чтобы сделать то, что я хочу понять., @Alex
в вашем коде уже используется переменная флага "RFIDMode".... это может быть истина или ложь .... внутри "loop ()" считайте RFID-карту, как вы делаете сейчас, но не выполняйте никаких ЖК -, светодиодных, звуковых кодов ... установите только флаг, например
cardOK = true;
... проделайте то же самое с клавиатурой ... возможно, два флага "passCodeEntered" и "passCodeOK".... затем далее внутри "loop ()" проверьте флаги и действуйте соответственно, @jsotola