Электронный замок на карточке

shoitov
Offline
Зарегистрирован: 09.07.2014

Ребят, помогите! В программирование я не очень разбираюсь.

Делаю проэкт "Электронный замок на карточке" .

Задачи: 

-сканирывать карточку

-подовать звуковой сигнал

-подовать световой сигнал

-выводить информацию на lcd дисплей

-если карта правельная(зарегистрированная) , то поворачивать сервопривод на 170 градусов

// всё вышеперечисленное я сделал

Мне нужна помощь в следующим:

Мне нужно добавить к коду кнопку, при нажатие которой сервопривод возвращался бы в исходное положение(10 градусов).

Кто знает как это сделать, пожалуйста, пишите в комментариях.

Вот код:

#include <Servo.h> 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h> // это скачанная библиотека "RFID".
#define BUZZER_PIN 6
Servo dimkaservo;
LiquidCrystal_I2C lcd(0x27,16,2);
/*
подключение для Arduino Uno и Mega, производится к разным Pin!
 ----------------------------------------------------- Nicola Coppola
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                5                 RST
 * SPI SS     10               53                SDA
 * SPI MOSI   11               51                MOSI
 * SPI MISO   12               50                MISO
 * SPI SCK    13               52                SCK
 
 */

// два Pin (SS и RST) допускают произвольное подключение и конфигурируются в коде.
// !(SS - он же - SDA).
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // объект MFRC522C / reate MFRC522 instance.
unsigned long uidDec, uidDecTemp;  // для отображения номера карточки в десятичном формате


//*************************************************************
// Массив 4 Светодиодов, для визуального контроля.
//*************************************************************
int ledPins[] = {2,3,4,5,6};
int LedPinSindex; // индекс, для массива Светодиодов. 

void setup() {
  lcd.init();                     // инициализация LCD 
  lcd.backlight();                // включаем подсветку
  Serial.begin(9600);     // Initialize serial communications with the PC.
  Serial.println("Prilozhite kartu / Waiting for card...");
  lcd.print("Prilozhite kartu");
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Waiting for card"); 
  SPI.begin();  //  инициализация SPI / Init SPI bus.
  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.

  dimkaservo.attach(7); // servo подключён к 7 Pin.
  dimkaservo.write(10); // устанавливаем положение servo, в момент подачи питания.

  // весь массив светодиодов делаем OUTPUT. 
  for(LedPinSindex = 0; LedPinSindex <= 4; LedPinSindex++)
  {
    pinMode(ledPins[LedPinSindex],OUTPUT);
  }
}


void loop() {
  // Поиск новой карточки / Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Выбор карточки / Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;

  // Выдача серийного номера карточки "UID".
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec); 
 
  // ------------------------

  // начинаем сравнивать номер "UID", поднесённой к ридеру карты, 
  // с записанным номером "UID" карты в sketch.

  // замените!!! "UID" № "422455350", на номер "UID" № вашей карты.
  if (uidDec == 1683245007) // если "UID" номер совпал.
  {
     digitalWrite(ledPins[0], HIGH); 
     Serial.println("Hi, Ivan"); 
     lcd.clear();
     lcd.print("    Hi, Ivan");
     dimkaservo.write(170);
     tone(BUZZER_PIN, 3000, 1000); 
     delay(3000);
     lcd.clear();
     lcd.print("Prilozhite kartu");
     lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
     lcd.print("Waiting for card");  
     for(LedPinSindex = 0; LedPinSindex <= 4; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],LOW); 
     dimkaservo.write(10); // возвращаем servo обратно.
  }


  // также и с другими номерами карт.
  else if (uidDec == 324990116)
  {
    digitalWrite(ledPins[0], HIGH); 
     Serial.println("Hi, Natalia"); 
     lcd.clear();
     lcd.print("  Hi, Natalia");
     dimkaservo.write(170);
     tone(BUZZER_PIN, 3000, 1000); 
     delay(3000);
     lcd.clear();
     lcd.print("Prilozhite kartu");
     lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
     lcd.print("Waiting for card");  
     for(LedPinSindex = 0; LedPinSindex <= 4; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],LOW); 
     dimkaservo.write(10); // возвращаем servo обратно.
  }


  else if (uidDec == 695670870)
  {
    digitalWrite(ledPins[0], HIGH); 
     Serial.println("Hi, Aleksei"); 
     lcd.clear();
     lcd.print(" Hi, Aleksei");
     dimkaservo.write(170);
     tone(BUZZER_PIN, 3000, 1000); 
     delay(3000);
     lcd.clear();
     lcd.print("Prilozhite kartu"); 
     lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
     lcd.print("Waiting for card"); 
     for(LedPinSindex = 0; LedPinSindex <= 4; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],LOW);
     dimkaservo.write(10); // возвращаем servo обратно.   
  }
  
  
  else if (uidDec == 695680870)
  {
    digitalWrite(ledPins[0], HIGH); 
     Serial.println(" Hi, Nikolai"); 
     lcd.clear();
     lcd.print(" Hi, Nikolai");
     dimkaservo.write(170);
     tone(BUZZER_PIN, 3000, 1000); 
     delay(3000);
     lcd.clear();
     lcd.print("Prilozhite kartu");
     lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
     lcd.print("Waiting for card");  
     for(LedPinSindex = 0; LedPinSindex <= 4; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],LOW);
     dimkaservo.write(10); // возвращаем servo обратно.   
  }


  else  // если "UID" номер карты не совпал.
  {
    // включим все светодиоды.
    for(LedPinSindex = 1; LedPinSindex <= 1; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],HIGH);
    Serial.println("Neizvestnaj karta / Unknown card");
    lcd.clear();
    lcd.print("Net takoi karti");
    lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
    lcd.print("Unknown card"); 
    tone(BUZZER_PIN, 200, 1000);
    delay(3000);
    lcd.clear();
    lcd.print("Prilozhite kartu");
    lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
    lcd.print("Waiting for card");
    for(LedPinSindex = 0; LedPinSindex <= 4; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],LOW);   
  }
  
   

  Serial.println("=====================================");

  
}  

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

