RC522接线图
#include <EEPROM.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT//小爱同学,灯
#include <Blinker.h>
char auth[] = "秘钥";
char ssid[] = "WIFI_name";
char pswd[] = "password";
// 新建组件对象,名称与APP中一致
BlinkerButton Button1("opendoor");
#define RST_PIN 5 // 配置针脚
#define SS_PIN 4
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建新的RFID实例
Servo Servol;//电机
int open_angle = 90;
int rst_angle = 45;
//使用union结构,合并4个byte数据,转换为1个long
union long_byte{ long long_data; byte byte_data[4];};
long_byte lb;
//保存的RFID信息
long password[] = {111111111,-100000001};
//根据需求自己添加or改写
int len = sizeof(password)/sizeof(password[0]);
long read_RFID = -1; //储存读取到的RFID
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
//初始化串口
Serial.begin(9600);
//BLINKER_DEBUG.stream(Serial);
//BLINKER_DEBUG.debugAll(); //串口返回各种信息
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Servol.attach(D0);//舵机接口
Servol.write(rst_angle);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);
BlinkerMIOT.attachPowerState(miotPowerState);//小爱同学 //attach注册回调函数
bool result = Blinker.connected();//设备连接状态
if(!result){
Serial.println("");
Serial.println("设备已连接");
};
}
void loop() {
RFID_read();
Blinker.run();
}
//运行读卡
void RFID_read()
{
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial())
{
//Serial.println("未读取到卡片");
return;
}
else
{
read_RFID = RFID_toLong(mfrc522.uid.uidByte);
mfrc522.PICC_HaltA();//停止 PICC
mfrc522.PCD_StopCrypto1(); //停止加密PCD
/*
这两行代码是使用MFRC522库来操作RFID读写器的功能。
第一行用来停止与RFID卡片的通信,而第二行用来停止PCD(Proximity Coupling Device)的加密功能。
这样可以在安全和准备好进行下一次通信之前清除加密状态。
*/
Serial.println("读取到卡片,编码为:");
Serial.println(read_RFID); //输出读到的码,可以将输出码自行添加到password
int pass = 0;//失败标志
//遍历password,查询是否有读到的码
for(int i=0;i<len;i++){
digitalWrite(LED_BUILTIN, LOW);
delay(75);
digitalWrite(LED_BUILTIN, HIGH);
delay(75); //正在识别,指示灯闪烁
digitalWrite(LED_BUILTIN, LOW);
delay(75);
digitalWrite(LED_BUILTIN, HIGH);
delay(75); //正在识别,指示灯闪烁
if(read_RFID==password[i]){
opendoor();
delay(1000);
pass = 1;//身份认证成功
break;//跳出循环
}
}
if(!pass){Serial.println("身份认证失败");} //读到的码不在password
read_RFID = -1;//清空变量
return;
}
}
//开门程序
void opendoor(){
Servol.write(open_angle);
Serial.println("身份识别通过,已开门");
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, HIGH);
Servol.write(rst_angle);
}
//读码转换程序
long RFID_toLong(byte *by)
{
long data;
for (int i = 0; i < 4; i++)
{
lb.byte_data[i] = by[i];
}
data = lb.long_data;
return data;
}
// 按下APP按键即会执行该函数
void button1_callback(const String & state)
{
//BLINKER_LOG("get button state: ", state);
//digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Serial.println("APP远程控制中……");
opendoor();
}
//小爱同学
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) { //收到开的指令
digitalWrite(LED_BUILTIN, LOW);
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
Serial.println("小爱同学语言控制中……");
opendoor();
}
else if (state == BLINKER_CMD_OFF) { //收到关的指令
digitalWrite(LED_BUILTIN, HIGH);
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
}
}
Blinker APP
组件名称设置为opendoor,与代码一致
如果要使用小爱同学,需在米家APP中进行绑定
打开米家APP,我的->连接其他平台->点灯科技->登录->同步设备
代码里使用的是灯的控制组件,所以要对小爱同学说开灯
如果不是灯是其他东西
可以在小爱同学APP->训练计划->个人训练
添加关键词,并绑定操作,我这里是“开门”