esp8266 接 RC522、蜂鸣器刷卡鸣叫实验

7/28/2022 9:19:35 PM
1135
0

在本篇文章中,您将 使用ESP8266,连接到RFID RC522 设备上,读取门禁卡上的设备信息,并使蜂鸣器发出鸣叫

一、所需材料

  • ESP8266开发板
  • rfid-rc522
  • 杜邦线,公对母 x7
  • 杜邦线,公对公 x2
  • 面包板 
  • 无源蜂鸣器
  • usb Type-A   to    Micro-B

 

二、电路接线图和实物图

 

RC522

 

 

 

 

蜂鸣器 长针接D4  ,短针接地

 

三、RFID库安装

 

四、Arduino代码解析

主要涉及三个针脚的控制,  ss_pin 代表这 RC522上的SDA   rst_pin 代表这  rc522上的rst,根据上线路图我们看到  sda接入了GPIO4,  rst 接入了GPIO5  ,所以我们定义了针脚   ,如下两行所示

  #define SS_PIN 4  
  #define RST_PIN 5  
   

蜂鸣器我们接入了GPIO2,做如下定义  

  #define pinBuzzer 2      

 

    

    


            #include <SPI.h>
            #include <MFRC522.h>
            
            #define SS_PIN 4
            #define RST_PIN 5
            
            //通过PWM脉冲调制控制(无源)蜂鸣器电压的连续改变,实现蜂鸣器的鸣响
            #define pinBuzzer 2
             
            MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
            
            MFRC522::MIFARE_Key key; 
            
            // Init array that will store new NUID 
            byte nuidPICC[4];
            
            void setup() { 
              Serial.begin(9600);
              SPI.begin(); // Init SPI bus
              
              digitalWrite(pinBuzzer, LOW);//输出LOW电平,发声
              pinMode(pinBuzzer, OUTPUT); //设置pinBuzzer脚为输出状态
              rfid.PCD_Init(); // Init MFRC522 
            
              for (byte i = 0; i < 6; i++) {
                key.keyByte[i] = 0xFF;
              }
            
              Serial.println(F("This code scan the MIFARE Classsic NUID."));
              Serial.print(F("Using the following key:"));
              printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
            }
             
            void loop() {
            
              // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
              if ( ! rfid.PICC_IsNewCardPresent())
                return;
            
              // Verify if the NUID has been readed
              if ( ! rfid.PICC_ReadCardSerial())
                return;
            
              Serial.print(F("PICC type: "));
              MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
              Serial.println(rfid.PICC_GetTypeName(piccType));
            
              // Check is the PICC of Classic MIFARE type
              if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
                piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
                piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
                Serial.println(F("Your tag is not of type MIFARE Classic."));
                return;
              }
            
              if (rfid.uid.uidByte[0] != nuidPICC[0] || 
                rfid.uid.uidByte[1] != nuidPICC[1] || 
                rfid.uid.uidByte[2] != nuidPICC[2] || 
                rfid.uid.uidByte[3] != nuidPICC[3] ) {
                Serial.println(F("A new card has been detected."));
            
                // Store NUID into nuidPICC array
                for (byte i = 0; i < 4; i++) {
                  nuidPICC[i] = rfid.uid.uidByte[i];
                }
            
                mingX();
                Serial.println(F("The NUID tag is:"));
                Serial.print(F("In hex: "));
                printHex(rfid.uid.uidByte, rfid.uid.size);
                Serial.println();
                Serial.print(F("In dec: "));
                printDec(rfid.uid.uidByte, rfid.uid.size);
                Serial.println();
              }
              else Serial.println(F("Card read previously."));
            
              // Halt PICC
              rfid.PICC_HaltA();
            
              // Stop encryption on PCD
              rfid.PCD_StopCrypto1();
            }
            
            
            /**
             * Helper routine to dump a byte array as hex values to Serial. 
             */
            void printHex(byte *buffer, byte bufferSize) {
              for (byte i = 0; i < bufferSize; i++) {
                Serial.print(buffer[i] < 0x10 ? " 0" : " ");
                Serial.print(buffer[i], HEX);
              }
            }
            
            
            /**
             * Helper routine to dump a byte array as dec values to Serial.
             */
            void printDec(byte *buffer, byte bufferSize) {
              for (byte i = 0; i < bufferSize; i++) {
                Serial.print(buffer[i] < 0x10 ? " 0" : " ");
                Serial.print(buffer[i], DEC);
              }
            }
            
            
            void  mingX(){
              digitalWrite(pinBuzzer, HIGH);//输出HIGH电平,停止发声
               delay(50); //等待3000毫秒
               digitalWrite(pinBuzzer, LOW);//输出LOW电平,发声
            }

 

 

 

五、结果如视频所示

   传送门  https://www.bilibili.com/video/BV1SG411874B/?vd_source=d376895319c957786764c8b037083c6e

 

 

全部评论



提问