Untitled

 avatar
unknown
plain_text
a year ago
6.1 kB
7
Indexable
#include <SPI.h>
#include <Ethernet.h>
#include <Wiegand.h>
#include <rdm6300.h>3000202

#define RDM6300_RX_PIN 7  // Cambiato da 10 a 9 per evitare conflitti con lo shield Ethernet
#define PIN_D0 2
#define PIN_D1 3
#define RELE_PIN 5  // Pin del relè per aprire la porta principale
#define RELE_PIN2 4  // Pin del relè controllato da RDM6300
#define LED_PIN 6    // Pin del LED

Rdm6300 rdm6300;
Wiegand wiegand;

unsigned long doorOpenMillis = 0; // Timestamp per quando la porta viene aperta
unsigned long doorOpenDuration = 5000; // Durata dell'apertura della porta in millisecondi
bool doorIsOpen = false; // Stato della porta principale

unsigned long lastTagDetectedMillis = 0; // Timestamp dell'ultima rilevazione del tag
unsigned long tagPresentTimeout = 10000; // Tempo dopo cui il relè e il LED si disattivano quando il tag viene rimosso

// Configurazione Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC Address
IPAddress ip(192, 168, 1, 177); // Indirizzo IP statico
EthernetServer server(80); // Porta del server

void setup() {
  Serial.begin(9600);
  pinMode(RELE_PIN, OUTPUT);
  digitalWrite(RELE_PIN, HIGH);  // Assicurati che il relè sia inizialmente disattivato
  pinMode(RELE_PIN2, OUTPUT);
  digitalWrite(RELE_PIN2, HIGH); // Assicurati che il relè sia inizialmente disattivato
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);    // Assicurati che il LED sia inizialmente spento

  rdm6300.begin(RDM6300_RX_PIN);
  wiegand.onReceive(receivedData, "Card read: ");
  wiegand.onReceiveError(receivedDataError, "Card read error: ");
  wiegand.onStateChange(stateChanged, "State changed: ");
  wiegand.begin(Wiegand::LENGTH_ANY, true);

  pinMode(PIN_D0, INPUT);
  pinMode(PIN_D1, INPUT);
  attachInterrupt(digitalPinToInterrupt(PIN_D0), pinStateChanged, CHANGE);
  attachInterrupt(digitalPinToInterrupt(PIN_D1), pinStateChanged, CHANGE);

  // Avvia Ethernet
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("Server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  unsigned long currentMillis = millis();
  
  // Gestione RFID RDM6300
  if (rdm6300.get_tag_id()) { // Controlla se c'è un tag vicino
    digitalWrite(RELE_PIN2, LOW); // Attiva il relè se un tag è rilevato
    digitalWrite(LED_PIN, HIGH);  // Accende il LED
    lastTagDetectedMillis = currentMillis; // Aggiorna il timestamp dell'ultima rilevazione
  } else if (currentMillis - lastTagDetectedMillis > tagPresentTimeout) {
    digitalWrite(RELE_PIN2, HIGH); // Disattiva il relè se il tag non è rilevato da 10 secondi
    digitalWrite(LED_PIN, LOW);   // Spegne il LED
  }

  // Controllo della porta principale per disattivare il relè dopo 5 secondi
  if (doorIsOpen && currentMillis - doorOpenMillis > doorOpenDuration) {
    digitalWrite(RELE_PIN, HIGH);
    doorIsOpen = false; // Imposta lo stato della porta come chiusa
    Serial.println("Door closed");
  }

  // Gestione Wiegand
  noInterrupts();
  wiegand.flush();
  interrupts();

  // Gestione delle richieste Ethernet
  EthernetClient client = server.available();
  if (client) {
    Serial.println("New client");
    boolean currentLineIsBlank = true;
    String request = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        request += c;
        if (c == '\n' && currentLineIsBlank) {
          if (request.indexOf("GET /open") >= 0) {
            openDoor(); // Apri la porta se ricevi una richiesta a /open
          }
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<h1>Arduino Ethernet Server</h1>");
          client.println("<p>Door is ");
          client.println(doorIsOpen ? "open" : "closed");
          client.println("</p>");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
    Serial.println("Client disconnected");
  }
}

void pinStateChanged() {
  wiegand.setPin0State(digitalRead(PIN_D0));
  wiegand.setPin1State(digitalRead(PIN_D1));
}

void stateChanged(bool plugged, const char* message) {
  Serial.print(message);
  Serial.println(plugged ? "CONNECTED" : "DISCONNECTED");
}

void receivedData(uint8_t* data, uint8_t bits, const char* message) {
  Serial.print(message);
  Serial.print(bits);
  Serial.print(" bits / ");
  uint8_t bytes = (bits+7)/8;

  // Codice badge esadecimale atteso
  uint8_t expectedCode[3] = {0xD5, 0x1E, 0x2C}; 
  
  bool isAuthorized = (bytes == 3);
  for (int i = 0; i < bytes && isAuthorized; i++) {
    Serial.print(data[i] >> 4, 16);
    Serial.print(data[i] & 0xF, 16);
    if (data[i] != expectedCode[i]) {
      isAuthorized = false;
    }
  }
  Serial.println();

  if (isAuthorized) {
    openDoor();
    Serial.println("Access granted: Door opened");
  } else {
    digitalWrite(RELE_PIN, HIGH);
    Serial.println("Access denied");
  }
}

void receivedDataError(Wiegand::DataError error, uint8_t* rawData, uint8_t rawBits, const char* message) {
  Serial.print(message);
  Serial.print(Wiegand::DataErrorStr(error));
  Serial.print(" - Raw data: ");
  Serial.print(rawBits);
  Serial.print(" bits / ");
  uint8_t bytes = (rawBits+7)/8;
  for (int i=0; i<bytes; i++) {
    Serial.print(rawData[i] >> 4, 16);
    Serial.print(rawData[i] & 0xF, 16);
  }
  Serial.println();
}

void openDoor() {
  digitalWrite(RELE_PIN, LOW);
  doorOpenMillis = millis(); // Imposta il timestamp per l'apertura della porta
  doorIsOpen = true; // Imposta lo stato della porta come aperta
  Serial.println("Door opened");
}
Editor is loading...
Leave a Comment