智慧餐厅
1.1.1RFID自动饮水机
/* RFID接线说明
Arduino Uno <—> RFID-RC522
10 <—> SDA
13 <—> SCK
11 <—> MOSI
12 <—> MISO
null <—> IRQ
GND <—> GND
9 <—> RST
3.3V <—> 3.3V
*/
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // 配置针脚
#define SS_PIN 10
#define motor_A 2 //电机
#define motor_B 3 //电机
#define led_red 4 //红灯
#define led_green 5 //绿灯
#define buzzer 6 //蜂鸣器
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建新的RFID实例
MFRC522::MIFARE_Key key;
int limit_ONOFF_NUM = 0; //存放限位开关信号,将信号保存下来
char inByte = 0; //存放串口数据
void setup() {
Serial.begin(9600); // 设置串口波特率为9600
pinMode(motor_A,OUTPUT);
pinMode(motor_B,OUTPUT);
pinMode(led_red,OUTPUT);
pinMode(led_green,OUTPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(motor_A,LOW);
digitalWrite(motor_B,LOW);
digitalWrite(led_red,HIGH);
digitalWrite(led_green,LOW);
digitalWrite(buzzer,LOW);
while (!Serial); // 如果串口没有打开,则死循环下去不进行下面的操作
SPI.begin(); // SPI开始
mfrc522.PCD_Init(); // Init MFRC522 card
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
//Serial.println(F("扫描卡开始进行读或者写"));
//Serial.print(F("使用A和B作为键"));
//dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
//Serial.println();
Serial.println(F("开始读卡"));
}
void loop() {
// 寻找新卡
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// 选择一张卡
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// 显示卡片的详细信息
// Serial.print(F("卡片 UID:"));
// dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
// Serial.println();
// Serial.print(F("卡片类型: "));
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
// Serial.println(mfrc522.PICC_GetTypeName(piccType));
// 检查兼容性
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("仅仅适合Mifare Classic卡的读写"));
return;
}
// 我们只使用第二个扇区
// IC卡中的扇区4
byte sector = 1;
byte blockAddr = 4;
byte dataBlock[] = {
0x6B, 0x69, 0x74, 0x63, // 6B 69 74 63
0x68, 0x65, 0x6E, 0x5F, // 68 65 6E 5F
0x77, 0x72, 0x69, 0x74, // 77 72 69 74
0x65, 0x00, 0x01, 0x00 // 65 00 01 00
};//定义数据IC卡 作为数据对比使用
byte trailerBlock = 7;
MFRC522::StatusCode status;
byte buffer[18];
byte size = sizeof(buffer);
// 原来的数据
//Serial.println(F("显示原本的数据..."));
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("身份验证失败?或者是卡链接失败"));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// 显示整个扇区
// Serial.println(F("显示所有扇区的数据"));
// mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);// 显示整个扇区函数
// Serial.println();
// 从块儿读取数据
//Serial.print(F("读取块儿的数据在:")); Serial.print(blockAddr);
//Serial.println(F("块 ..."));
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("读卡失败,没有连接上 "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
//Serial.print(F("数据内容在第 ")); Serial.print(blockAddr); Serial.println(F(" 块:"));
// dump_byte_array(buffer, 16); // 块儿读取数据值并打印端口
// Serial.println();
// Serial.println();
// 停止 PICC 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
mfrc522.PICC_HaltA();
//停止加密PCD 停止读卡模块编码
mfrc522.PCD_StopCrypto1();
// 验证数据,保证前后数据是相等
// 通过计算块中的字节数量
//Serial.println(F("等待验证结果..."));
byte count = 0;
for (byte i = 0; i < 16; i++) {
// 比较一下缓存中的数据(我们读出来的数据) = (我们写的数据)
if (buffer[i] == dataBlock[i])
//Serial.println(F("验证成功 :"));
count++;
}
//Serial.print(F("匹配的字节数量 = ")); Serial.println(count);
if (count == 16) {
Serial.println(F("A"));//数据验证成功,数据匹配
delay(1000);
water();
} else {
Serial.println(F("Z"));//数据验证失败,数据不匹配
}
}
/*========================================================*/
/**
* 将字节数组转储为串行的十六进制值
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
void water()//放水
{
digitalWrite(motor_A, HIGH); //初始化引脚为高电平
digitalWrite(led_red,LOW);
digitalWrite(led_green,HIGH);
delay(5000);
digitalWrite(motor_A, LOW);
digitalWrite(led_red,HIGH);
digitalWrite(led_green,LOW);
digitalWrite(buzzer,HIGH);
delay(200);
digitalWrite(buzzer,LOW);
delay(200);
digitalWrite(buzzer,HIGH);
delay(200);
digitalWrite(buzzer,LOW);
Serial.println(F("wrter_OK"));
}
1.2.1客位后厨通知