본문으로 바로가기

1. 버튼을 누르면 소리내기 (버튼 눌림/올림 감지)

 

 

 

 

 

[ 주요 사용 함수 ]

  • digitalRead( 핀번호 ) : 지정 핀의 전압을 측정하여

                                  HIGH(=1) 또는 LOW(=0) 상태를 리턴

 

[ 버튼 눌림 판단 ]

  • 평소 버튼이 올려져 열린 상태에서는 입력 값이 HIGH(1, Vcc) 상태임
  • 버튼을 눌러 닫힌 상태가 되면 입력 값이 LOW(0, GND) 상태가 됨

 

 

2. 버튼을 누르면 소리내기 수정

 

버튼을 누르면 끊김이 없이 연속적으로 소리를 내도록 수정한 프로그램입니다. 소스를 작성하고 실행하여 1번 소스와의 차이점을 확인해 보시기 바랍니다.

 

////////////////////  부저와 버튼 핀 번호

#define pinBuzzer     3  // 부저 핀 번호
#define pinButton     A3 // 버턴 핀 번호

////////////////////  메인 프로그램 (setup & loop)

void  setup()
{
  pinMode( pinButton, INPUT );  // 버튼은 입력 모드로
  pinMode( pinBuzzer, OUTPUT ); // 부저는 출력 모드로  
  
  noTone( pinBuzzer );  // 스피커 끄기(음소거)
}

void  loop()
{
  if( digitalRead(pinButton) == 0 ) // 버튼 눌림?
  {
    tone( pinBuzzer, 261 ); // "도" 음 연주
    //delay( 500 );           // 0.5초 유지  
    //noTone( pinBuzzer );    // 음소거(mute)
  }
  else
  {
    noTone( pinBuzzer );    // 음소거(mute)
  }

  delay( 10 );  // 10 msec 후에 다시 눌림 체크
}

 

 

 

3. 시리얼 모니터로 변수 값 출력하기

 

 

 

주요 사용 함수

  • Serial.begin(통신속도) : 연결된 COM 포트로 통신 시작
  • Serial.print(value) : value 내용(값)을 COM 포트로 출력
  • Serial.println(value) : Serial.print(value) + 줄 넘김(New Line)

 

 

3. RFID(Radio Frequency Identification) Tag 읽기

 

무선 주파수를 이용하여 RFID 태그 안에 저장된 UID 데이터를 RFID 리더(Reader)로 판독할 수 있는 장치

 

RFID 장치 =  태그(Tag) + 리더(Reader)     ……      (MFRC-522, SPI 통신, 13.56MHz)

태그(TAG) : 태그 안에는 정보를 송수신하는 안테나, 태그의 정보(UID)를 담고 있는 IC

② 리더(READER) : 태그로 신호를 보내어 태그로부터 수신한 정보(UID)를 판독

 

 

 

 

4. RFID 태그 읽기 코딩 실습 (1)

 

 

 

 

 

5. RFID 태그 읽기 코딩 실습 (2)

 

 

 

카드가 리더기 근처에 접근(태깅)되고, UID 읽기가 성공한 경우

UID
를 스트링 변수에 16진수로 저장하고 시리얼 모니터로 출력하는 코드

 

 

 

 

 

 

#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include <require_cpp11.h>
#include <SPI.h>

#define RFID_SS_PIN     2 // SPI 통신용 SS(Slave Select)
#define RFID_RST_PIN    4 // RESET 핀

MFRC522 mfrc522( RFID_SS_PIN, RFID_RST_PIN ); // 객체 인스턴스 선언

////////////////////  메인 프로그램 (setup & loop)

void setup()
{
  Serial.begin( 9600 );
  
  SPI.begin(); // SPI 통신 초기화
  mfrc522.PCD_Init(); // MFRC522 초기화
  
  Serial.println("RFID Reader test: please touch with RFID card.");
}

