十二月八日。
使用了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中并保存。