# 學校超音波及近場感應 ``` include <Servo.h> #define trigPin 3 #define echoPin 2 #define servoPin 5 #include <SPI.h> #include <Wire.h> #include <MFRC522.h> #define RST_PIN 9 #define SS_PIN 10 / MFRC522 mfrc522; char *reference; byte uid[]={0x0E, 0xB7, 0xED, 0xAE}; int pass=0; Servo myservo; void setup() { Serial.begin(9600); myservo.attach(servoPin); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); SPI.begin(); mfrc522.PCD_Init(SS_PIN, RST_PIN); // 初始化MFRC522卡 Serial.print(F("Reader ")); Serial.print(F(": ")); mfrc522.PCD_DumpVersionToSerial(); // 顯示讀卡設備的版本 } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration / 58.2; if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { // 顯示卡片的UID Serial.print(F("Card UID:")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); // 顯示卡片的UID Serial.println(); Serial.print(F("PICC type: ")); MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); //顯示卡片的類型 //把取得的UID,拿來比對我們指定好的UID bool they_match = true; // 初始值是假設為真 for ( int i = 0; i < 4; i++ ) { // 卡片UID為4段,分別做比對 if ( uid[i] != mfrc522.uid.uidByte[i] ) { they_match = false; // 如果任何一個比對不正確,they_match就為false,然後就結束比對 break; } } //在監控視窗中顯示比對的結果 if(they_match){ Serial.print(F("Access Granted!")); pass==0; }else{ Serial.print(F("Access Denied!")); pass==1; } mfrc522.PICC_HaltA(); // 卡片進入停止模式 } if (distance <= 100&&pass==0) { myservo.write(120); // micro servo 9G 轉動到 90 度的位置 delay(1000); } else {3 myservo.write(0); // micro servo 9G 轉動到 0 度的位置 } Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); delay(500); } //Card UID: 0E B7 ED AE ```