This is an old revision of the document!
Pentru a determina ce librarii sa folosesc, am citit descrierea pieselor pe OpimusDigital. Astfel am avut nevoie de <Keypad.h> pentru a detecta inputul de la tastatura, <SPI.h> si <MFRC522.h> pentru a comunica prin SPI cu modulul RFID si LiquidCrystal_I2C.h> cu <Wire.h> pentru a comunica prin I2C cu ecranul LCD.
De asemenea, am folosit https://github.com/robsoncouto/arduino-songs pentru melodia de alarma.
Principiul este simplu, senzorul ultrasonic este verificat constant pentru a detecta orice miscare, iar in momentul in care aceasta este detectata, se reda melodia de alarma pe buzzer. Odata introdus un cod corect la tastatura, sau o cartela acceptata apropiata de modulul RFID, alarma va inceta. Parolele pot fi adaugate / sterse folosind tastatura si introducand un cod de admin. Toate aceste actiuni sunt insotite de mesaje sugestive pe ecranul LCD. Nu in ultimul rand exista si un buton de panica, care odata apasat activeaza o intrerupere ce porneste semnalul de alarma. De data aceasta, melodia se poate opri doar folosind codul de admin.
Biblioteci utilizate
#include <Keypad.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <SPI.h> #include <MFRC522.h>
Setup module / senzori / butoane:
void setup() { // LCD setup lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(1, 0); lcd.print("Welcome home!"); // RFID setup SPI.begin(); mfrc522.PCD_Init(); // Ultrasonic setup pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // Buton de panica setup pinMode(INTERRUPT_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), panic, CHANGE); // Parole reset initPasswords(); }
Functia de loop verifica alarma si accepta input de la tastatura pentru unul din 3 scenarii:
void loop() { checkAlarm(); char key = keypad.getKey(); if (key){ switch (key) { case ADD_PASSWORD: add_password(); break; case DELETE_PASSWORD: delete_password(); break; case SEND_PASSWORD: send_password(); break; default: break; } } }
Functia de verificare per total a alarmei:
bool checkAlarm() { if (isPanic) { lcd.clear(); lcd.setCursor(3, 0); lcd.print("EMERGENCY!"); startAlarm(); return true; } if (isAuthorized) { countdown(); isAuthorized = false; return false; } if (getID()) { if (tagID == MasterTag) { countdown(); return false; } else { lcd.clear(); lcd.print("Not a valid card"); } } if (isObstacleInFront()) { lcd.clear(); lcd.print("INTRUDER ALERT!"); startAlarm(); return true; } return false; }
Functiile de citire senzor ultrasonic si calculare distanta
int getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; return distance; } /* * Verificare senzor ultrasonic */ bool isObstacleInFront() { int distance = getDistance(); if (distance < 30) { return true; } return false; }
Functia de verificare a existentei cartelei in apropierea modului RFID si de citire a acesteia.
bool getID() { // Getting ready for Reading PICCs if (!mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue return false; } if (!mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue return false; } tagID = ""; for (uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID //readCard[i] = mfrc522.uid.uidByte[i]; tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable } tagID.toUpperCase(); mfrc522.PICC_HaltA(); // Stop reading return true; }
Intentionez sa incorporez device-ul intr-o carcasa / cutie pentru a il utiliza frecvent.