Arduino Projekt Fahrbarer Roboter mit FRID

Hallo,
für ein Projekt soll ich einen "Fahrbaren Roboter mit RFID" bauen. Da es das erste mal ist, dass ich etwas mit einem Arduino mache, bleibe ich öfters wahrscheinlich an eigentlich offensichtlichen Sachen hängen.
Am Ende des Projekts, soll man den Arduino per Bluetooth über das Handy steuern können und es soll eine Wegfahrsperre mittels RFID geben. Zudem soll das RFID als Nutzerspeicherung (Fahrzeit)verwendet werden und die Nutzerzeit soll dann an einem LC Display angezeigt werden. Alles bis auf das LC Display habe ich bereits zusammengebaut und es funktioniert auch halbwegs.

So kann ich Ihn bereits per Bluetooth steuern und sperren/entsperren per RFID. Mein Problem ist allerdings, dass es nicht zusammen funktioniert. Soll heißen ich kann Ihn zwar per RFID entsperren, aber er lässt sich dann nicht steuern (zeigt auch gar nicht mehr an, das etwas empfangen wird). Lasse ich hingegen alles weg, was mit dem RFID zu tun hat, funktioniert die Steuerung per Bluetooth wieder.

Außerdem habe ich versucht es so zu machen, das man Ihn mit der selben RFID Karte sperren und entsperren kann. Problem dabei ist allerdings, dass ich es nur so hinbekommen habe, das man den Chip kurz drauf hält, dann entsperrt er sich, hält man diesen zu lange darauf sperrt er sich wieder. Dafür würde ich auch eine elegantere Lösung suchen, bisher habe ich allerdings noch nichts gefunden.

Habe hier mal meinen Code, den ich bisher habe. Ich habe versucht möglichst alles zu kommentieren, vielleicht fällt euch ja daran schon auf, ob ich vielleicht etwas falsch verstanden habe. Ich habe zudem dazu geschrieben, wie ich alles aktuell mit dem Arduino verkabelt habe.

/*H-Bruecke (L298N):               Bluetooth Modul (HC-06):               RFID (RC522):              KontrollLED:
    ENA     6                       VCC     5V                             SDA     10                 +     8                          
    IN1     4                       GND     GND                            SCK     13                 -     GND
    IN2     3                       TXD     RX(0)                          MOSI    11
    IN3     2                       RXD     TX(1)                          MISO    12
    IN4     7                                                              IRQ     nicht verbunden
    ENB     5                                                              GND     GND
                                                                           RST     9
    OUT1/1  Motor links                                                    3,3V    3,3V
    Out3/4  Motor rechts
    12V     + Batterie
    GND     - Batterie
 */

 /*Chipnummer   = 2534620
   Kartennummer = 89130
 */

 
#include <SoftwareSerial.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);


int MLV=3;  //Motorlinksvorwaerts
int MLR=4;  //Motorlinksrueckwaerts
int MLG=6;  //Motorlinksgeschwindigkeit
int MRV=2;  //Motorrechtsvorwaerts
int MRR=7;  //Motorrechtsrueckwaerts
int MRG=5;  //Motorrechtsgeschwindigkeit

int state = 0;
int led = 8;
int gesperrt=1;
unsigned long Startzeit=0;
unsigned long Gesamtzeit=0;

void setup() {
  Serial.begin(9600);
  SPI.begin(); 
  mfrc522.PCD_Init();
  pinMode(led, OUTPUT);
  pinMode(MLV, OUTPUT);
  pinMode(MLR, OUTPUT);
  pinMode(MLG, OUTPUT);
  pinMode(MRV, OUTPUT);
  pinMode(MRR, OUTPUT);
  pinMode(MRG, OUTPUT);

  Serial.begin(9600);  // Verbindung zum Bluetoothmodul

}

