Go Down

Topic: 125khz rfid Reader - char* / char[] (Read 4 times) previous topic - next topic

lgrube96

Quote
Ein byte ist nur halb so groß wie ein int, aber solang der Arduino schnell genug ist und genug Platz hat, ist das nicht soo wichtig, solang du es nur für dieses Projekt brauchst.
Das delay(10) ist auch nicht wirklich entscheidend.


Ah ok, vielen Dank !
Und wenn delay(10) weglasse, dann funktioniert da absolut nichts ! Dann wird der Tag immer nur als falsch erkannt. Warum das so ist kann ich nicht sagen, aber es macht einen Unterschied.

Und jurs du hast meinen Tag echt gerade irgendwie gerettet !
Es funktioniert ! ^^
Schöne Vorrechnung mit Zeiten und bla...wüsste nicht so was man da so wirklich mit Anfangen sollte...aber passt !

Aber warum macht while (Rfid.available()) Rfid.read(); alles gleich funktionsfähig ?
"nur" weil der cache wieder geleert wird ?! 
Hier jetzt der endgültige Code (bis jetzt):
Code: [Select]
#include <SoftwareSerial.h>

char msg[13];
char lastRead[13];
char inChar;
byte x;
SoftwareSerial Rfid(2, 3); // RX als pin 2

byte rot = 11;
byte gruen = 10;

long lastMillis;


void setup()
{
  pinMode(rot, OUTPUT);
  pinMode(gruen, OUTPUT);
  digitalWrite(rot, HIGH);
  digitalWrite(gruen, HIGH);
  Serial.begin(9600);
  Rfid.begin(9600);

}

void loop()

  unsigned long currentMillis = millis();

  while (inChar = Rfid.read() != 2)   
  {
  } 

  for (x = 0; x < 12; x++)
  { 
    delay(10);
    inChar = Rfid.read();
    msg[x] = inChar;
  }
  msg[12] = 0;

  if(strcmp("05003E22627B", msg)== 0)
  {

    if(strcmp(msg, lastRead)== 0 )
    {
      if(millis() - lastMillis > 5000) {
        lastMillis = currentMillis;
        lastRead[0] = 0;
      } //Lastread "Resetten"   
    }

    else
    {

      Serial.println("Zutritt genehmigt");
      Serial.println( msg);   
      digitalWrite(gruen, LOW);
      delay(400);
      while(Rfid.available()) Rfid.read();
      digitalWrite(gruen, HIGH);
      delay(400);
      while(Rfid.available()) Rfid.read();       
      lastMillis = currentMillis;
      strcpy(lastRead, msg);
     
     
     
    }
  }
  else
  {   
    if(strcmp(msg, lastRead)== 0 )
    {
      if(millis() - lastMillis > 5000) {
        lastMillis = currentMillis;
        lastRead[0] = 0;
      } //Lastread "Resetten"   
    }
    else
    {
      Serial.println("Zutritt verweigert");
      Serial.println( msg);
      digitalWrite(rot, LOW);
      delay(400);
      while(Rfid.available()) Rfid.read();
      digitalWrite(rot, HIGH);
      delay(400);
      while(Rfid.available()) Rfid.read();
      lastMillis = currentMillis;
      strcpy(lastRead, msg);
     
    }

  }
}


Ist vielleicht nicht alles so schön, aber es funktioniert !
Morgen werde ich das ganze dann mal mit meinem MEGA ausprobieren, weil da gab es "früher" ein paar Probleme bezüglich der Arbeit mit dem RFID Reader !

Grüße
Lorenz

pylon

Quote
Ja es heisst, dass ich den Tag 2 Sekunden an den Reader halte und der Blinkcode wird mehrfach ausgefürht !


Einfach, damit das klar ist: wir reden von der grünen LED, die blinkt? Wie oft die rote blinkt, ist mir egal, das kann gut an meinem Einwand mit dem falschen Auslesen des seriellen Puffers liegen.

