智慧餐厅

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客位后厨通知

https://www.lanzous.com/i7earud

posted @ 2020-06-06 21:29  icloudelectron  阅读(316)  评论(0编辑  收藏  举报