아두이노질문

선생님들 학교에서 과제하는 중인데 저희가 원하는 동작을 안해서 질문 드려요...


✅최고의 답변✅

RFID 카드가 인식되었을 때 동작을 멈추기 위해서는 `loop` 함수 내에서 해당 조건을 확인하고 동작을 중단시키는 코드를 추가해야 합니다. 현재 코드에서는 RFID 카드의 UID가 모두 0인 경우에 `noTone(BuzzerPin)`을 호출하고 1초 동안 기다리도록 되어 있습니다.

그러나 아두이노의 `loop` 함수는 무한 루프로 계속 실행되기 때문에 해당 부분이 일회성으로만 동작할 가능성이 있습니다. 아래는 수정된 코드로, RFID 카드가 인식되었을 때 모든 동작을 중단하도록 구현한 예시입니다:

```cpp

#include <Adafruit_NeoPixel.h>

#include <SPI.h>

#include <MFRC522.h>

const int BuzzerPin = 7; // 버저 핀을 7번에 연결

const int SensorPin = 6; // 센서핀은 6번에 연결

const int Pin = 5; // NeoPixel 링에 연결된 핀

#define NUMPIXELS 100 // NeoPixel 링 크기

Adafruit_NeoPixel pixels(NUMPIXELS, Pin, NEO_GRB + NEO_KHZ800);

#define RST_PIN 11 // reset핀은 11번으로 설정

#define SS_PIN 12 // SS핀은 12번으로 설정

MFRC522 mfrc(SS_PIN, RST_PIN); // MFR522를 이용하기 위해 mfrc객체를 생성해 줍니다.

void setup() {

Serial.begin(9600);

pinMode(BuzzerPin, OUTPUT); // 버저를 출력으로 설정

pinMode(SensorPin, INPUT); // 센서값을 입력으로 설정

SPI.begin(); // SPI 초기화

mfrc.PCD_Init();

pixels.begin();

pixels.show(); // 초기에 모든 픽셀 끄기

}

void loop() {

int val = digitalRead(SensorPin); // 센서값 읽어옴

if (val == HIGH) {

noTone(BuzzerPin); // 버저가 울리지 않는다

delay(10000);

} else {

tone(BuzzerPin, 220); // 버저가 울린다

for (int i = 0; i < 5; i++) {

for (int j = 0; j < NUMPIXELS; j++) {

pixels.setPixelColor(j, pixels.Color(150, 0, 0));

}

pixels.show(); // 업데이트된 픽셀 색상을 표시

delay(500); // 0.5초 간격으로 깜박임

pixels.clear(); // 모든 픽셀을 끕니다.

pixels.show(); // 꺼진 상태를 표시하여 깜박임 효과 생성

delay(500); // 0.5초 간격으로 깜박임

}

delay(100);

}

if (mfrc.PICC_IsNewCardPresent() && mfrc.PICC_ReadCardSerial()) {

noTone(BuzzerPin); // 버저가 울리지 않는다

delay(1000);

// 여기에서 필요한 동작을 수행하면 됩니다.

// 예를 들어, 불 필요한 동작을 중단하는 등의 코드를 추가할 수 있습니다.

// 아니면 break를 사용하여 loop를 빠져나가도록 할 수도 있습니다.

}

}

```

이 코드에서는 RFID 카드가 인식되었을 때 `noTone(BuzzerPin);`을 호출하고, 여기에 필요한 동작을 추가하면 됩니다. 만약 중단하고자 하는 모든 동작을 멈추려면 해당 부분에 코드를 추가하세요.