зачем столько одинаковых блоков? сделайте условие сложнее с операторами или

ну или сделайте массив с разрешенными номерами и сравнивайте значение карточки со значениями в массиве

можно добавить защищенную кнопку чтобы вносить новые карточки не перепрошивая мк

а кнопка для возврата зачем? пусть сам возвращается черзе определенное время

 

shoitov
Offline
Зарегистрирован: 09.07.2014

Смысл в том чтобы использовать  эту систему вместо обычеого замка на двери в доме на дачи.  И когда уезжаешь с дачи нажать на кнопку и дверь закроется. А когда ты на даче и ходишь из дома во двор туда-сюда, постоянно открывать даерь с карточкой не удобно.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а если так нечасто используется целесообразно ли использовать электронный замок? мало ли электричество пропадет, молния ударит (у меня так раз было, полулицы осталась без телеков и другой техники)

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Дверь надо снабдить концевиком(герконом с магнитом) -  чтобы знать когда она закрыта -  чтобы повернуть серву. А кнопку привязать к тригеру(програмному). В итоге дверь закроется по двум условиям - нажимали кнопку и дверь закрыта.

а проверку карт удобнее делать так:

          lcd.print("Card No: ");
          lcd.println(card);
          switch(card){
            case 2158602968:
            case 2158602967:
              tone(3,1500,60);
              lcd.println("Access Granted");
              openDoor();
              break;
            default:
              tone(3,700,100);
              lcd.println("Access Denided");            
          }

 

zugni
Offline
Зарегистрирован: 14.06.2015

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

дапутим чтоб войти в тубзик воспользуемся ключем от rc522 потом из нутри закрытся воспользоватся карточкой если можно напишите скетч спасибо

#include<Servo.h>
#include <SPI.h>
#include <MFRC522.h>
Servo servo;
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
 
void setup() {
 servo.attach(10);
 Serial.begin(9600); // Initialize serial communications with the PC
 SPI.begin();   // Init SPI bus
 mfrc522.PCD_Init(); // Init MFRC522 card
 Serial.println("Scan PICC to see UID and type...");
 
}
 
void loop() {
 
byte uidCard[4] = {0xD4, 0xA8, 0xB4, 0x99}; //этот код если карточка B3 94 B3 00,тот что уже написан это ключ 
 
 if ( ! mfrc522.PICC_IsNewCardPresent()) {
  return;
 }
 
 // Select one of the cards
 if ( ! mfrc522.PICC_ReadCardSerial()) {
  return;
 }
          
        for (byte i = 0; i < 4; i++) {
          if (uidCard[i] != mfrc522.uid.uidByte[i])
            return;           
        }
         
  Serial.println("OPEN");
  // digitalWrite(); 
  delay(5000);
// digitalWrite();
    Serial.println("CLOSED");   
  delay(5000);
//servo.write(0); //ставим вал под 0
 
//delay(2000); //ждем 2 секунды
 
//servo.write(180); //ставим вал под 180
 
//delay(2000); //ждем 2 секунды
 
}
zugni
Offline
Зарегистрирован: 14.06.2015

ах да на счет карточки ей же и открывать тубзик если вы все дела переделали)