2021年2月23日

arduino玩耍之路

作者 admin

采用倒叙写。先来炫耀炫耀成果,一个智能门禁。

下面慢慢讲来

见识了某个神童(真的是个童,但很nb!???)小学弟的寝室智能门禁改装(据说用的树莓派的板子),我也大显身手,找了块arduino uno板来玩。

手头有两种板。一种是意大利原装,图1(挺贵,但略好一点点点,能感觉到差别,后面有说);另一块版,其他厂家的,哈哈,挺便宜,图2。

开始操作!

下载Arduino IDE。巴拉巴拉很快装好乐。插上图1板。直接识别出来啦。

nice!

换上图2板,端口变成灰色的了,不能选。。。设备管理器一看,没认出来这玩意,好家伙。还要装个驱动。找了这家的驱动装上,好乐!

多麻烦一步,还是原板好~

当然,只要装着一次以后就不用了,似乎这不是不选图2的理由;但还有reason。图2板不太稳,具体表现在使用蜂鸣器的时候没让他响的时候也有点刺啦刺啦的杂音。不过价格放着呢,也挺好~

至于代码,在别人代码上改的。加上了蜂鸣器,刷卡的时候响一下。

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define pinBuzzer  7
#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN); //实例化类
Servo myservo; //实例化舵机

// 初始化数组用于存储读取到的NUID
byte nuidPICC[4];

void setup() {
  Serial.begin(9600);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522
  myservo.attach(3); //初始化舵机,设定为9号引脚
  pinMode(pinBuzzer, OUTPUT); //设置pinBuzzer脚为输出状态
}

void loop() {
  // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // 验证NUID是否可读
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  // 检查是否MIFARE卡类型
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
      piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
      piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("不支持读取此卡类型");
    return;
  }

  // 将NUID保存到nuidPICC数组
  for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
  }
  Serial.print("十六进制UID:");
  printHex(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();

  Serial.print("十进制UID:");
  printDec(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();

  // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  rfid.PICC_HaltA();

  // 停止读卡模块编码
  rfid.PCD_StopCrypto1();
  if (nuidPICC[0] == 0xDA && nuidPICC[1] == 0x48 && nuidPICC[2] == 0x8C && nuidPICC[3] == 0x16)
  {
    Serial.print("身份确认,解锁成功");
    long frequency = 350; //频率, 单位Hz

    //用tone()函数发出频率为frequency的波形

    tone(pinBuzzer, frequency );
    delay(100); //等待1000毫秒
    frequency = 400; //频率, 单位Hz
    tone(pinBuzzer, frequency );
    delay(100); //等待1000毫秒
    frequency = 450; //频率, 单位Hzdelay(100); //等待1000毫秒
    tone(pinBuzzer, frequency );
    frequency = 500; //频率, 单位Hz

    noTone(pinBuzzer);//停止发声

    myservo.write(0);
    delay(1000);

    myservo.write(90);
    delay(1000);
  }
  else Serial.print("非系统用户,无法解锁");
}