Hilfe bei RFID-Reader....

Hallo,

Ich habe an einem Arduino Mega einen RFID-Reader mit LCD hängen. Der Sketch funktioniert soweit auch ganz gut, jedoch möchte ich das ich den ID´s der RFID-Chips einen Namen geben kann und der dann auch auf dem LCD ausgegeben wird.

kann mir eventuell jemand helfen?

hier der Sketch.

#include <LiquidCrystal_I2C.h>
#include <Wire.h> 

LiquidCrystal_I2C lcd(0x3F,20,4);


int SUCCESS = 10;
int ERROR = 13;
int DOOR = 7;


int readVal = 0; 
unsigned int readData[10]; 
int counter = -1; 
char tagId[11]; 

char* authorizedTags[4]; 


void initAuthorizedTags() {
	
  authorizedTags[0] = "1F004D900A"; 
  authorizedTags[1] = "1F00343249"; 
  authorizedTags[2] = "1F005076AA"; 
  authorizedTags[3] = "04006813AB"; 
}

void setup() {                
  Serial.begin(9600);
  lcd.init();                   
  lcd.backlight();
  lcd.clear();                  
  
    
  lcd.setCursor(2,0);
  lcd.print("RFID System V1.2");
  lcd.setCursor(0,3);
  lcd.print("Bitte RFID einlesen!");
  
  pinMode(SUCCESS, OUTPUT);
  pinMode(ERROR, OUTPUT);
  pinMode(DOOR, OUTPUT);
  initAuthorizedTags();
}


int checkTag() {
  int i;
  
  for (i = 0; i < 4; ++i) {
    if (strcmp(authorizedTags[i], tagId) == 0) {
      return 1;
    }
  }
  return 0;
}


void parseTag() {
  int i;
  for (i = 0; i < 10; ++i) {
    tagId[i] = readData[i];
  }
  tagId[10] = 0;
}


void processTag() {
	
  parseTag();
	
	
  printTag();
	
	
  if (checkTag() == 1) {
    tagSuccess(); 
  } else {
    tagFailed(); 
  }
}

void printTag() {
  Serial.print("RFID ID: ");
  Serial.println(tagId);
  
  lcd.clear();    
  
}


void tagSuccess() {
  Serial.println("RFID Autorisiert");
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("RFID Autorisiert");
  lcd.setCursor(6,1);
  lcd.print("RFID-ID:");
  lcd.setCursor(5,2);
  lcd.print(tagId);
  lcd.setCursor(4,3);
  lcd.print("Tuer offen...");
  
	
	
  
  digitalWrite(SUCCESS, HIGH);
  digitalWrite(DOOR, HIGH);
  digitalWrite(ERROR, LOW);
  delay(5000);
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("RFID System V1.2");
  lcd.setCursor(0,3);
  lcd.print("Bitte RFID einlesen!");
}


void tagFailed() {
  Serial.println("RFID nicht zugelassen!");
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(6,0);
  lcd.print("RFID-ID:");
  lcd.setCursor(5,1);
  lcd.print(tagId);
  lcd.setCursor(2,2);
  lcd.print("nicht zugelassen!");
  
	
  
  digitalWrite(SUCCESS, LOW);
  digitalWrite(DOOR, LOW);
  digitalWrite(ERROR, HIGH);
  delay(3000);
  lcd.clear();
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("RFID System V1.2");
  lcd.setCursor(0,3);
  lcd.print("Bitte RFID einlesen!");
  
}


void clearSerial() {
  while (Serial.read() >= 0) {
		; 
	}
}

void loop() {
	
  digitalWrite(SUCCESS, LOW);
  digitalWrite(ERROR, LOW);
  digitalWrite(DOOR, LOW);
  

	if (Serial.available() > 0) {
		
		readVal = Serial.read();
		
		
		if (readVal == 2) {
			counter = 0; 
		} 
		
		else if (readVal == 3) {
			
			processTag();
			
			
			clearSerial();
			
			
			counter = -1;
		}
		
		else if (counter >= 0) {
			
			readData[counter] = readVal;
			
			
			++counter;
		} 
	}
}

Gruß

Tobi

Hallo TobiTechnik,

erweitere doch dein bereits vorhandenes Array in dem die IDTags abgelegt sind um ein Feld in dem du den zugehörigen Namen festhältst.
Deine Routine zur Überprüfung ob eine ID berechtigt ist die Tür zur öffnen kannst du als Rückgabewert den Index des Arrays übergeben lassen. So weist du im weiteren Programmverlauf auch immer welche IDTag gerade die Tür öffnet und kannst dann die ID sowie den Namen ausgeben.

Gruß
Django

Ein struct das eine ID und den Namen enthält. Dann ein Array aus structs.

Hallo Django,
Das hört sich gut an :slight_smile:
Kannst du mir eventuell ein kleines beispiel geben? Ich stehe echt auf dem Schlauch :confused:

