RFID Zugangskontrolle Nodemcu Lua ESP8266 ESP-12E

Moin Miteinander

Ich bin gerade dabei ein RFID Zugangskontrolle zu Programmieren.
Der bereich mit RFID Karte auslesen und die Daten an den Server Schicken
sowie die Prüfung klappt so weit.

Mein Problem aktuell ist
ich möchte noch 2 Taster bzw Input Signal in das Programm einbinden.
Nach langen probieren hab ich raus gefunden das der void loop teil
nur aktiv bzw aktiviert wird wenn eine karte ausgelesen wird.

Aber warum ist das so ? bzw wie kann ich das ändern
hab schon das Internet durchsucht ob jemand das gleiche Problem hat wie ich.

Würde mich sehr freuen wenn mir jemand bei meinen Problem helfen kann

MfG
Stefan

//// ESP
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <string.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#define USE_SERIAL Serial
ESP8266WiFiMulti WiFiMulti;
////ESP



// NFC module

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

#define PN532_SCK   D1
#define PN532_MOSI  D2
#define PN532_MISO  D3
#define PN532_SS    D0
Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

#define PN532_IRQ   (2)
#define PN532_RESET (3)  // Not connected by default on the NFC Shield
extern uint8_t BigFont[];

String ID = "";

// NFC module ENDE

String id = "046F6952B25681";
#define Button D6 //GPIO2
int buttonState = 0 ;

void setup() {

//gpio.mode(ledPin,gpio.OUTPUT)

pinMode(D5, OUTPUT);
pinMode(Button, INPUT) ; 

    USE_SERIAL.begin(115200);
   // USE_SERIAL.setDebugOutput(true);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    WiFiMulti.addAP("WH3", "**********");


////// NFC 
  Serial.println("Hello!");
  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }

  // Got ok data, print it out!
  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
  // Set the max number of retry attempts to read from a card
  // This prevents us from waiting forever for a card, which is
  // the default behaviour of the PN532.
  nfc.setPassiveActivationRetries(0xFF);

  // configure board to read RFID tags
  nfc.SAMConfig();

  Serial.print("Waiting for an ISO14443A card");
 
}

///////  NFC ENDE
void loop() {
delay(1000);
USE_SERIAL.print("TEst");

    buttonState = digitalRead (buttonState) ; 

  if ( buttonState == HIGH ) {                                                                           

    Serial.println("TAster");

    
        HTTPClient http;
        USE_SERIAL.print("[HTTP] begin--tesr\n");

      
           http.begin("http://192.168.178.63/alm.php"); //HTTP
        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

    
    
    }


  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                // Length of the UID (4 or 7 bytes depending on ISO14443A card type)

  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);

  if (success) {
    Serial.println("Found a card!");
    Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("UID Value: ");
    ID = "";
    
    for (uint8_t i=0; i < uidLength; i++) 
    {

      char tmp[3];
      sprintf(tmp,"%02X",uid[i]);
      ID += tmp;
      //ID = ID + String(uid[i],HEX);
     // Serial.print(":");Serial.print(uid[i], HEX); 
    }
    
       Serial.print(ID);




    // wait for WiFi connection
    if((WiFiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;
        USE_SERIAL.print("[HTTP] begin...\n");
        
        http.begin("http://xxx.xxxxx.de/id.php?ID="+(ID)); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();


            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
                
        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
                if (payload.indexOf("true") == (payload.length() - 4) ){
                  USE_SERIAL.println("tür auf");
                  
                 digitalWrite(D5, 1);
                    delay(1000);                       // wait for a second
                digitalWrite(D5, 0);

                 }else {
                  USE_SERIAL.println("nop");
                  }
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }

    Serial.println("");
    // Wait 1 second before continuing
    delay(1000);
  }
  
  else
  {
    // PN532 probably timed out waiting for a card
    //Serial.println("Timed out waiting for a card");
  }

}

imaster16:
Nach langen probieren hab ich raus gefunden das der void loop teil
nur aktiv bzw aktiviert wird wenn eine karte ausgelesen wird.

