ARDUINO.

十二月八日。

使用了arduinoIDE。

一个关于打卡器的尝试。

使用到了arduino开发板、ds1302时间模块、MFRC522模块。

贴上代码:

#include <DS1302.h>
#include <EEPROM.h>
#include <SPI.h>
#include <MFRC522.h>

void printHex(byte *buffer, byte bufferSize);
#define SS_PIN 10
#define RST_PIN 9

 
byte nuidPICC[4];
int address = 0;


  ///
DS1302 rtc(2, 3, 4); //对应DS1302的RST,DAT,CLK

void initRTCTime(void)//初始化RTC时钟
{
  rtc.writeProtect(false); //关闭写保护
  rtc.halt(false); //清除时钟停止标志
  Time t(2020, 4, 25, 21, 50, 50, 7); //新建时间对象 最后参数位星期数据,周日为1,周一为2以此类推
  rtc.time(t);//向DS1302设置时间数据
}

void saveTime()//打印时间数据
{
  Time tim = rtc.time(); //从DS1302获取时间数据
  char buf[12];
  snprintf(buf, sizeof(buf), "%02d-%02d %02d:%02d",
           tim.mon, tim.date, tim.hr, tim.min);

  Serial.println(buf);
  
  
 // for(int i = 0;i <= 11; i++)
 // {
      EEPROM.write(address,tim.mon);
      EEPROM.write(address+2,tim.date);
      EEPROM.write(address+4,tim.hr);
      EEPROM.write(address+6,tim.min);
 // }
  address+=7;
}
  ///
 
MFRC522 rfid(SS_PIN, RST_PIN);    //创建MFRC522实例
MFRC522::MIFARE_Key key; 


//byte t[3]={6,0,0};


void setup() { 
  Serial.begin(9600);
  SPI.begin();            //初始化 SPI 总线
  rfid.PCD_Init();        //初始化 MFRC522 卡
 
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
 
}

//initRTCTime(void);


void loop() {
//
//      delay(1000);
//    t[2]++;
//    if(t[2]==60){
//      t[1]++;
//      t[2]=0;
//    }
//    if(t[1]==60){
//      t[0]++;
//      t[1]=0;
//    }
//    if(t[0]==24){
//      t[0]=0;
//    }
//
/// 
  if(!rfid.PICC_IsNewCardPresent())
    return;
 
 
  if(!rfid.PICC_ReadCardSerial())
    return;
    
  saveTime();//打印时间
 
    for (byte i = 0; i < 4; i++) {
      nuidPICC[i] = rfid.uid.uidByte[i];
    }
   
    Serial.print(F("Hex1:"));
    printHex(rfid.uid.uidByte, rfid.uid.size);//函数调用(buffer[i],bufferSize)
    Serial.println();
 
  //暂停PICC
  rfid.PICC_HaltA();
  //暂停PCD上的加密
  rfid.PCD_StopCrypto1();

///
    for (byte i = 0; i < 4; i++)
    {
      EEPROM.write(address, rfid.uid.uidByte[i]);

     
      address = address + 1;
      if (address == EEPROM.length()) 
      {
        while(Serial){}//等待
      }
    }
 // int asdfghjkl = printTime();
//      for(byte j = 0; j <= 2; j++)
//      {
//          EEPROM.write(address,asdfghjkl);
//      
//     
//        address = address + 1;
//        if (address == EEPROM.length()) 
//        {
//          while(Serial){}//等待
//        }
//      }

///    
}
 
 
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? "0" : "");
    Serial.print(buffer[i], HEX);
  }
  Serial.print("#");
}

在把代码烧录到板子里面后,只要我们刷卡,就可以读取到卡片的uid并将刷卡时的时间一同写入到EEPROM中,再辅以EEPROM.read程序读取数据,通过arduinoIDE的串口监视器即可获得数据,复制数据到excel中即可进行数据分析。

EEPROM.read:

/*
 * EEPROM Read
 *
 * Reads the value of each byte of the EEPROM and prints it
 * to the computer.
 * This example code is in the public domain.
 */

#include <EEPROM.h>

// start reading from the first byte (address 0) of the EEPROM
int address = 0;
byte value;

void setup() {
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
}

void loop() {
  // read a byte from the current address of the EEPROM
  value = EEPROM.read(address);

  Serial.print(value, DEC);

  /***
    Advance to the next address, when at the end restart at the beginning.

    Larger AVR processors have larger EEPROM sizes, E.g:
    - Arduno Duemilanove: 512b EEPROM storage.
    - Arduino Uno:        1kb EEPROM storage.
    - Arduino Mega:       4kb EEPROM storage.

    Rather than hard-coding the length, you should use the pre-provided length function.
    This will make your code portable to all AVR processors.
  ***/
  address = address + 1;
  if((address % 11) % 7 == 0 )//11-4=7
  {
    Serial.println();
   
  }
  if(address % 11 == 0 )//11-4=7
  {
    Serial.println();
    
  }
  if (address == EEPROM.length()) {
    address = 0;
  }

  /***
    As the EEPROM sizes are powers of two, wrapping (preventing overflow) of an
    EEPROM address is also doable by a bitwise and of the length - 1.

    ++address &= EEPROM.length() - 1;
  ***/

  delay(10);
}

在这里呈现的效果是时间一行,uid一行,再一行空白。由此区分开每个人每次打卡记录。

下面附实物图:

关于两个模块(RC522与DS1302)与arduino的连接方式: 

 关于两个模块的学习与代码使用,参考了两位大佬的教程:

(24条消息) Arduino单片机(三).Arduino UNO系列的简单项目_胡启智的博客-CSDN博客_arduino uno单片机

(24条消息) Arduino提高篇22—实时时钟DS1302_Tonyの博客-CSDN博客_arduino时钟模块ds1302

然后是实际使用过程:

1.首先要清空arduino板子中EEPROM内的数据并重置为0。

使用arduinoIDE中的示例:

 

 

2.烧录进时间与读卡器程序代码。(见文章开头)

然后就可以进行读卡与数据写入于EEPROM。

 

3.烧录进EEPROM的读取代码。(见文章开头)

通过串口监视器查看数据内容并使用复制(Ctrl+C)将数据复制到excel中并保存。

 

猜你喜欢

转载自blog.csdn.net/qq_62356331/article/details/121798412
今日推荐