ESP8266 WiFi RFID NFC RC522 PHP, HTML MySQL AJAX Bootstrap Arduino Ethernet ESP32 SigFox LoRa IoT Eagle

RFID система с онлайн-управлением - Попробуйте онлайн ЗДЕСЬ!!!


администратор:


  • Управляет веб-интерфейсом
  • Просмотр действий в режиме реального времени - прикрепление карты, включая ее адрес и время, когда она была прикреплена к результату проверки: VERIFIED / UNLIMITED.
  • В отчете предлагается 100 новых карточек, и он носит исключительно информативный характер.
  • В разделе «Добавить карту» администратор может подтвердить карту одним щелчком мыши - авторизовать ее, которая была прикреплена, но еще не была авторизована.
  • Если администратору известен адрес карты, которого еще нет в системе, он также может войти в систему вручную.
  • Помимо отображения последних 5 вложений, администратор видит все неавторизованные карты и авторизованные карты, которые были к ним прикреплены, включая даты и время авторизации.
  • На вкладке удаления карты вы можете авторизовать авторизованную карту - карта не будет включена в список неавторизованных карт, она будет назначена там автоматически после ее прикрепления.
  • В последней вкладке - Программа, администратор может просматривать схему считывателя RFID на плате разработки N82MCU NodeMCU, может просматривать и загружать исходный код, загруженный в данный момент в микроконтроллер.
  • Для лучшей переносимости программы NodeMCU также имеется ссылка на библиотеку считывателя RFID RC522, таблицу считывателей и NodeMCU.
  • Возможность войти в систему, отписаться от администратора, открыть дверь из Интернета в случае потери карты и т. д. доступна только в платной версии этого программного обеспечения.
  • пользователь:


  • Использует считыватели RFID, физически прикрепляя тег NFC, тег ключа, карту, браслет.
  • Если проверен подключенный чип, NodeMCU освободит дверь на 5 секунд.
  • Если пользователь не прошел проверку подлинности из-за непроверенного чипа или недоступности проверки сайта, блокировка не разблокируется - она не будет отозвана.
  • Пользователь не проинформирован о том, что он не проверил свой чип как таковой. Его попытка записывается в базу данных при условии, что NodeMCU подключается к сайту, где проверяется карта.
  • Пользователь также может использовать свою карточку банкомата, карточку ISIC или карточку сотрудника, чей физический адрес может прочитать читатель, для проверки необходимо соответствовать стандарту ISO / IEC 14443 А.
  • Принцип открытия замка:

    Технология проекта:

  • PHP - функциональность системы - проверка чипа
  • HTML - графические и функциональные элементы системы - кнопки, щелчки
  • AJAX - динамический вызов PHP-скриптов - данные в реальном времени о прикреплении чипа к считывателю RFID
  • C - Wiring - язык программирования для платы разработки NodeMCU с чипом ESP8266.
  • Бесплатная версия (проверка карты, никаких других функций безопасности):

    Аппаратное обеспечение для проекта:

    ;
  • NodeMCU v2/v3 Lolin
  • RFID RC522 (13.56MHz)
  • Электромагнитные реле - 5 вольт
  • Соленоид для блокировки - 12 вольт / 24 вольт - управляется через реле
  • Исходный код для NodeMCU 1.0 (v2/v3):


    ESP8266 (NodeMCU) - HTTP


    /*|-------------------------------------------------------------|*/
    /*|SKETCH PRE RFID SYSTEM S WEB ADMINISTRACIOU                  |*/
    /*|VYHOTOVIL: MARTIN CHLEBOVEC                                  |*/
    /*|FB: https://www.facebook.com/martin.s.chlebovec              |*/
    /*|EMAIL: martinius96@gmail.com                                 |*/
    /*|Doska: ESP8266 Generic / NodeMCU / WEmos D1 Mini + NXP RC522 |*/
    /*|CORE: 2.7.4 compatible                                       |*/
    /*|Testovacie web rozhranie: http://arduino.clanweb.eu/rfid/    |*/
    /*|-------------------------------------------------------------|*/
    
    //#define OTA //odkomentuj pre OTA UPDATE CEZ LAN cez espota.py
    #include <ESP8266WiFi.h>
    #include <SPI.h>
    #include <RFID.h>
    
    #ifdef OTA
    #include <ESP8266mDNS.h>
    #include <WiFiUdp.h>
    #include <ArduinoOTA.h>
    #endif
    
    const char * ssid = "WIFI_NAME";
    const char * password = "WIFI_PASSWORD";
    
    const char * host = "arduino.clanweb.eu";
    const int httpPort = 80; //http port
    const int rele = 16; //GPIO16 == D0
    #define SS_PIN 4
    #define RST_PIN 5
    RFID rfid(SS_PIN, RST_PIN);
    unsigned long kod;
    WiFiClient client;
    void setup() {
      Serial.begin(9600);
      SPI.begin();
      rfid.init();
      pinMode(rele, OUTPUT);
      digitalWrite(rele, HIGH); //hotfix
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    #ifdef OTA 
      // Port defaults to 8266
      // ArduinoOTA.setPort(8266);
    
      // Hostname defaults to esp8266-[ChipID]
      // ArduinoOTA.setHostname("myesp8266");
    
      // No authentication by default
      // ArduinoOTA.setPassword((const char *)"123");
    
      ArduinoOTA.onStart([]() {
        Serial.println("Start");
      });
      ArduinoOTA.onEnd([]() {
        Serial.println("\nEnd");
      });
      ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
        Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
      });
      ArduinoOTA.onError([](ota_error_t error) {
        Serial.printf("Error[%u]: ", error);
        if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
        else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
        else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
        else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
        else if (error == OTA_END_ERROR) Serial.println("End Failed");
      });
      ArduinoOTA.begin();
    #endif  
      Serial.println("");
      Serial.println("WiFi uspesne pripojene");
      Serial.println("IP adresa: ");
      Serial.println(WiFi.localIP());
      Serial.println("Ready");
    }
    
    void loop() {
      if (WiFi.status() != WL_CONNECTED) {
        WiFi.begin(ssid, password);
      }
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    #ifdef OTA 
      ArduinoOTA.handle();
    #endif 
      if (rfid.isCard()) {
        if (rfid.readCardSerial()) {
          Serial.println(" ");
          Serial.println("Card found");
          kod = 10000 * rfid.serNum[4] + 1000 * rfid.serNum[3] + 100 * rfid.serNum[2] + 10 * rfid.serNum[1] + rfid.serNum[0];
          client.stop();
          String kodik = String(kod);
          String data = "kod=" + kodik;
          String url = "/rfid/karta.php";
          if (client.connect(host, httpPort)) {
            client.println("POST " + url + " HTTP/1.0");
            client.println("Host: " + (String)host);
            client.println("User-Agent: ESP8266");
            client.println("Connection: close");
            client.println("Content-Type: application/x-www-form-urlencoded;");
            client.print("Content-Length: ");
            client.println(data.length());
            client.println();
            client.println(data);
            while (client.connected()) {
              String line = client.readStringUntil('\n');
              if (line == "\r") {
                break;
              }
            }
            String line = client.readStringUntil('\n');
            if (line.indexOf("OK") > 0) {
              Serial.println(F("VSTUP POVOLENY"));
              Serial.println(F("DVERE ODOMKNUTE"));
              digitalWrite(rele, LOW); //invertovane spinane rele active LOW
              delay(5500);              //cas otvorenia dveri
              digitalWrite(rele, HIGH); //zatvor zamok
              Serial.println(F("DVERE ZAMKNUTE"));
            } else if (line.indexOf("NO") > 0) {
              Serial.println(F("VSTUP ZAMIETNUTY"));
            } else {
              Serial.println(F("Prosim pockajte s dalsim overenim karty 5 sekund!"));
            }
          }
        }
      }
    
      rfid.halt();
    }
    
    

    ESP32 - HTTP


    /*|--------------------------------------------------------|*/
    /*|Project: RFID remote database access webapp             |*/
    /*|ESP32 (DevKit, Generic), Arduino Core with FreeRTOS     |*/
    /*|Autor: Martin Chlebovec (martinius96)                   |*/
    /*|E-mail: martinius96@gmail.com                           |*/
    /*|Test web interface: http://arduino.clanweb.eu/rfid/     |*/
    /*|Usage license: MIT                                      |*/
    /*|Revision: 31. March 2022                                |*/
    /*|Tested stable ESP32 core: 2.0.2                         |*/
    /*|657 kB flash usage, 37 kB RAM usage                     |*/
    /*|--------------------------------------------------------|*/
    
    #include <WiFi.h>
    #include <SPI.h>
    #include <MFRC522.h>
    
    unsigned long code;
    const int rele = 17; //RELAY PIN
    #define SS_PIN 21 //CHIP SELECT PIN
    #define RST_PIN 22 //RESET PIN
    
    const char * ssid = "MY_WIFI"; //WiFi hotspot name
    const char * password = "MY_WIFI_PASSWORD"; //WiFi hotspot password
    const char* host = "arduino.clanweb.eu"; //domain - host
    String url = "/rfid/karta.php"; //URL behind host domain --> target PHP file
    
    
    
    TaskHandle_t Task1; //ULTRASONIC MEASUREMENT
    TaskHandle_t Task2; //WIFI HTTP SOCKET
    QueueHandle_t  q = NULL;
    
    WiFiClient client; //socket client object
    MFRC522 rfid(SS_PIN, RST_PIN);
    static void Task1code( void * parameter);
    static void Task2code( void * parameter);
    void dump_byte_array(byte *buffer, byte bufferSize);
    
    void setup() {
      Serial.begin(115200);
      SPI.begin();
      rfid.PCD_Init(); // Init MFRC522
      rfid.PCD_SetAntennaGain(112); // set antenna gain to max (00001110)
      rfid.PCD_DumpVersionToSerial(); //Write version of Firmware to UART
      pinMode(rele, OUTPUT);
      digitalWrite(rele, HIGH); //hotfix
      WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
      }
      Serial.println(F(""));
      Serial.println(F("Wifi connected with IP:"));
      Serial.println(WiFi.localIP());
      q = xQueueCreate(20, sizeof(unsigned long));
      if (q != NULL) {
        Serial.println(F("Queue FIFO buffer is created"));
        vTaskDelay(1000 / portTICK_PERIOD_MS); //wait for a second
        xTaskCreatePinnedToCore(
          Task1code,   /* Task function. */
          "Task1",     /* name of task. */
          10000,       /* Stack size of task */
          NULL,        /* parameter of the task */
          1,           /* priority of the task */
          &Task1,      /* Task handle to keep track of created task */
          1);          /* pin task to core 1 */
        Serial.println(F("RFID handler task started"));
        xTaskCreatePinnedToCore(
          Task2code,   /* Task function. */
          "Task2",     /* name of task. */
          10000,       /* Stack size of task */
          NULL,        /* parameter of the task */
          1,           /* priority of the task */
          &Task2,      /* Task handle to keep track of created task */
          0);          /* pin task to core 0 */
        Serial.println(F("HTTP Socket task started"));
      } else {
        Serial.println(F("Queue creation failed"));
      }
    }
    
    void loop() {
      if (WiFi.status() != WL_CONNECTED) {
        WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
      }
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      yield();
    
    }
    
    static void Task1code( void * parameter) {
      unsigned long RFIDcode;
      if (q == NULL) {
        Serial.println(F("Queue in RFID handler task is not ready"));
        return;
      }
      while (1) {
        if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
          dump_byte_array(rfid.uid.uidByte, rfid.uid.size);
          rfid.PICC_HaltA();
          rfid.PCD_StopCrypto1();
          RFIDcode = code;
          xQueueSend(q, (void *)&RFIDcode, (TickType_t )0); //add RFID card UID to Queue
        }
      }
    }
    static void Task2code( void * parameter) {
      unsigned long RFIDcode;
      if (q == NULL) {
        Serial.println(F("Queue in HTTP socket task is not ready"));
        return;
      }
      while (1) {
        xQueueReceive(q, &RFIDcode, portMAX_DELAY); //read measurement value from Queue and run code below, if no value, WAIT until portMAX_DELAY
        String data = "kod=" + RFIDcode;
        client.stop();
        if (client.connect(host, 80)) {
          client.println("POST " + url + " HTTP/1.0");
          client.println("Host: " + (String)host);
          client.println("User-Agent: ESP32");
          client.println("Connection: close");
          client.println("Content-Type: application/x-www-form-urlencoded;");
          client.print("Content-Length: ");
          client.println(data.length());
          client.println();
          client.println(data);
          while (client.connected()) {
            String line = client.readStringUntil('\n');
            if (line == "\r") {
              break;
            }
          }
          String line = client.readStringUntil('\n');
          if (line.indexOf("OK") > 0) {
            Serial.println(F("ACCESS GAINED"));
            Serial.println(F("DOORS OPENED"));
            digitalWrite(rele, LOW); //inverted ACTIVE-LOW logic
            vTaskDelay(5500 / portTICK_PERIOD_MS); //duration of doors opened
            digitalWrite(rele, HIGH); //lock doors pack
            Serial.println(F("DOORS CLOSED"));
          } else if (line.indexOf("NO") > 0) {
            Serial.println(F("ACCESS REJECTED"));
          } else {
            Serial.println(F("WAIT 5 seconds before next attempt!"));
          }
        } else {
          Serial.println(F("Connection to webserver was not successful!"));
        }
        client.stop();
      }
    }
    
    void dump_byte_array(byte *buffer, byte bufferSize) {
      for (byte i = 0; i < bufferSize; i++) {
      }
      Serial.print(F("Detected UID (code) of RFID CARD: "));
      code = 10000 * buffer[4] + 1000 * buffer[3] + 100 * buffer[2] + 10 * buffer[1] + buffer[0]; //finalny kod karty
      //Serial.println(code);
    }
    
    

    помолвка:


    RC522 NodeMCU
    3.3V 3.3V
    RST D1 (GPIO5)
    GND GND
    MISO D6 (GPIO12)
    MOSI D7 (GPIO13)
    SCK D5 (GPIO14)
    SDA D2 (GPIO4)
    IRQ Не занимается

    реле NodeMCU
    5V VIN / VUSB (адаптер / USB-питание)
    GND GND
    IN D0 (GPIO16)

    реле соленоид
    NO IN
    COM Не занимается
    NC 12/24 DC/AC

    RFID - schematics - ESP8266

    RFID vrátnik - schéma zapojenia: ESP8266 (NodeMCU) s čítačkou RC522

    RFID - schematics - ESP32

    RFID vrátnik - schéma zapojenia: ESP32 (Devkit) s čítačkou RC522