Stránka 1 z 2

Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 16:51
od Kony
Ahoj, chtel bych umistnit a obsluhovat magneticky zamek u vchodovych dveri do bytovky

Chtel bych udelat nejaky mezikus, ktery zapojim pred zamek a mohl bych pomoci RFID odemykat dvere...

Ale ted otazky :
- jak udelat aby bylo nejaky ovladaci tlacitko, kterym bych mohl pridavat dalsi chipy
- kam by se ukladali cisla klicu ? Do EEPROM ?
- rad bych aby tam byla i ciselna klavesnice, kde by byl universalni kod(ktery by se dal zmenit)
- samozrejme bez moznosti pripojeni k PC. Jen pomoci klavesnice a displeye
- samozrejmost je i moznost otevirani dveri jak je do ted pomoci domovniho vratneho, ktery je nyni funkcni z bytu

Mate nekdo nejaky odkaz na neco podobneho ?

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 17:41
od Kony
Nasel jsem toto, to je asi presne co bych potreboval...
Jen nemuzu najit dokumentaci ..... navrh zapojeni a samotny kod

http://www.sselek-havirov.cz/erasmus_v_ ... ock_PL.pdf

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 18:22
od Kony
Jen doplnim ze pocitam s cca 100-120 RFID klici

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 18:58
od Kony
tak cely projekt jsem jiz nasel.....
jakmile budu mit neco hotoveho, tak poslu nejake info

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 19:19
od Kony
Nasel jsem tento kod :

Kód: Vybrat vše

//Viral Science www.youtube.com/c/viralscience  www.viralsciencecreativity.com
//RFID RC522 Master Card, Add and Remove multiple Cards 

#include <SPI.h>
#include <Wire.h>
#include <MFRC522.h>

#define RST_PIN 9
#define SS_PIN  10

#define STATE_STARTUP       0
#define STATE_STARTING      1
#define STATE_WAITING       2
#define STATE_SCAN_INVALID  3
#define STATE_SCAN_VALID    4
#define STATE_SCAN_MASTER   5
#define STATE_ADDED_CARD    6
#define STATE_REMOVED_CARD  7

#define REDPIN 7
#define GREENPIN 6
#define Relay 5

const int cardArrSize = 10;
const int cardSize    = 4;
byte cardArr[cardArrSize][cardSize];
byte masterCard[cardSize] = {131,35,56,187};   //Change Master Card ID
byte readCard[cardSize];
byte cardsStored = 0;

// Create MFRC522 instance
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Set the LCD I2C address

byte currentState = STATE_STARTUP;
unsigned long LastStateChangeTime;
unsigned long StateWaitTime;

//------------------------------------------------------------------------------------
int readCardState()
{
  int index;

  Serial.print("Card Data - ");
  for(index = 0; index < 4; index++)
  {
    readCard[index] = mfrc522.uid.uidByte[index];

    
    Serial.print(readCard[index]);
    if (index < 3)
    {
      Serial.print(",");
    }
  }
  Serial.println(" ");

  //Check Master Card
  if ((memcmp(readCard, masterCard, 4)) == 0)
  {
    return STATE_SCAN_MASTER;
  }

  if (cardsStored == 0)
  {
    return STATE_SCAN_INVALID;
  }

  for(index = 0; index < cardsStored; index++)
  {
    if ((memcmp(readCard, cardArr[index], 4)) == 0)
    {
      return STATE_SCAN_VALID;
    }
  }

 return STATE_SCAN_INVALID;
}

//------------------------------------------------------------------------------------
void addReadCard()
{
  int cardIndex;
  int index;

  if (cardsStored <= 20)
  {
    cardsStored++;
    cardIndex = cardsStored;
    cardIndex--;
  }

  for(index = 0; index < 4; index++)
  {
    cardArr[cardIndex][index] = readCard[index];
  }
}

