概况

     经过了几个星期的不懈努力,终于将寝室的门改造完毕了,目前能通过手机app或者是刷IC卡(校园卡,银行卡,手机NFC模拟,手环NFC模拟)来开门(当然最直接的钥匙开门还是能用).下面做个简单记录:

使用场景:

  1. 出门经常忘记带钥匙,但是手机,手环,或者校园卡总是在身上的
  2. 全寝的人都在床上的时候有人来敲门,不想下来开门,通过APP控制直接开门

开发环境:

  1. IDE: Arduino IDE 1.8.10
  2. 电脑系统: Win10 1903

使用到的器材:

  1. ESP8266开发板
  2. MG996R 舵机
  3. RC522 模块
  4. 杜邦线若干
  5. 电烙铁(如果是焊好的可以不用)
  6. 面包板(可用可不用)
  7. 长的数据线(看自己需求,及如何布置)
  8. 钢丝绳
  9. 5V电源*2(因为舵机需要单独的5V供电)
  10. 定制的亚克力外壳
  11. 热熔胶

8266.jpg
bxg.jpg
dbx.jpg
dj.jpg
rc522.jpg
rlj.jpg
sjx.jpg
ykl.jpg

正式开始

演示:

1_1.gif

1.控制舵机

    首先,我们需要控制舵机,让舵机动起来,我们可以看官方的示例代码,如下:


#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

    从官方代码我们可以提取出我们需要的信息:首先我们需要包含Servo库,然后建立一个Servo对象,使用的它的成员函数attach绑定引脚,这里示例的为9,也就是将我我们舵机的信号线接在9引脚上,之后我们通过它的成员函数write(int) 就可以改变它的旋转度数了.

2.识别IC卡卡号

    这个时候我我们需要将RC522连接在8266上,然后加载rc522的官方库,通过连接图如下:
rc522-8266.jpg

连好后,可通过以下代码实现卡号识别:

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         5           // 配置针脚
#define SS_PIN          4
MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
MFRC522::MIFARE_Key key;
void setup() {
  Serial.begin(9600); // 设置串口波特率为9600
  SPI.begin();        // SPI开始
  mfrc522.PCD_Init(); // Init MFRC522 card
}

void loop() {
  // 寻找新卡
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    //Serial.println("没有找到卡");
    return;
  }

  // 选择一张卡
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    Serial.println("没有卡可选");
    return;
  }

  Serial.print(F("卡片 UID:"));
  unsigned char str[5];
  memcpy(str, mfrc522.uid.uidByte, 5);
  for(int i=0;i<4;i++)
  {
     Serial.print(str[i], HEX);   
  }
  Serial.println();

  //停止 PICC
  mfrc522.PICC_HaltA();
  return;
}

组合

通过上面的例子我们已经实现了能通过Esp8266来控制舵机和识别IC卡号了,那么将它们组合起来,识别了正确的卡号之后,就旋转舵机一定的角度让他开门,否则就不开门(报警).

相关代码:

void cardOpen(){
  unsigned char str[5];
  // 寻找新卡
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    //Serial.println("没有找到卡");
    return;
  }

  // 选择一张卡
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    Serial.println("没有卡可选");
    return;
  }

  // 显示卡片的详细信息
 // dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
      memcpy(str, mfrc522.uid.uidByte, 5);
      unsigned char *id = str;
      if(id[0] == 0x3A && id[1] == 0x10 && id[2] == 0x26 && id[3] == 0x42)
      {
        safe_open();
      }
      else if(id[0] == 0x0A && id[1] == 0xEE && id[2] == 0xEE && id[3] == 0x42)
      {
       safe_open();
      }
      else if(id[0] == 0x1A && id[1] == 0x61 && id[2] == 0x22 && id[3] == 0x42)
      {
        safe_open();
      }
      else if(id[0] == 0x53 && id[1] == 0x4D && id[2] == 0xCB && id[3] == 0x40)
      {
        safe_open();
      }
           else if(id[0] == 0x3A && id[1] == 0x0C && id[2] == 0x1E && id[3] == 0x42)
      {
        safe_open();
      }
      else if(wrongDoor>=3)
      {
        for(int i=0;i<60;i++)
        {
           digitalWrite(buzzer, HIGH);
           delay(300);
           digitalWrite(buzzer, LOW);
           delay(300);
        }
       delay( 15*1000);
      }
      else
      {
        digitalWrite(buzzer, HIGH);
        delay(3000);
        digitalWrite(buzzer, LOW);
        wrongDoor++;
      }
  //停止 PICC
  mfrc522.PICC_HaltA();
  //停止加密PCD
  mfrc522.PCD_StopCrypto1();
  return;
}

11.jpg
12.jpg
13.jpg
14.jpg

之后还会再继续记录一篇远程开门的文章,可以结合APP来使用...........

Last modification:June 4, 2024
If you think my article is useful to you, please feel free to appreciate