Quote
Warum das ? Was ändert das ?


Es ändert, dass nicht unnötig Speicherplatz verschwendet wird. Einwandfrei heisst bei mir, dass daran nichts rumzumeckern ist. Verschwendung von Speicher ist ein Grund zu meckern.

Hast Du die Routine mal so angepasst?

Code: [Select]

unsigned long timeout = millis();
for (x = 0; x < 12; x++)
 {
   while (Rfid.available() < 1 && millis() - timeout < 200);
   if (millis() - timeout >= 200) {
     Serial.println(F("Error receiving RFID tag!"));
     msg[x] = 0;
     break;
   }
   msg[x] = Rfid.read();
 }


lgrube96

Quote
Einfach, damit das klar ist: wir reden von der grünen LED, die blinkt? Wie oft die rote blinkt, ist mir egal, das kann gut an meinem Einwand mit dem falschen Auslesen des seriellen Puffers liegen.


Also eigentlich rede ich die ganze Zeit von der roten die zu oft blinkt ! Hat sich ja jetzt aber eh erledigt !

Deinen Vorschlag mit der neuen Routin, werde ich morgen mal kurz ausprobieren !
Was genau sollte diese verbessern ? Einfach weniger speicher verbrauch ?!

Grüße
Lorenz

michael_x

Na dann ist ja alles gut.

Quote
Warum das so ist kann ich nicht sagen, aber es macht einen Unterschied.
Dann kannst du auch nicht wissen, ob dein Code "einwandfrei" ist.
Was pylons Modifikation mit dem verräterischen Wort timeout für eine Startzeit (?) soll, solltest du verstehen, während du es einbaust.
Es ist nur ein Schnipsel, der nicht überall hin passt ;)


Noch ein Nachtrag:

Eine Zugangskontrolle darf übrigens gar nicht so schnell sein, wenn sie ernst genommen werden will.
"Schnarchlangsam" solltest du zu keinem Security, Zöllner oder ähnlichen sagen, wenn du nicht lernen willst, wie langsam alles gehen kann  ;)  

Ungenutzer RAM verbraucht übrigens genausoviel Strom wie verschwendeter ...
Allerdings gebe ich dir recht, pylon, dass die Verwendung von int für kleine vorzeichenlose Zahlen im Prinzip eine schlechte Angewohnheit ist.
Bin nicht sicher, ob avrgcc das wirklich immer richtig wegoptimiert.

pylon

Quote
Bin nicht sicher, ob avrgcc das wirklich immer richtig wegoptimiert.


In vielen Fällen kann er das gar nicht, weil er nicht den ganzen Wertbereich kennt, der möglich ist.
Ich habe auch nicht behauptet, meine Modifikation sei notwendig, aber einwandfreier Code darf solche Sachen nicht enthalten.

Quote
Was pylons Modifikation mit dem verräterischen Wort timeout für eine Startzeit (?) soll, solltest du verstehen, während du es einbaust.


Korrekter Einwand, aber ich wollte dem OP einen Hinweis geben, wofür die Variable verwendet wird. Und wenn ich das übliche lastMillis genommen hätte, wäre der Konflikt programmiert gewesen.

Quote
Was genau sollte diese verbessern ? Einfach weniger speicher verbrauch ?!


Nein, sie eliminiert einen Fehler in Deinem Code. Du liest einfach 12 Zeichen von der SoftwareSerial ein, ohne zu wissen, dass die dort überhaupt angekommen sind. Da Du das überaus langsam machst (und damit Deinen ganzen Sketch blockierst), funktioniert es in den meisten Fällen, trotzdem ist es sehr unschön und kann zu Race-Conditions führen. Der Timeout ist eingebaut, damit der Sketch nicht gleich stehen bleibt, wenn Dein Reader, aus welchen Gründen auch immer, mal nicht die gewünschten 12 Zeichen liefert.

Go Up