void loop() {

  if ( ! mfrc522.PICC_IsNewCardPresent()) //nach neuer Karte wird gesucht
  {
    return;
  }

  if ( ! mfrc522.PICC_ReadCardSerial()) //Kartennumer wird gelesen
  {
    return;
  }

  long code=0;

  for (byte i = 0; i < mfrc522.uid.size; i++)
   {
    code=((code+mfrc522.uid.uidByte[i])*10);  //Nummer wird auf variable code gespeichert   
   }

  Serial.print("Die Kartennummer lautet:"); //Ausgabe des Texts im Seriellen Monitor

  Serial.println(code); //Ausgabe der Nummer im Seriellen Monitor

  if(code==2534620) //genehmigte Karte entsperrt Arduino
   {
    gesperrt++;   //dadurch laesst er sich mit der selben Karte wieder sperren, falls er bereits entsperrt ist
    delay(500);
   }

  if(code!=2534620) //bei jeder anderen Karte wird er wieder gesperrt
   {
    gesperrt=1;
   }

   
   if (gesperrt%2==0) //wenn die Karte genehmigt ist und der Arduino gesperrt war, ist der Wert gerade und er laesst sich dann an dieser Stelle steuern

    {
      Startzeit=millis(); //merkt sich Startzeit, damit man später die Fahrzeit anzeigen lassen kann
      digitalWrite(led, HIGH);  //zeigt an das entsperrt wurde
      
      if(Serial.available() > 0)
      {
        state = Serial.read();  //Wert wird auf Variable state gespeichert
        Serial.println((char)state);  //Wert wird im seriellen Monitor ausgegeben
      }


      switch(state)
      {

       //Arduino faehrt vorwaerts
       case '1':     
         digitalWrite(MLV, HIGH);
         digitalWrite(MRV, HIGH);
         digitalWrite(MLR, LOW); 
         digitalWrite(MRR, LOW);
         analogWrite(MLG, 255);
         analogWrite(MRG, 255);
         delay(100);
         break;

       //Arduino faehrt rueckwaerts
       case '2':
         digitalWrite(MLV, LOW);
         digitalWrite(MRV, LOW);
         digitalWrite(MLR, HIGH); 
         digitalWrite(MRR, HIGH);
         analogWrite(MLG, 255);
         analogWrite(MRG, 255);
         delay(100);
         break;
 
       //Arduino faehrt nach links
       case '3':
         digitalWrite(MLV, HIGH);
         digitalWrite(MRV, LOW);
         digitalWrite(MLR, LOW); 
         digitalWrite(MRR, HIGH);
         analogWrite(MLG, 255);
         analogWrite(MRG, 255);
         delay(100);
         break;

      //Arduino faehrt nach rechts
      case '4':
        digitalWrite(MLV, LOW);
        digitalWrite(MRV, HIGH);
        digitalWrite(MLR, HIGH); 
        digitalWrite(MRR, LOW);
        analogWrite(MLG, 255);
        analogWrite(MRG, 255);
        delay(100);
        break;

      default:
        digitalWrite(MLV, LOW);
        digitalWrite(MRV, LOW);
        digitalWrite(MLR, LOW); 
        digitalWrite(MRR, LOW);
        analogWrite(MLG, 0);
        analogWrite(MRG, 0);
        delay(100);
        break;
      }
     
    }

   //Karte wird im entsperrten Zustand erkannt, sperrt die Steuerung wieder
   else
    {
      digitalWrite(led,LOW);
    
      digitalWrite(MLV, LOW);
      digitalWrite(MRV, LOW);
      digitalWrite(MLR, LOW); 
      digitalWrite(MRR, LOW);
      analogWrite(MLG, 0);
      analogWrite(MRG, 0);
      
      Gesamtzeit+=millis()-Startzeit;
      
      Serial.print("Fahrzeit: ");
      Serial.print(Gesamtzeit/3600000);  //Stunden
      Serial.print(":");
      Serial.print((Gesamtzeit%3600000)/60000);  //Minuten
      Serial.print(":");
      Serial.print(((Gesamtzeit%3600000)%60000)/1000);  //Sekunden
      Serial.print(":");
      Serial.println(((Gesamtzeit%3600000)%60000)%1000);  //Milliekunden
      Serial.println("");
  }

}

Das ganze mit der Nutzerzeit speichern, habe ich versucht umzusetzen, dabei ist allerdings das Problem, das er ja die Fahrzeit jedesmal addiert, wenn etwa die falsche Karte an den RFID Reader gehalten wird. Er dürfte die Zeit also jedes mal nur einmal addieren und zwar nur dann wenn der Arduino gesperrt wird und sonst nicht. Leider weiß ich auch dabei nicht, wie ich das am besten mache.

Hoffe Ihr könnt mir bei meinen Problemen helfen.Ich bin auf jeden Fall für jede Hilfe dankbar. Falls euch irgendwie sonst auffällt was man besser machen könnte, wäre ich auch dafür dankbar.

Schon mal im Voraus Danke
Fantoka

Fantoka:
... Falls euch irgendwie sonst auffällt was man besser machen könnte, wäre ich auch dafür dankbar.

Ich habe Deinen Sketch nur ganz kurz quergelesen. Zunächst ist schön, dass Du den Code ziemlich leserlich formatiert hast. Es sind halt noch ein paar überflüssige Leerzeilen drin.

Was die Sperr-/Entsperr-Fehlfunktion angeht: Eine neue Erkennung des RFID-Tags darf erst dann wieder möglich sein, wenn seit der letzten Erkennung festgestellt wurde, dass sich kein RFID-Tag im Empfangsbereich befand. Dazu nutzt Du am besten eine Variable des Typs Boolean, die z. B. auf 1 gesetzt wird, wenn ein RFID-Tag entdeckt wurde und die wieder auf 0 gesetzt wird, wenn es kein RFID-Tag im Empfangsbereich gibt.

Wenn Du mehrere Sachen quasi gleichzeitig machen musst/möchtest, formulierst Du das Programm am besten als „endlichen Automaten“. Falls Du das noch nicht kennst: Was mir dazu eingefallen ist, habe ich hier ins Netz gekippt. Beachte ggf. auch die Folgeseite.

Ich hoffe, das hilft schonmal.

Gruß

Gregor

Erstmal vielen Dank für deine Antwort, das mit der Boolean Variable werde ich gleich mal ausprobieren, ob ich das damit hin bekomme.
Das mit dem "endlichen Automaten" wird mir bestimmt auch noch nützlich sein.
Du hast mir auf jeden Fall damit schon einmal weitergeholfen. Vielen Dank dafür.