void loop()
{
  if( ! mfrc522.PICC_IsNewCardPresent() )
  {
    Serial.print("."); // 카드가 태깅(접근)되지 않음, 대기
    delay( 500 );
    return;
  }
  
  if( ! mfrc522.PICC_ReadCardSerial() )
  {
    Serial.print("!"); // UID 읽기 실패, 다시 대기
    delay( 500 );
    return;
  }

  Serial.print("\n\nUID tag: ");  // 읽은 UID를 16진수로 출력 (ex) B00EA11B
  
  String  strRFID = "";  // RFID TAG를 저장할 문자열 변수
  
  for( byte i=0; i < mfrc522.uid.size; i++ )  // UID size는 4 byte
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     
     strRFID.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : ""));
     strRFID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  
  Serial.print("\nMessage: ");  // (ex) [29B0007F]
  Serial.print("[");
  strRFID.toUpperCase();  // strRFID에 저장된 UID 문자열을 대문자로 변환
  Serial.print(strRFID);
  Serial.println("]");
  
  delay(3000);  // 출력하고 3초 후에 다시 카드 읽기 반복
  Serial.println("\nPlease touch with RFID card again.");
}

 

 

다음은 RF Tag ID를 읽어 물건을 이동시킬 위치를 정의하는 예제입니다.  문자열 변수로 ID를 정의하는 문장에서 각자 개인의  RF ID를 위의 소스를 이용하여 확인하신 후 수정 후에 테스트를 진행해 주시기 바랍니다.

 

#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include <require_cpp11.h>
#include <SPI.h>

#define RFID_SS_PIN     2 // SPI 통신용 SS(Slave Select)
#define RFID_RST_PIN    4 // RESET 핀

String s_strRFIDUidForSeoul = String("7E8CF703");
String s_strRFIDUidForIncheon = String("1EE1F703");
String s_strRFIDUidForSejong = String("8215F803");
String s_strRFIDUidForDaejeon= String("39D6F703");
String s_strRFIDUidForDaegoo= String("44FAF603");

MFRC522 mfrc522( RFID_SS_PIN, RFID_RST_PIN ); // 객체 인스턴스 선언

////////////////////  메인 프로그램 (setup & loop)

void setup()
{
  Serial.begin( 9600 );
  
  SPI.begin(); // SPI 통신 초기화
  mfrc522.PCD_Init(); // MFRC522 초기화
  
  Serial.println("RFID Reader test: please touch with RFID card.");
}

void loop()
{
  if( ! mfrc522.PICC_IsNewCardPresent() )
  {
    Serial.print("."); // 카드가 태깅(접근)되지 않음, 대기
    delay( 500 );
    return;
  }
  
  if( ! mfrc522.PICC_ReadCardSerial() )
  {
    Serial.print("!"); // UID 읽기 실패, 다시 대기
    delay( 500 );
    return;
  }

  Serial.print("\n\nUID tag: ");  // 읽은 UID를 16진수로 출력
  
  String  strRFID = "";  // RFID TAG를 저장할 문자열 변수
  
  for( byte i=0; i < mfrc522.uid.size; i++ )  // UID size는 4 byte
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     
     strRFID.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : ""));
     strRFID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  
  Serial.print("\nMessage: ");
  Serial.print("[");
  strRFID.toUpperCase();  // strRFID에 저장된 UID 문자열을 대문자로 변환
  Serial.print(strRFID);
  Serial.println("]");


  char  sRFID[8+1];

  strcpy( sRFID, &strRFID[0] );
  Serial.println( sRFID );

  if (strRFID.compareTo(s_strRFIDUidForSeoul) == 0)
  {
    Serial.println("Move to Seoul");
  }
  else if (strRFID.compareTo(s_strRFIDUidForIncheon) == 0)
  {
    Serial.println("Move to Incheon");
  }
  else if (strRFID.compareTo(s_strRFIDUidForSejong) == 0)
  {
    Serial.println("Move to Sejong");
  }
  else if (strRFID.compareTo(s_strRFIDUidForDaejeon) == 0)
  {
    Serial.println("Move to Daejeon");
  }
  else if (strRFID.compareTo(s_strRFIDUidForDaegoo) == 0)
  {
    Serial.println("Move to Daegoo");
  }
  
  delay(3000);  // 출력하고 3초 후에 다시 카드 읽기 반복
  Serial.println("\nPlease touch with RFID card again.");
}

 

 

728x90
728x90