diff --git a/README.md b/README.md index 9eb5894..8c7a5a9 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ If you have a project to share, feel free to create a branch and send me a merge - Python Flask robo-cam control - Intravenous usage with SIM900 module - Fingerprint TTL and Adafruit based Door lock security system +- RFID Tag based door lock & logger system - Height measurer with ultrasonic sensor - Automated Incubator system code - Magic mirror widget using Python Flask diff --git a/gorjaw-projects/rfid_door.cpp b/gorjaw-projects/rfid_door.cpp new file mode 100755 index 0000000..2914514 --- /dev/null +++ b/gorjaw-projects/rfid_door.cpp @@ -0,0 +1,159 @@ +#include "SPI.h" +#include "MFRC522.h" +#define SS_PIN 10 +#define RST_PIN 9 + +int button_state = 0; +int buttonPin = 7; +int ledIndicator = 2; +int resetPin = 5; + +int btn_state_pin = 3; +int wifi_serial_pin = 4; +int rfid_validation_pin = 6; + + +int doorDelay = 500; +long reset_timeout = 2400000; + + +MFRC522 rfid(SS_PIN, RST_PIN); +MFRC522::MIFARE_Key key; + +int qtyOfCards = 15; +String registeredCards[] = { + "46:0C:C8:0F", //gulbahar + "26:B8:3C:1E", //mike + "A6:88:E8:21", //selbi ilmyradova + "23:BB:97:79", //dowletyar + "C6:1D:D6:21", //Merdan + "06:75:BC:1E", //dowlpack + "86:FA:DF:21", //mati + "6A:2B:5C:9C", //mekan + "66:E5:D6:21", //dayanch + "8A:4B:81:7F", //keychain (line) + "C9:CE:B1:C2", //keychain + "56:9B:CC:0F", // merdan (green cutted) + "A6:5C:37:11", // merdan (blue bus card) + "80:86:80:74", // Gelneje (cleaner) + "96:D2:CB:0F", // Bagtyyar, berkarar LANY + +}; + + +void setup() { + Serial.begin(115200); + SPI.begin(); + rfid.PCD_Init(); + + pinMode (buttonPin,INPUT_PULLUP); + pinMode (ledIndicator,OUTPUT); + digitalWrite(resetPin,1); + pinMode (resetPin, OUTPUT); + digitalWrite(ledIndicator, 0); + + pinMode (btn_state_pin, OUTPUT); + digitalWrite(btn_state_pin, 0); + pinMode (wifi_serial_pin, OUTPUT); + digitalWrite(wifi_serial_pin, 0); + pinMode (rfid_validation_pin, OUTPUT); + digitalWrite(rfid_validation_pin, 0); +} + + +void loop() { + buttonModule(); + rfidModule(); + wifiSerialModule(); + autoResetTimeout(); +} + + +void openDoor(){ + digitalWrite(ledIndicator, 1); + delay(doorDelay); + digitalWrite(ledIndicator, 0); + delay(500); // for electrical security +} + + +void validateCard(String ID_key){ + for (int i = 0; i < qtyOfCards; i++){ + if (ID_key.indexOf(registeredCards[i]) >= 0){ + + Serial.println("card validated " + millis()); + digitalWrite(rfid_validation_pin, 1); + openDoor(); + Serial.println(registeredCards[i]); + } + } +} + + +void buttonModule(){ + button_state = digitalRead(buttonPin); + if (button_state == 0){ + Serial.println("button clicked " + millis()); + + digitalWrite(btn_state_pin, 1); + openDoor(); + } +} + + +void rfidModule(){ + if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) + return; + + MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); + if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && + piccType != MFRC522::PICC_TYPE_MIFARE_1K && + piccType != MFRC522::PICC_TYPE_MIFARE_4K) { +// Serial.println(F("Your tag is not of type MIFARE Classic.")); + return; + } + + String ID_key = ""; + for (byte i = 0; i < 4; i++) { + ID_key += + (rfid.uid.uidByte[i] < 0x10 ? "0" : "") + + String(rfid.uid.uidByte[i], HEX) + + (i!=3 ? ":" : ""); + } + ID_key.toUpperCase(); + +// Serial.print("Card key: "); + Serial.println(ID_key); + + validateCard(ID_key); + + delay(1000); + + rfid.PICC_HaltA(); + rfid.PCD_StopCrypto1(); +} + +void wifiSerialModule(){ + String stream=""; + if (Serial.available()!=0){ + stream = Serial.readStringUntil('\n'); + stream.trim(); + if (stream.length()>0){ + if (stream == "open_door"){ + digitalWrite(wifi_serial_pin, 1); + openDoor(); + } + } + } +} + + +void(* resetFunc) (void) = 0; + +void autoResetTimeout(){ + if (millis() >= reset_timeout){ + digitalWrite(resetPin, 0); + Serial.println("reset called " + millis()); + resetFunc(); + } +} diff --git a/gorjaw-projects/sensorSlave.cpp b/gorjaw-projects/sensorSlave.cpp new file mode 100755 index 0000000..54cce4e --- /dev/null +++ b/gorjaw-projects/sensorSlave.cpp @@ -0,0 +1,115 @@ +#include +int dhtSensor = 5; +dht = DHT; +long x=millis(); +// gas sensor +int gasSensor = A0; +int gasThreshold = 400; +int waterSensor = 15; // 15 or A1 +// indicators and states +int buzzer = 11; +int greenIndicator = 12; +int redIndicator = 13; +// relays and throttles +int wentilationFan = 6; +int heaterRelay = 7; +int windowRelay = 8; +int gasThrottle = 9; +int waterThrottle = 10; + +// treshold of temperature +int minTempTresh = 10; +int maxTempTresh = 25; + +String stream; +SoftwareSerial master (2,3); + +void setup() { + pinMode(gasSensor,INPUT); + pinMode(waterSensor,INPUT_PULLUP); + + pinMode(greenIndicator, OUTPUT); + pinMode(redIndicator, OUTPUT); + pinMode(windowRelay, OUTPUT); + pinMode(heaterRelay, OUTPUT); + pinMode(gasThrottle, OUTPUT); + pinMode(waterThrottle, OUTPUT); + pinMode(wentilationFan, OUTPUT); + // stabilize the relays and outputs + digitalWrite(gasThrottle,0); + digitalWrite(waterThrottle,0); + digitalWrite(wentilationFan,0); + digitalWrite(heaterRelay,0); + digitalWrite(windowRelay,0); + + Serial.begin(9600); + master.begin(9600); +} + +void loop() { + if (master.available()){ + stream = master.readStringUntil('\n'); + stream.trim(); + if (stream.length()>0){ + if (stream == "1ach"){ + Serial.println("planZat") + } + } + } + gas(); + temp(); + heater(); + water(); +} + +void gas(){ + int analogSensor = analogRead(gasSensor); + if (analogSensor>gasThreshold){ + digitalWrite(greenIndicator,0); + digitalWrite(redIndicator,1); + digitalWrite(gasThrottle,1); + digitalWrite(wentilationFan,1); + tone(buzzer,1000,200); + } + else{ + digitalWrite(greenIndicator,1); + digitalWrite(redIndicator,0); + digitalWrite(gasThrottle,0); + digitalWrite(wentilationFan,0); + noTone(buzzer); + } +} + +void temp(){ + if((x+4000)maxTempTresh){ + digitalWrite(heaterRelay,0); + // digitalWrite(windowRelay,0) + } +} + +void water(){ + int waterState = digitalRead(waterSensor) + if(waterState==0){ + // digitalWrite(windowRelay,1); + digitalWrite(waterThrottle,1); + tone(buzzer,700,200); + } + else{ + digitalWrite(waterThrottle,0); + // digitalWrite(windowRelay,0) + } +} \ No newline at end of file