/ Rfid Reader für Handscanner mit Textausgabe #include #define ledPin 7 #define speakerPin 9 SoftwareSerial rfidReader = SoftwareSerial(11, -1); byte tagCounter=0; // Auswertung ob alle Tags gelesen sind int stationen = 7; char* cards[] = { // bekannte Tags "05000604E2", "", "", "", "", "", "4F0088925E" }; char* station[] = { // Stationsnummer "Station 1", "Station 2", "Station 3", "Station 4", "Station 5", "Station 6", "Station 7" }; char* sektor[] = { // Sektorangabe "X8 Y13", "X8 Y13", "X8 Y13", "X8 Y13", "X8 Y13", "X8 Y13", "X8 Y13" }; char* info1[] = { // Hinweis zur naechsten Station "Suche nach", "", "", "", "", "", "", "" }; char* info2[] = { // Hinweis zur naechsten Station "leerem Rohr", "", "", "", "", "", "", "" }; void setup() { pinMode (ledPin, OUTPUT); //ledPin =Ausgang pinMode (speakerPin, OUTPUT); // Speaker Pin = Ausgang digitalWrite(ledPin, LOW); // LED aus Serial.begin(9600); //Starte Serial USB while(!Serial); // warte auf serielle Verbindung (nur bei Leonardo und micro nötig) rfidReader.begin(9600); //starte serielle Verbindung zum Rfid-Reader } //----------------------------- Hauptprogramm--------------------------------------- void loop() { char cardNum[10]; // array der Tagnummer(10 Ziffern der Seriennummer byte cardBytes[6]; // Byte-Version Tagnummer + Prüfsumme int index=0; // aktuelle Stelle byte byteIn=0; // byte vom RFID gelesen byte lastByte=0; // das letzte gelesene Byte byte checksum = 0; // Prüfsumme Ergebnis wird hier gespeichert if (rfidReader.read()==2) { // RFID reader auslesen while(index<12) { // 12 Stellen in eindeutige Seriennummer byteIn = rfidReader.read(); // speichert Wert in byteIn if ((byteIn==1) || (byteIn==2) || (byteIn==10) || (byteIn==13)) { return; // wenn STX, ETX, CR oder LF ->Pause } if (index<10) { cardNum[index]=byteIn; // speichert die ersten 10 Hexzahlen (die letzten 2 sind Prüfsumme) } // Konvertiert ascii hex zu integer hex Wert if ((byteIn>='0') && (byteIn<='9')) { byteIn -= '0'; } else if ((byteIn>='A') && (byteIn<='F')) { byteIn = (byteIn+10)-'A'; } if ((index & 1) == 1) { // wenn ungerade Zahl verschmelzen 2 4-Bit-Ziffern zu 8-Bit-Byte cardBytes[index/2]= (byteIn | (lastByte<<4)); // Verschiebt die letzte Ziffer 4 Bits nach links und neue Ziffer if (index<10) { checksum ^= cardBytes[index/2]; // bis Prüfsummenwert } } lastByte=byteIn; // letze gelesen byte speichern index++; // Index hochzählen if (index==12) { cardNum[10] = '\0'; // wenn das Ende aller Ziffern erreicht füge ein Nullabschlusszeichen an } } int cardIndex =checkCard(cardNum); // ob Tag gültig ist zurück Index Nummer if(cardIndex>=0 && (cardBytes[5]==checksum)) { // wenn Tagnummer und Prüfsumme gültig Serial.println("Station gefunden"); tongut(); bitSet(tagCounter, cardIndex); Serial.println(station[cardIndex]); // Ausgabe Stationsnummer delay(1000); Serial.println(sektor[cardIndex]); // Ausgabe Sektor der nächsten Station delay(1000); Serial.println(info1[cardIndex]); // Ausgabe Info Zeile 1 delay(1000); Serial.println(info2[cardIndex]); // Ausgabe Info Zeile 2 delay(1000); Serial.println(tagCounter, BIN); // Ausgabe tagCounter (1000000 z.B. wenn nur Tag 7 eingelesen wurde) Serial.println(); } else { Serial.println("unbekannte Karte"); tone(speakerPin, 250, 250); //Piezoton bei ungultigen Tag delay(250); tone(speakerPin, 150, 250); Serial.println(); } } } int checkCard(char cardNum[10]) { for (int x=0; x<=stationen; x++) { // vergleiche alle bekannten Tag´s if(strcmp(cardNum, cards[x])==0) { // Vergleichen mit zuletzt gelesener Tagnummer return (x); // zurück zum Index der Tagnummern } } return (-1); // negativer Wert zeigt keine Übereinstimmung } void tongut() { //Piezoton bei richtigem Tag tone(speakerPin, 1000, 500); digitalWrite(ledPin, HIGH); delay(400); digitalWrite(ledPin, LOW); }