Aber warum ist das so ?

Weil das so programmiert wurde :slight_smile:
Wenn weder die Taste (Button) gedrückt ist (bzw. HIGH ist), noch eine Karte gefunden wurde, dann passiert nicht viel was "sichtbar" wäre. Loop läuft zwar ständig - naja eigentlich nur ein mal pro Sekunde, du hast mit delay(1000) eine ziemliche Bremse eingebaut - und es wird einmal pro Sekunde "TEst" ausgegeben.

void loop() {
  delay(1000);
  USE_SERIAL.print("TEst");
  ...

Fast alles andere ist davon abhängig, dass der Taster gedrück ist oder eine Karte gefunden wurde.
Falls eine Karte gefunden wurde, dann wird success true und nur dann wird das ausgeführt, was in dieser if-Abfrage steht

if (success) {
...

das ist eine ganze Menge :slight_smile:

Was willst du denn das passiert während keine Karte erkannt wird?

Wie hast du denn den Taster (Button) angeschlossen? Du fragst auf "HIGH" ab. Gibt es Pulldown-Widerstände?

Ich glaube ja nicht, dass diese delays gute Ideen sind. Das verzögert ja auch das Auslesen der RFID-Karte ziemlich.

Danke für die Schnelle Antwort

Das mit dem

delay(1000);
USE_SERIAL.print("TEst");

Das war eigentlich nur ein Test ob die schleife dauernd läuft

Das ist ja das Problem normalerweise müsste ich jetzt jede Sekunde "TEst" im Seriellen Monitor sehen.
aber das ist leider nicht so, nur wenn eine Karte erkannt und ausgelesen wird läuft vooid loop 1 mal durch.

Was willst du denn das passiert während keine Karte erkannt wird?

Wie hast du denn den Taster (Button) angeschlossen? Du fragst auf "HIGH" ab. Gibt es Pulldown-Widerstände?

1: Es sollen eigentlich nur 2 input Signal überwacht werden

2: Einmal ein Klingel Taster und ein Tür Kontakt beides im Test mit einen Taster simuliert

imaster16:
Das ist ja das Problem normalerweise müsste ich jetzt jede Sekunde "TEst" im Seriellen Monitor sehen.
aber das ist leider nicht so, nur wenn eine Karte erkannt und ausgelesen wird läuft vooid loop 1 mal durch.

Das ist aber eigenartig. Und alle anderen seriellen Ausgaben siehst du? Also vor allem die in Setup, wie zum Beispiel (das steht ganz am Schluss von Setup - müsste also kurz vor TEst zu sehen sein):

Waiting for an ISO14443A card

Ich würde mal alle delays weglassen und schauen was passiert.

Genau so ist es ich sehe sonst alle Ausgaben

es steht eigentlich sehr deutlich im Beispiel:

// Wait for an ISO14443A type cards (Mifare, etc.). When one is found
// 'uid' will be populated with the UID, and uidLength will indicate
// if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)

jo darauf wartet nun dein Kartenleser.

ändern kann man das wieder weiter oben:

// Set the max number of retry attempts to read from a card
// This prevents us from waiting forever for a card, which is
// the default behaviour of the PN532.

wenn du die darauf folgende Zeile z.B. änderst auf:
nfc.setPassiveActivationRetries(0x02); // 2 tries

wirst du sehen, dass der Kartenleser nach zwei Versuchen auch mit Success=0 aufhört und deine Loop läuft weiter. Denn der Standard-Wert 0xFF ist eben, "Warten auf Karte". Jedenfalls läuft dein Sketch bei mir jetzt durch.

und tu dir einen gefallen: Drücke einmal STRG-T in deiner IDE damit du die Einrückungen sauber machst. So ist dein Code grauslich zu lesen.

P.S.: dass es fertige Projekte "Kartenzutritte" gibt hast eh schon gegoogelt? Ich will dich nur warnen - denn ich hab auch Wochen mit meinem verbracht bis ich sah dass es einige Beispiele gibt ...