//------------------------------------------------------------------------------------
void removeReadCard() 
{     
  int cardIndex;
  int index;
  boolean found = false;
  
  for(cardIndex = 0; cardIndex < cardsStored; cardIndex++)
  {
    if (found == true)
    {
      for(index = 0; index < 4; index++)
      {
        cardArr[cardIndex-1][index] = cardArr[cardIndex][index];
        cardArr[cardIndex][index] = 0;
      }
    }
    
    if ((memcmp(readCard, cardArr[cardIndex], 4)) == 0)
    {
      found = true;
    }
  }

  if (found == true)
  {
    cardsStored--;
  }
}

//------------------------------------------------------------------------------------
void updateState(byte aState)
{
  if (aState == currentState)
  {
    return;
  }

  // do state change
  switch (aState)
  {
    case STATE_STARTING:
      StateWaitTime = 1000;
      digitalWrite(REDPIN, HIGH);
      digitalWrite(GREENPIN, LOW);
      break;
    case STATE_WAITING:
      StateWaitTime = 0;
      digitalWrite(REDPIN, LOW);
      digitalWrite(GREENPIN, LOW);
      break;
    case STATE_SCAN_INVALID:
      if (currentState == STATE_SCAN_MASTER)
      {
        addReadCard();
        aState = STATE_ADDED_CARD;
        StateWaitTime = 2000;
        digitalWrite(REDPIN, LOW);
        digitalWrite(GREENPIN, HIGH);
      }
      else if (currentState == STATE_REMOVED_CARD)
      {
        return;
      }
      else
      {
        StateWaitTime = 2000;
        digitalWrite(REDPIN, HIGH);
        digitalWrite(GREENPIN, LOW);
      }
      break;
    case STATE_SCAN_VALID:
      if (currentState == STATE_SCAN_MASTER)
      {
        removeReadCard();
        aState = STATE_REMOVED_CARD;
        StateWaitTime = 2000;
        digitalWrite(REDPIN, LOW);
        digitalWrite(GREENPIN, HIGH);
      }
      else if (currentState == STATE_ADDED_CARD)
      {
        return;
      }
      else
      {
        StateWaitTime = 2000;
        digitalWrite(REDPIN, LOW);
        digitalWrite(GREENPIN, HIGH);
        digitalWrite(Relay,LOW);
        delay(3000);
        digitalWrite(Relay,HIGH);
      }
      break;
    case STATE_SCAN_MASTER:
      StateWaitTime = 5000;
      digitalWrite(REDPIN, LOW);
      digitalWrite(GREENPIN, HIGH);
      break;
  }

  currentState = aState;
  LastStateChangeTime = millis();
}

void setup() 
{
  SPI.begin();         // Init SPI Bus
  mfrc522.PCD_Init();  // Init MFRC522

  LastStateChangeTime = millis();
  updateState(STATE_STARTING);

  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay,HIGH);

  Serial.begin(9600);
}

void loop() 
{
  byte cardState;

  if ((currentState != STATE_WAITING) &&
      (StateWaitTime > 0) &&
      (LastStateChangeTime + StateWaitTime < millis()))
  {
    updateState(STATE_WAITING);
  }

  // Look for new cards 
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  { 
    return; 
  } 
  
  // Select one of the cards 
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  { 
    return; 
  }

  cardState = readCardState();
  updateState(cardState);
}
ale nejak nechapu kam se ukladaji ID tech karet....

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 20:24
od peterple
To je ľahké. No predsa do poľa cardArr

Kód: Vybrat vše

byte cardArr[cardArrSize][cardSize];
Pole je dvojrozmerné. Jedna karta zaberá 4 byte a kariet môže byť 10.

Kód: Vybrat vše

const int cardArrSize = 10;
const int cardSize    = 4;
Pole je definované ako globálne, takže sa nachádza v SRAM. (Vypneš a je to v dyme)

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 20:35
od Kony
a to je pruser...
a to potrebuji aby to bylo na porad :)

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 20:38
od peterple
tak si to daj do EEPROM a máš to nastálo

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 20:42
od Kony
jenze to ale prece musim urcit bunku a pak ta bunku je dle tohoto plovouci.... takze uplne mimo me chapani v arduino

Re: Zapojeni arduina do magnetickeho zamku dveri

Napsal: 21 říj 2021, 20:48
od peterple
vôbec nerozumiem ako to myslíš.
Prešiel si si príklady s EEPROM dostupné v samotnom prostedí?