Ik heb de onderstaande sketch (deels van Internet en deels aangepast) welke een relais schakelt met RFID.
Ik heb het nu zover dat ik met een geregistreerde tag het relais kan inschakelen en met een niet geregistreerde tag het relais kan uitschakelen.
Ik heb dus 2 tags nodig. Ik zou graag met de geregistreerde tag het relais willen inschakelen en met dezelfde tag ook weer uitschakelen.
Blockquote
//Control Relay Using RFID
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
int relay = 6;
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
void setup()
{
pinMode(relay, OUTPUT);
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
}
void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
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));
}
content.toUpperCase();
if (content.substring(1) == "A8 C0 FF 1E") //Change the UID of the card/cards that you want to give access
{
digitalWrite(relay, HIGH);
}
else {
digitalWrite(relay, LOW);
}
}
De truc is de status van het relay te onthouden. Nu wordt dat eigenlijk al voor je gedaan in de processor. Onderstaande modificatie print de huidige status van het relay (0 = LOW, 1 = HIGH)
content.toUpperCase();
if (content.substring(1) == "A8 C0 FF 1E") //Change the UID of the card/cards that you want to give access
{
Serial.print(F("Relay is "));
Serial.println(digitalread(relay));
...
...
Je kunt daar gebruik van maken door de tegengestelde waarde te schrijven; het uitroep teken draait de gelezen waarde om.
content.toUpperCase();
if (content.substring(1) == "A8 C0 FF 1E") //Change the UID of the card/cards that you want to give access
{
Serial.print(F("Relay is "));
Serial.println(digitalread(relay));
digitalWrite(relay, !digitalRead(relay));
}
else
{
digitalWrite(relay, LOW);
}
In plaats van het omzetten van de UID naar tekst voor de vergelijking kun je memcmp (memcmp(3) - Linux manual page) gebruiken