概况
经过了几个星期的不懈努力,终于将寝室的门改造完毕了,目前能通过手机app或者是刷IC卡(校园卡,银行卡,手机NFC模拟,手环NFC模拟)来开门(当然最直接的钥匙开门还是能用).下面做个简单记录:
使用场景:
- 出门经常忘记带钥匙,但是手机,手环,或者校园卡总是在身上的
- 全寝的人都在床上的时候有人来敲门,不想下来开门,通过APP控制直接开门
开发环境:
- IDE: Arduino IDE 1.8.10
- 电脑系统: Win10 1903
使用到的器材:
- ESP8266开发板
- MG996R 舵机
- RC522 模块
- 杜邦线若干
- 电烙铁(如果是焊好的可以不用)
- 面包板(可用可不用)
- 长的数据线(看自己需求,及如何布置)
- 钢丝绳
- 5V电源*2(因为舵机需要单独的5V供电)
- 定制的亚克力外壳
- 热熔胶
正式开始
演示:
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的官方库,通过连接图如下:
连好后,可通过以下代码实现卡号识别:
#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;
}
之后还会再继续记录一篇远程开门的文章,可以结合APP来使用...........
One comment
大佬能不能发个视频详细介绍下呀,线材的链接什么的,我是个非专业的,也想弄一下这套东西。买了舵机和 esp8266,装的micropython,但连线引脚什么的都不懂,非常感谢