PDA

Επιστροφή στο Forum : Arduino και Rfid



stratos111
06-09-18, 21:55
Καλησπέρα.
Πήρα έναν αναγνώστη καρτών Rfid.
Τροποποίησα ένα κώδικα που βρήκα για άνοιγμα πόρτας όταν βλέπει την σωστή κάρτα να ανάβει ένα πράσινο led και όταν είναι λάθος, ένα κόκκινο led.
Θέλω όμως όταν περάσει η σωστή κάρτα να μένει αναμμένο το πράσινο led μέχρι να ξαναπεράσει η κάρτα για να σβήσει.Το κόκκινο ως έχει. Τώρα μένει αναμμένο για 3 δεύτερα και μετά σβήνει
Πως θα το κάνω αυτό;
Και εδώ ο κώδικας.

/* *
* All the resources for this project: https://www.hackster.io/Aritro
* Modified by Aritro Mukherjee
*
*
*/

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
int ledPin = 6; // ορίζω ακέραια μεταβλητή ledPin καιαρχικοποιώ την τιμή της σε 6
int ledPin1 = 7; // ορίζω ακέραια μεταβλητή ledPin καιαρχικοποιώ την τιμή της σε 7

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(ledPin1, OUTPUT);


Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
Serial.println("Approximate your card to the reader...");
Serial.println();


}
void loop()
{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Show UID on serial monitor
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "7A F9 55 1D" ) //change here the UID of the card/cards that you want to give access
{
digitalWrite(ledPin, HIGH);
Serial.println("Authorized access");
Serial.println();
delay(3000);
digitalWrite(ledPin, LOW);
delay(300);
}


else {
digitalWrite(ledPin1, HIGH);
Serial.println(" Access denied");
delay(3000);
digitalWrite(ledPin1, LOW);
delay(3000);
}

}

elektronio
06-09-18, 22:20
if (content.substring(1) == "7A F9 55 1D" ) //change here the UID of the card/cards that you want to give access
{
digitalWrite(ledPin, HIGH); Αυτή η γραμμή πρέπει να αντικατασταθεί ώστε να κάνει togle την έξοδο LEDpin
Serial.println("Authorized access");
Serial.println();
delay(3000);
digitalWrite(ledPin, LOW); Αυτό σβήνει το led και πρέπει να διαγραφεί
delay(300);
}

Για να κάνεις togle την έξοδο μπορείς να κρατάς σε μια βοηθητική μεταβλητή την προηγούμενη κατάσταση να την συγκρίνεις και να θέτεις την αντιθετη με την προηγούμενη κατάσταση.

SProg
06-09-18, 22:23
Αν κατάλαβα.

75170

Ste7ios
06-09-18, 22:32
Θα πρέπει να ορίσεις μια boolean μεταβλητή ως flag και ανάλογα την τιμή της αναβοσβήνει το led.

Σαν λογική:

bool LED = false;

If card == mycard {
LED = ! LED;
If LED TurnOnLED
else TurnOffLED
}

stratos111
07-09-18, 01:16
Ο.κ. Σας ευχαριστώ όλους. Το έφτιαξα. Πήρα άλλο ένα πιν για να βλέπει την προηγούμενη κατάσταση.
Και ο κώδικας αν ενδιαφέρεται κανείς.

/* *
* All the resources for this project: https://www.hackster.io/Aritro
* Modified by Aritro Mukherjee
*
*
*/

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
int ledPin = 6; // ορίζω ακέραια μεταβλητή ledPin καιαρχικοποιώ την τιμή της σε 6
int ledPin1 = 7; // ορίζω ακέραια μεταβλητή ledPin καιαρχικοποιώ την τιμή της σε 7
int Pin=5;
void setup()
{


pinMode(ledPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin,LOW);
pinMode(Pin, INPUT);
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
Serial.println("Approximate your card to the reader...");
Serial.println();


}
void loop()
{

// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Show UID on serial monitor
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "7A F9 55 1D" ) //change here the UID of the card/cards that you want to give access
{
if ( digitalRead(Pin) == LOW)
{
digitalWrite(ledPin, HIGH);
delay(1000);
}
else
{
digitalWrite(ledPin, LOW);
}
//digitalWrite(ledPin, HIGH);
Serial.println("Authorized access");
Serial.println();
delay(500);
// digitalWrite(ledPin, LOW);
//delay(300);
}



else {
digitalWrite(ledPin1, HIGH);
Serial.println(" Access denied");
delay(1000);
digitalWrite(ledPin1, LOW);
delay(300);
}
}

