基于esp32的ic卡考勤系统

本项目介绍了一个基于ESP32的RFID签到系统,该系统通过读取RFID卡来记录员工的签到信息,并将这些信息上传到MySQL数据库。系统还集成了Wi-Fi模块以连接互联网,通过HTTP请求获取当前时间,并使用U8g2库在OLED显示屏上显示签到状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <U8g2lib.h>
#include <U8x8lib.h>
#include<WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <SPI.h>
#include <MFRC522.h>

#include <MySQL_Connection.h>    // Arduino连接Mysql的库
#include <MySQL_Cursor.h>


IPAddress server_addr(192,168,160,5);   // 安装Mysql的电脑的IP地址
char user[] = "root";              // Mysql的用户名
char password[] = "root";        // 登陆Mysql的密码

// Mysql中添加一条数据的命令
// esp32.esp32tx:创建的数据和表
char INSERT_SQL[] = "INSERT INTO  esp32.esp32tx(uid,time) VALUES ('%d','%s');";

//rc522管脚定义
#define SS_PIN 21
#define RST_PIN 22
#define SIZE_BUFFER 18
#define MAX_SIZE_BLOCK 16
MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
MFRC522::MIFARE_Key key;
//led显示管脚定义
#define SCL  25  //D3 GPIO0连接SCL
#define SDA  26  //D2 GPIO4连接SDA
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

int num=0;//用于记录签到次数
int id[]={1,1,1,1};
int s_id1[]={147,252,126,23};//已经记录的ic卡的uid
String today_1=" ";//存放时间
WiFiMulti wifiMulti;

char ssid[] = "wyt";         // WiFi名
char pass[] = "qwerasd123";     // WiFi密码

WiFiClient client;                 // 声明一个Mysql客户端,在lianjieMysql中使用
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;    
void setup() {
  //串口监视器
  Serial.begin(115200); // 设置串口波特率为115200
  //rc522
  SPI.begin();        // SPI开始
  mfrc522.PCD_Init(); // Init MFRC522 card
  Serial.println("test-demo-start");
  
  u8g2.begin();

  wifiMulti.addAP(ssid, pass);//连接网络

//连接数据库
Serial.printf("\nConnecting to %s", ssid);
  WiFi.begin(ssid, pass);         // 连接WiFi
  while (WiFi.status() != WL_CONNECTED) {       // 如果WiFi没有连接,一直循环打印点
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nConnected to network");
  Serial.print("My IP address is: ");
  Serial.println(WiFi.localIP());     // 打印开发板的IP地址

  Serial.print("Connecting to SQL...  ");
  if (conn.connect(server_addr, 3306, user, password))         // 连接数据库
    Serial.println("OK.");   
  else
    Serial.println("FAILED.");
  cursor = new MySQL_Cursor(&conn);    // 创建一个数据库游标实例
}


void loop() {
  
  // 寻找新卡
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    //Serial.println("没有找到卡");
    return;
  }

  // 选择一张卡
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    Serial.println("没有卡可选");
    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;
//  }

  MFRC522::StatusCode status;
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("身份验证失败?或者是卡链接失败"));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  
  //停止 PICC
  mfrc522.PICC_HaltA();
  //停止加密PCD
  mfrc522.PCD_StopCrypto1();
  return;
}


/**
   将字节数组转储为串行的十六进制值
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
   if((wifiMulti.run() == WL_CONNECTED)) {
    HTTPClient http; //创建HTTPClient实例
  
    //发送HTTP请求,一个方法调用就可以实现
    http.begin("http://quan.suning.com/getSysTime.do"); 
    int httpCode = http.GET(); //获取HTTP响应码,正常应当得到:200
    if(httpCode > 0) {
       Serial.printf("[HTTP] GET... code: %d\n", httpCode);
      if(httpCode == HTTP_CODE_OK) {
        String payload = http.getString();       
        Serial.println(payload);
      String today = payload.substring(payload.indexOf("\"sysTime2\"")+12, payload.indexOf("sysTime1")-3);
      Serial.println(today);
      today_1=today;
      }
    }
  }
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
    id[i]=buffer[i];
    
  }
   Serial.println();

    if(id[3]==s_id1[3])
    {
      readAndRecordData();//写入数据库
    }
   for (byte i = 0; i < bufferSize; i++) {
   
    Serial.print(id[i]);
    Serial.print(" ");
    
    if(id[i]==s_id1[i])
    {
      
        num+=1;
        u8g2.clearBuffer(); 
        u8g2.setFont(u8g2_font_ncenB08_tr); 
        u8g2.setCursor(0,16);
        u8g2.printf("id:");
        for (byte i = 0; i <bufferSize ; i++) 
        u8g2.print(id[i]);
        
        u8g2.setCursor(0,32);
        u8g2.printf("num:");
        u8g2.print(num/4);
        u8g2.setCursor(0,48);
        u8g2.printf("Credit   card   success");
        u8g2.setCursor(0,64);
        u8g2.print(today_1);
        
        u8g2.sendBuffer();    
        delay(2); 
      }
    else
    {
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_ncenB08_tr); 
      u8g2.setCursor(0,16);
      u8g2.printf("illegal   card ");
      u8g2.setCursor(0,64);
      u8g2.print(today_1);
      u8g2.sendBuffer();    
      delay(2); 
      }
      
      delay(2000);
    }
}

void readAndRecordData(){
          Serial.print(today_1);        // 在串口中打印读取到的温度
          Serial.print(",\t"); 
          for (byte i = 0; i < 4; i++) 
          Serial.print(id[i]);
                  char buff[128];   // 定义存储传感器数据的数组
                  char m[today_1.length()+1];
                 
                  today_1.toCharArray(m, today_1.length() + 1);
                  Serial.print(m);
                
                  sprintf(buff,INSERT_SQL,id,m);                
                  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);         // 创建一个Mysql实例
                  cur_mem->execute(buff);         // 将采集到的温湿度值插入数据库中
                  Serial.println("读取数据,并写入数据库");
                  delete cur_mem;        // 删除mysql实例为下次采集作准备
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值