본문 바로가기
아두이노 예제 코드

아두이노 IOT 출입시스템 만들기( 코드 )

by 에이치엘 2022. 12. 1.
#include <Servo.h>
#include <MFRC522.h>
#include <SPI.h>

#define RST_PIN 9
#define SS_PIN 10
#define SERVO_PIN 5
#define TRIG_PIN 6
#define ECHO_PIN 7

MFRC522 rc522(SS_PIN, RST_PIN);
Servo servo;

int close_delay = 2000, serial_delay = 1000;
unsigned long duration = 0, distance = 0, stop_timer = 0, serial_timer = 0;
byte servo_pos = 0;
bool state_servo = false, state_all = false;
String protocol = "", key = "f039a059";

void setup() {
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIG_PIN, OUTPUT);
  
  Serial.begin(9600);
  SPI.begin();
  rc522.PCD_Init();
  delay(10);
  rc522.PCD_DumpVersionToSerial();
  servo.attach(SERVO_PIN);
  servo.write(0);
}
void loop() {
  if(rf()){    
    servoOpen();
  }
  if(state_servo && !state_all){
    if(sr()){
      servoOpen();
    }else{
      if( millis() - stop_timer >= close_delay ){
        servo_pos--;
        if(servo_pos > 0){
          servoWrite();
        }else{
          state_servo = false;
        }
      }
    }
  }
}
void serialEvent(){
  if(Serial.available()>0){
    char c = (char)Serial.read();
    if(c != '\n'){
      protocol += c;
    }else{
      if(protocol.equals("OPEN")){
        servoOpen();
      }else if(protocol.equals("CLOSE")){
        state_all = false;
        state_servo = true;
      }else if(protocol.equals("ALL")){
        state_all = true;
        servo_pos = 180;
        servoWrite();
      }
      protocol = "";
    }
  }
}
bool sr(){
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);  
  duration = pulseIn(ECHO_PIN, HIGH);
  distance = ((340 * duration)/1000)/2;  
  if(distance > 0 && distance < 100){
    return true;
  }
  return false;  
}
void servoOpen(){
  servo_pos = 180;
  state_servo = true;
  stop_timer = millis();
  servoWrite();
}
void servoWrite(){
  servo.write(servo_pos);
}
bool rf(){
  if(!rc522.PICC_IsNewCardPresent() || !rc522.PICC_ReadCardSerial()){
    return false;
  }  
  if( rc522.uid.size > 0 ){
    String hexString = "";
    for (byte i = 0; i < rc522.uid.size; i++){
      hexString += String(rc522.uid.uidByte[i], HEX);
    }
    if( hexString == key ){
      if(millis() - serial_timer >= serial_delay){
        Serial.print("OK\n");
        serial_timer = millis();
      }      
      return true;
    }else{
      if(millis() - serial_timer >= serial_delay){
        Serial.print("CARD_ERROR\n");
        serial_timer = millis();
      }   
    }
  }
  return false;
}

 

★ [ IOT코아 ]에서 실행방법은 아래 링크를 참고해주세요

https://koa-rea.tistory.com/63

 

아두이노 출입시스템( 미등록카드 알람메세지 받기 )

☆ 본 예제는 다음 기능을 포함하는 RFID 리더기를 이용한 출입시스템입니다. ○ 등록된 카드 인식시 서보모터를 작동하여 출입문을 개방. ○ 오픈된 출입문은 2초뒤 닫힘 ( 항상 열림 상태에서는

koa-rea.tistory.com

★ 실제 동작 영상은 아래 링크를 참고해주세요

https://youtu.be/_O54gjH9EiQ

 

댓글