elektronio
07-09-18, 14:33
/* *
* All the resources for this project: https://www.hackster.io/Aritro
* Modified by Aritro Mukherjee
*
*
*/

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
int ledPin = 6; // ορίζω ακέραια μεταβλητή ledPin καιαρχικοποιώ την τιμή της σε 6
int ledPin1 = 7; // ορίζω ακέραια μεταβλητή ledPin καιαρχικοποιώ την τιμή της σε 7


bool previous_state = LOW; // μεταβλητή που κρατάει την προηγούμενη κατάσταση


void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
// digitalWrite(ledPin,LOW);
// pinMode(Pin, INPUT);
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
Serial.println("Approximate your card to the reader...");
Serial.println();
}




void loop()
{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Show UID on serial monitor
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "7A F9 55 1D" ) //change here the UID of the card/cards that you want to give access
{
if ( previous_state == LOW)
{
digitalWrite(ledPin, HIGH);
previous_state = HIGH;
delay(1000); // εδώ θέλει λίγο χρόνο παραπάνω για να προλάβει ο χρήστης να τραβήξει την κάρτα
// αλλιώς το LED θα σβήσει πάλι
}
else
{
digitalWrite(ledPin, LOW);
previous_state = LOW;
//digitalWrite(ledPin, HIGH);
Serial.println("Authorized access");
Serial.println();
delay(500); // και εδώ θέλει delay για απομάκρυνση κάρτας μεγαλύτερο από το 500.
}

// digitalWrite(ledPin, LOW);
//delay(300);
}


else {
digitalWrite(ledPin1, HIGH);
Serial.println(" Access denied");
delay(1000);
digitalWrite(ledPin1, LOW);
delay(300);
}
}


Δες λίγο τις διορθώσεις και τα σχόλια που σου έγραψα.

δεν χρειάζεται να αφιερώσεις ένα πιν Ι/Ο από τα λίγα που διαθέτει ο arduino για να ορίσεις μεταβλητή.

Επίσης νομίζω όπως το έχεις λειτουργεί σωστά μόνο μία φορά.

stratos111
07-09-18, 23:50
Δες λίγο τις διορθώσεις και τα σχόλια που σου έγραψα.

δεν χρειάζεται να αφιερώσεις ένα πιν Ι/Ο από τα λίγα που διαθέτει ο arduino για να ορίσεις μεταβλητή.

Επίσης νομίζω όπως το έχεις λειτουργεί σωστά μόνο μία φορά.

Δεν κατάλαβα. Η μόνη διαφορά είναι το delay;
Γιατί λες ότι θα δουλέψει μια φορά μόνο;

elektronio
08-09-18, 00:26
Δεν κατάλαβα. Η μόνη διαφορά είναι το delay;
Γιατί λες ότι θα δουλέψει μια φορά μόνο;

Αναφέρομαι στο δικό σου κώδικα:
ορίζεις ένα pin=5 και το κάνεις inpout. Αφού διαβάσει το σύστημα τη σωστή κάρτα ελέγχει την κατάσταση από το pin 5 που είναι input και LOW όπως ορίστηκε αρχικά. Η σύγκριση είναι αληθής οπότε θα ανάψει το LED 1. Η είσοδος pin (5) δεν αλλάζει κατάσταση. Όταν ξαναπεράσει η σωστή κάρτα (θα έπρεπε να σβήσει το LED) όμως στη σύγκριση πάλι θα είναι αληθής η σχέση οπότε θα παραμείνει αναμμένο. Συνεπώς λογικά θα δουλέψει μόνο μισή φορά.

Στη διόρθωση που έκανα άλλαξα το pin με μια μεταβλητή previous_state. Όταν περάσει η σωστή κάρτα θα ανάψει το LED και αμέσως μετά αλλάζει η previous_state σε HIGH. Την επόμενη φορά που θα περάσει η κάρτα η previous_state θα είναι HIGH οπότε θα λειτουργήσει το else και θα σβήσει το LED ενώ αμέσως μετά η previous_state θα γίνει πάλι LOW κ.ο.κ.

Την καθυστέρηση σου είπα να την αυξήσεις όπως ήταν στα 3" γιατί αν καθυστερήσει ο χρήστης να απομακρύνει την κάρτα θα την ανιχνεύσει πάλι και το LED θα σβήσει, θα ανάψει, θα σβήσει......

stratos111
08-09-18, 09:01
Σ' ευχαριστώ για τις διορθώσεις. Η μόνη διαφορά είναι ότι δουλεύει παραπάνω από μια φορά. Δούλευε αρκετές φορές. Έκανα καμιά 20αρια δοκιμές και ήταν εντάξει. Βέβαια κράτησα τις δικές σου αλλαγές, που είναι πιο σωστά δομημένος ο κώδικας. Και πάλι ευχαριστώ