mehrdimensionales Array

Rückgabewert

Gruß
Django

Lernt wie man mit structs umgeht! Das ist sehr oft der beste Weg um Daten zu organisieren

struct Data
{
  const char* const id;      //const Zeiger auf const Daten. Man kann weder die Daten durch den Zeiger ändern, noch den Zeiger selbst
  const char* const name;
};

Data tags[] =
{
  { "1234", "test 1" },
  { "5678", "test 2" }
};

const int NUM_OF_TAGS = sizeof(tags) / sizeof(tags[0]);

void setup()
{
  ....

  for (int i = 0; i < NUM_OF_TAGS; i++)
  {
     Serial.println(tags[i].id);
     Serial.println(tags[i].name);
     Serial.println();
  }
}

Hallo,
danke für die vielen Antworten. Werde mich am WE mal ein bißchen an euren vorschlägen versuchen.

Gruß

Tobi

Serenifly:
Lernt wie man mit structs umgeht!

Ich muß es einfach fragen: Was ist der Vorteil von tags[index].id gegenüber id[index]? Ich sehe ein komplizierteres Programm, wodurch wird dies ausgeglichen?

Er will nicht nur die id, sondern auch einen Namen oder Titel dazu. Also bräuchte man zwei String Arrays. Die gehören aber eigentlich zusammen. Damit man sich dann nicht mit der Verwaltung von zwei im Code getrennten Arrays herum ärgern muss, fast man beide in einer Datenstrukur zusammen. Das macht den Code nicht nur besser wartbar, sondern auch leserlicher. Wenn jemand anders den Code sieht, sieht er sofort dass id und name zusammen einen Tag definieren.

Und schau dir mal den Konstruktor des Arrays aus structs an. Und vergleiche das mit zwei getrennten Arrays. Beim Arrays aus structs sieht man sofort welche ID zu welchem Namen gehört.

Meine Begeisterung, bezogen auf kurze Sketche, hält sich in Grenzen. Aber auf jeden Fall danke für die Erklärung! Möglicherweise, wenn ich mehr gelernt habe, wundere ich mich dann über meine merkwürdige Frage :slight_smile:

Bei solchen absolut elementaren Konstruktionen einen Unterschied zwischen kleinen und etwas größeren Programmen zu machen, lohnt sich nicht.

Und Arrays aus structs sind auf dem Arduinon an vielen Stellen hilfreich. Jurs hat da auch schon einige Beispiele dazu gezeigt; vor allem wenn es um die Verwaltung von Schaltzeiten geht.

Ich sehe ein komplizierteres Programm, wodurch wird dies ausgeglichen?

Andere sehen es andersrum einfacher. Statt mehrere Arrays die alle gleich groß sein müssen, sehen sie nur ein einzelnes Array aus Objekten, d.h. Datenstrukturen die zusammen gehören.

Wenn du lieber mit mehreren unabhängigen Zahlen und Texten als mit einem einzelnen Objekt, das aus mehreren Zahlen und Texten besteht zu tun hast, ist "Objektorientierung" nur unnötige Verkomplizierung.

Wodurch ein sketch kürzer oder länger wird, sollte nicht so wichtig sein. Wichtiger ist die Verständlichkeit.
Und da kann, -- wenn du dich erstmal dran gewöhnst -- denken in Datenstrukturen helfen.

Denk dir nun zu den Strukturen noch Methoden dazu, und du bist bei C++ und Klassen. Klar ist auf den ersten Blick fragwürdig, ob das "was bringt", oder alles nur komplizierter macht.
Ist aber bei Arduino sehr beliebt, selbst für Objekte, wo es keinen Sinn macht, in (mehreren) Instanzen von Klassen zu denken, wo es natürlicherweise normalerweise nur eines gibt (z.B. ein LiquidCrystal Objekt)

michael_x:
Wodurch ein sketch kürzer oder länger wird, sollte nicht so wichtig sein. Wichtiger ist die Verständlichkeit.
Und da kann, -- wenn du dich erstmal dran gewöhnst -- denken in Datenstrukturen helfen.

Möglicherweise habe ich mich nicht so klar ausgedrückt: Ich meinte, je länger ein Programm wird, desto wichtiger ist die Verständlichkeit, damit einhergehend die Strukturierung. Da ich derzeit eher kleine, übersichtliche Programme schreibe, sehe ich möglicherweise die Vorteile nicht, die mir bei einem längeren Programm deutlicher würden.

Danke, Ihr werdet in dieser Sache (OOP) noch von mir lesen, dann aber in meinem eigenen Thema. Ich habe da schon eine Idee :slight_smile:

OOP ist das gar nicht mal. Structs gab es auch schon in C. In anderen Sprachen - vor allem aus der Anfangszeit von höheren Programmiersprachen - heißt das record. Wobei in C++ der Unterschied zwischen structs und Klassen minimal ist.