#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实例为下次采集作准备
}