RFID och Bluetooth dörrlås (4 / 4 steg)
Steg 4: Koden - (uppdaterad den 16 April 2016)
/*
* ----------------------------------------------------------------------------
* Typisk pin layout används:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Läsare/PCD Uno Mega Nano v3 Leonardo Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
*
*/
#include
#include
#include
#include
#include
#include
#define RST_PIN 9 / / kan konfigureras, se typiska pin layout ovan
#define SS_PIN 10
#define Green_LED 6 //pin för gröna "dörren olåst" indikator ledde
#define Red_LED 7 //pin för röda "dörren låst" indikator LED
String inputString = "";
String kommando = "";
Strängvärde = "";
Sträng lösenord = "startrek"; Detta är lösenordet för att öppna och stänga din dörr
Du kan ange någon pasword du gillar med hjälp av siffror och symboler
booleska stringComplete = false;
char matris1 [] = "Känga till Lås upp"; strängen för att skriva ut på LCD-skärmen
char matris2 [] = "Dörren låst";
char array3 [] = "Dörren olåst";
char array4 [] = "Låsa";
char array5 [] = "Unlocking";
char array6 [] = "Accepterade";
char array7 [] = "Känga till Lock";
int tim = 1; värdet av fördröjningstiden
initiera bibliotek med numrerar av gränssnittet stiften
LiquidCrystal_I2C lcd(0x27,16,2); inställd 0x27 LCD adressen för en 16 tecken och 2 linje
MFRC522 mfrc522 (SS_PIN, RST_PIN); Skapa MFRC522 instans.
Servo myservo;
Sträng read_rfid; NFC-Taggar ID
String ok_rfid_1 = "94e68de2";
String ok_rfid_2 = "f5642a50";
String ok_rfid_3 = "43ef222993c81";
int addr = 1; initalise eeprom adress
int eVal = 0; initalise värde lagras i eeprom
int lockPosition; initiera lockPosition, brukade värde till öm i eVal
int servo_position;
int Knapp1 = 8. initialisera stifts ingång av låsa/låsa upp knappen
void setup() {
Serial.BEGIN(9600); Initiera seriell kommunikation med PC
tag (!. Seriell);
SPI.begin();
mfrc522. PCD_Init();
inputString.reserve(50); reservera 50 byte i minnet att spara för string manipulation
Command.Reserve(50);
Value.Reserve(50);
booleska stringOK = false;
{
LCD.init(); initiera lcd
LCD.backlight(); Öppna bakgrundsbelysningen
LCD.BEGIN(16,2);
}
uppsättningar pin-lägen ingång/utgång och lampor ledde
pinMode (Green_LED, OUTPUT);
pinMode (Red_LED, OUTPUT);
digitalWrite (Green_LED, låg);
digitalWrite (Red_LED, hög);
pinMode(BUTTON1,INPUT);
myservo.attach(5); servo pin-kod
uppsättningar inledande locl position
lockPosition = EEPROM.read(1);
Serial.Print(EEPROM.Read(1));
IF(lockPosition == 1) {
digitalWrite (Red_LED, låg);
digitalWrite (Green_LED, hög);
}
annat {
digitalWrite (Red_LED, hög);
digitalWrite (Green_LED, låg);
lockUnlock();
}
swipeText();
}
/*
* Dumpa en byte-array som hex värden till följetong.
*/
void dump_byte_array (byte * buffert, byte bufferSize) {
read_rfid = "";
för (byte jag = 0; jag < bufferSize; i ++) {
read_rfid = read_rfid + sträng (buffert [i], HEX);
}
}
void lockUnlock() {/ / låser eller låser upp dörren
myservo.attach(5);
IF(lockPosition == 1) {
lock1();
servo_position = 0;
myservo.write(servo_position);
digitalWrite (Red_LED, hög);
digitalWrite (Green_LED, låg);
Delay(2500);
lockPosition = 2;
eVal = lockPosition;
EEPROM.write(1,eVal);
Serial.Print(eVal);
}
annat if(lockPosition == 2) {
Lock2();
servo_position = 180;
myservo.write(servo_position);
digitalWrite (Red_LED, låg);
digitalWrite (Green_LED, hög);
Delay(2500);
lockPosition = 1;
eVal = lockPosition;
EEPROM.write(1,eVal);
Serial.Print(eVal);
}
myservo.detach();
}
void swipeText() / / skickar texten till LCD-skärmen
{
IF(lockPosition == 1) {
LCD.Clear(); Clear LCD-skärmen och placerar markören i det övre vänstra hörnet.
lcd.setCursor(0,0); ställa markören till kolumn 15, linje 0
för (int positionCounter1 = 0; positionCounter1 < 15; positionCounter1 ++)
{
LCD.Print(array3[positionCounter1]); Skriv ut ett meddelande till LCD-skärmen.
Delay(tim); vänta på 250 mikrosekunder
}
lcd.setCursor(0,1); ställa markören till kolumn 15, linje 1
för (int positionCounter = 0; positionCounter < 15; positionCounter ++)
{
LCD.Print(array7[positionCounter]); Skriv ut ett meddelande till LCD-skärmen.
Delay(tim); vänta på 250 mikrosekunder
}
}
annat if(lockPosition == 2) {
LCD.Clear(); Clear LCD-skärmen och placerar markören i det övre vänstra hörnet.
lcd.setCursor(0,0); ställa markören till kolumn 15, linje 0
för (int positionCounter1 = 0; positionCounter1 < 15; positionCounter1 ++)
{
LCD.Print(array2[positionCounter1]); Skriv ut ett meddelande till LCD-skärmen.
Delay(tim); vänta på 250 mikrosekunder
}
lcd.setCursor(0,1); ställa markören till kolumn 15, linje 1
för (int positionCounter = 0; positionCounter < 15; positionCounter ++)
{
LCD.Print(array1[positionCounter]); Skriv ut ett meddelande till LCD-skärmen.
Delay(tim); vänta på 250 mikrosekunder
}
}
}
void lock1() / / skickar texten till LCD-skärmen låsa
{
LCD.Clear();
lcd.setCursor(0,0);
för (int positionCounter1 = 0; positionCounter1 < 15; positionCounter1 ++)
{
LCD.Print(array6[positionCounter1]);
Delay(tim);
}
lcd.setCursor(0,1);
för (int positionCounter1 = 0; positionCounter1 < 10; positionCounter1 ++)
{
LCD.Print(array4[positionCounter1]);
Delay(tim);
}
}
void lock2() / / skickar texten till LCD-skärmen för att låsa upp
{
LCD.Clear();
lcd.setCursor(0,0);
för (int positionCounter1 = 0; positionCounter1 < 15; positionCounter1 ++)
{
LCD.Print(array6[positionCounter1]);
Delay(tim);
}
lcd.setCursor(0,1);
för (int positionCounter1 = 0; positionCounter1 < 12; positionCounter1 ++)
{
LCD.Print(array5[positionCounter1]);
Delay(tim);
}
}
void loop() {
kontroller för låsa/låsa upp tryck på knapp
IF(digitalRead(BUTTON1) == hög) {
lockUnlock();
swipeText();
}
kontrollerar om bluetooth har skickat ett kommando
om arduino får en sträng uppsägning karaktär som \n stringComplete vilja sätta till sann
om (stringComplete) {
Serial.println(inputString);
Delay(100);
identifierade posiion av '=' i sträng och ange dess index till pos variabel
int pos = inputString.indexOf('=');
pos variabelns värde > eller = 0 betyder '=' i fått sträng.
om (pos > -1) {
delsträng (start, stopp) funktionen klippa en del av sträng från början att stoppa
Här kommer kommandot att mottagna strängen till '='
Låt mottagna sträng är öppen = test123
sedan är kommandot "öppna"
kommandot = inputString.substring (0, pos);
värdet kommer att vara från efter = newline-kommandot
i exemplet ovan är värde test123
vi bara ignorerar den '=' tar första parametern i delsträng som "pos + 1"
Vi använder '=' som avgränsare mellan kommandot och vale
utan '=' kan alla andra tecken användas
Vi använder = betyder vårt kommando eller lösenord inte måste innehåller någon '=', annars det kommer att orsaka fel
värde = inputString.substring (pos + 1, inputString.length()-1); extrahera kommandot upp till \n studerandena
Serial.println(Command);
Serial.println(Value);
kontrollerar lösenord från bluetooth och är rätt låser eller låser upp dörren
password.compareTo(value) jämför mellan lösenordssträngen tring och värde, om matcha avkastning 0
IF(!Password.compareTo(Value) & & (kommandot == "Öppna")) {
om lösenord matchade och kommandot "Öppna" än bör dörren öppna
lockUnlock(); funktionen Ring upp lockUnlock()
Serial.println ("öppna"); skickade öppen feedback till telefon
Delay(100);
swipeText();
}
IF(!Password.compareTo(Value) & & (kommandot == "Nära")) {
om lösenordet matchas och kommandot Stäng' än dörren ska stänga
lockUnlock();
Serial.println ("Stäng"); skickade "Stäng" strängen till telefonen
Delay(100);
swipeText();
}
IF(Password.compareTo(Value)) {
om lösenordet inte matchas än skickade fel feedback till telefon
Serial.println ("fel");
Delay(100);
swipeText();
}
}
Rensa strängen för nästa iteration
inputString = "";
stringComplete = false;
}
sökning efter RFID-tagg presenteras
om (! mfrc522. PICC_IsNewCardPresent())
hemkomst.
Välj ett av korten
om (! mfrc522. PICC_ReadCardSerial())
hemkomst.
dump_byte_array (mfrc522.uid.uidByte, mfrc522.uid.size);
kontrollerar om en rfid Taggar ID matchar lagrade listan om så det kommer då låsa eller låsa upp dörren
Serial.println(read_rfid);
om (read_rfid == ok_rfid_1) {
OK, öppna dörren.
lockUnlock();
swipeText();
}
Lägga till nedan så många "nycklar" som du vill
om (read_rfid == ok_rfid_2) {
även ok, öppna dörren
lockUnlock();
swipeText();
}
Lägga till nedan så många "nycklar" som du vill
om (read_rfid == ok_rfid_3) {
även ok, öppna dörren
lockUnlock();
swipeText();
}
}
void serialEvent() {
samtidigt (Serial.available()) {
få den nya byten:
char inChar = (char)Serial.read();
Serial.write(inChar);
Lägg till det inputString:
inputString += inChar;
om den inkommande karaktären är en ny rad eller en vagnretur, ange en flagga
så den viktigaste loopen kan göra något åt det:
om (inChar == '\n' || inChar == '\r') {
stringComplete = sant;
}
}
}