RFID Alarm voor mijn huis.

Hallo mensen!

Ik ben een alarm aan het maken voor mijn voordeur, echter heb ik wat hulp nodig met de code… (ofcourse).

Het alarm, heel simpel: RFID tag tegen reader, alarm schakelt uit, de deur kan open zonder dat het alarm af gaat. (alarm gaat via relais, 12v)
Is het alarm niet uitgeschakeld, en de deur gaat open dan moet de arduino dat merken door het geplaatste reed-contact en moet het alarm dus af gaan (relais wordt geschakeld) (reed contact als input)

Ik ben nu zover dat ik het alarm getoggled aan en uit krijg met tags en een knopje voor aan de binnenkant van de deur.

Wat mis ik?

  • code dat de arduino registreert of de deur dicht of open is (via reedcontact, hoeft geen serial output te hebben)

  • code dat wanneer het alarm uit staat, het alarm niet af gaat (dus het alarm-relais krijgt geen stroom)

Dat was het geloof ik, ik hoop dat jullie mij kunnen helpen!
(bestaande code als attachment)

RFIDMAIN.ino (2.05 KB)

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

#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

// CODE OF TAGS
String read_rfid;
String ok_rfid_1 = "b454e5e9";
String ok_rfid_2 = "36fe2749";
String ok_rfid_3 = "4419dfe9";
String ok_rfid_4 = "9ba037d5";

const int buttonPin = 2;
int lock = 7;                   //Which pin the lock will be on if using a relay or solenoid or similar 
int buttonState = 0;            // varible for reading the pushbutton status

void setup() {
    Serial.begin(9600);         // Initialize serial communications with the PC
    while (!Serial)
        ;                       // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Init SPI bus
    mfrc522.PCD_Init();         // Init MFRC522 card

    pinMode(lock, OUTPUT);
    pinMode(buttonPin, INPUT);

}

void dump_byte_array(byte *buffer, byte bufferSize) {
    read_rfid = "";
    for (byte i = 0; i < bufferSize; i++) {
        read_rfid = read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() {
    //Use this routine when working with Relays and Solenoids etc.
    digitalWrite(lock, !digitalRead(lock));
    delay(500);

}

void loop() {
    // Alarm on/off inside
    buttonState = digitalRead(buttonPin);
    if (buttonState == HIGH) {
        open_lock();

    }

    // Look for new cards
    if (!mfrc522.PICC_IsNewCardPresent())
        return;

    // Select one of the cards
    if (!mfrc522.PICC_ReadCardSerial())
        return;

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println(read_rfid);
    if (read_rfid == ok_rfid_1) {
        //ok, open the door.
        open_lock();

    }
    if (read_rfid == ok_rfid_2) {
        //ok, open the door.
        open_lock();

    }
    if (read_rfid == ok_rfid_3) {
        //ok, open the door.
        open_lock();
    }
    if (read_rfid == ok_rfid_4) {
        //ok, open the door.
        open_lock();
    }

}

Dat leest ff gemakkelijker

Ik zou eerst de logica ff uitwerken met bijv. een flowchart. Dan blijf je het overzicht houden.

Zie: Stroomdiagram - Wikipedia

if (alarmactive && reedcontact) {alarmsound}

Bedankt voor het reageren beide! :slight_smile:

nicoverduin:
Ik zou eerst de logica ff uitwerken met bijv. een flowchart. Dan blijf je het overzicht houden.

Zie: Stroomdiagram - Wikipedia

Ik heb even een flowchart gemaakt, hoop dat het nu duidelijker is.

shooter:
if (alarmactive && reedcontact) {alarmsound}

Dit snap ik helaas nog niet zo goed, per kopje gaat er geloof ik een heel stuk code aan voor af..

Ik heb even een flowchart gemaakt, hoop dat het nu duidelijker is.

Het moet duidelijker zijn voor jezelf, niet voor ons :smiley:

Verder herken ik je 'vergelijken van de RFID' niet in het diagram. Zodra je een compleet diagram hebt, kun je het zelf oplossen :wink:

Je maakt al gebruik van een aantal funkties. Voeg er een paar aan toe (e.g het vergelijken van de rfid kan iets zijn zoals hieronder)

/*
  check_card
  check if the specified rfid is in the 'database'
  returns true if the rfid is known, else false
*/
bool check_card(String rfid)
{
  if (rfid == ok_rfid_1 || rfid == ok_rfid_2 ||
      rfid == ok_rfid_3 || rfid == ok_rfid_4)
  {
    return true;
  }
  return false;
}

en dat stukje in je loop() wordt dan

  // check if the card is valid
  if (checkCard(read_rfid) == true)
  {
    open_lock();
  }

Je kunt hetzelfde doen voor het lezen van je RFID. Het uiteindelijk doel is om je loop() zo schoon mogelijk te houden zodat er geen afleiding is met allerlei moeilijke code. De loop() doet de logica, de funkties doen het lezen (knoppen etc) en schrijven (lampjes, relais).

Helaas snap ik er nog erg weinig van, een echte beginner..
Ik zoek dus stukjes code die mij direct zouden kunnen helpen

OK, kun je even uitleggen waarom je open_lock() funktie de ene keer de deur op slot doet en de andere keer opent?

Kun je aub een link geven voor de rfid library die je gebruikt zodat we kunnen begrijpen wat het doet en waarom je String (met hoofdletter S) gebruikt. Ik vermoed dat de libraty reeds een string (met een kleine s) aan je geeft.

sterretje:
OK, kun je even uitleggen waarom je open_lock() funktie de ene keer de deur op slot doet en de andere keer opent?

Kun je aub een link geven voor de rfid library die je gebruikt zodat we kunnen begrijpen wat het doet en waarom je String (met hoofdletter S) gebruikt. Ik vermoed dat de libraty reeds een string (met een kleine s) aan je geeft.

Dit is de RFID Library welk in mijn bestand zit; GitHub - miguelbalboa/rfid: Arduino RFID Library for MFRC522

open_lock(), moet voor dit project op toggle staan.
Wanneer mijn alarm aan staat mag het reed-contact niet verbroken worden.
Wanneer het alarm uit staat mag het reed-contact verbroken worden d.m.v deur openen.

Zoals ik zei; ik snap er nog heel erg weinig van; dit is echt next level voor mij.

Ik zit een beetje vast met de linker tak van je flow diagram en de open_lock() funktie in je kode. De open_lock() wordt nooit gebruikt in het diagram.

Hoe zit dat?

//Edit verkeerde namen aangepast

ja prima stroomdiagram, wij kenners denken nou eenmaal anders, moet bij jou nog komen.

denk eens in stukjes:

je hebt een rfid
je hebt een alarm
en een deur
voorbeeld maak een functie die naar de rfid kijkt.
stuur het resultaat terug naar de loop
in de loop zet je een IF resultaat is open deur dan ga je naar een functie om de deur te openen.
gebruik geen toggles want dan moet je een status weten.