Arduino UNO
RC522 NFC晶片模組
按鈕X3
OLED顯示器
杜邦縣(數條)
//oled
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);
//RC522
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
#define ACCESS_DELAY 2000
#define DENIED_DELAY 1000
MFRC522 mfrc522(SS_PIN, RST_PIN);
int presstime=0;//計數器變數
int B=7 ;//設定按鈕的腳位
int buttonState=0;//校正按鈕的變數 表示按下前
int beforeState=0;//校正按鈕的變數 表示按下後
int B2=6;
int State=0;
int Before=0;
int B3=5;
int State3=0;
int Before3=0;
//卡片金額
int point=0;
int point2=0;
void setup() {
Serial.begin(9600);
//OLED起始介面
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
display.clearDisplay(); //OLED 開頭指令
display.setTextSize(1); //字體大小
display.setTextColor(WHITE); //顏色
display.setCursor(40,0); //空格
display.println("NDHU PHY"); //輸出文字
display.setCursor(0,10);
display.setTextSize(1);
display.println("Thomas table test!");
display.display(); //OLED結尾指令
delay(3000);
display.clearDisplay();
SPI.begin();
mfrc522.PCD_Init();
pinMode(B,INPUT_PULLUP);//設定腳位為輸入訊號端端 訊號不穩定時加入一個上拉電阻
pinMode(B2,INPUT_PULLUP);
pinMode(B3,INPUT_PULLUP);
}
void loop() {
/*----------------------------------------------------------*/
buttonState=digitalRead(B);//按下按鈕後的變數連接按鈕
if (buttonState==0&&beforeState==1){ //按下按鈕會發生的事 如果按下前訊號為零&&按下後訊號為一(校正按鈕物理訊號錯誤)
presstime=presstime+1; //變數++
Serial.println(presstime);
}
if(buttonState!=beforeState){ //Debonce ..
delay(20);
}
beforeState=buttonState; //還原
delay(1);
/* ---------------------------------------------------------*/
State=digitalRead(B2);//按下按鈕後的變數連接按鈕
if (State==0&&Before==1){ //按下按鈕會發生的事 如果按下前訊號為零&&按下後訊號為一(校正按鈕物理訊號錯誤)
presstime=presstime-1; //變數--
Serial.println(presstime);
}
if(State!=Before){ //Debonce...
delay(20);
}
Before=State; //還原
delay(1);
/* ---------------------------------------------------------*/
State3=digitalRead(B3);//按下按鈕後的變數連接按鈕
if (State3==0&&Before3==1){ //按下按鈕會發生的事 如果按下前訊號為零&&按下後訊號為一(校正按鈕物理訊號錯誤)
presstime=0 ; //變數=0
Serial.println(presstime);
}
if(State3!=Before3){ //Debonce ...
delay(20);
}
Before3=State3; //還原
delay(1);
display.clearDisplay(); //OLED 開頭指令
display.setTextSize(1); //字體大小
display.setTextColor(WHITE); //顏色
display.setCursor(20,0); //空格
display.println("ADD press point"); //輸出文字
display.setCursor(50,10);
display.setTextSize(2);
display.println(presstime);
display.display(); //OLED結尾指令
display.clearDisplay();
/*======================================分隔線============================================*/
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Show UID on serial monitor
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "73 4B DB 02") //找到設定的卡片(設定UID)
{ //在下面放入動作
Serial.println("卡片73");
point2=point2+presstime;
Serial.print("卡片2點數為:");
Serial.println(point2);
presstime=0;
display.clearDisplay(); //OLED 開頭指令
display.setTextSize(1); //字體大小
display.setTextColor(WHITE); //顏色
display.setCursor(35,0); //空格
display.println("CARD 2 POINT:"); //輸出文字
display.setCursor(50,10);
display.setTextSize(2);
display.println(point2);
display.display(); //OLED結尾指令
display.clearDisplay();
delay(2000);
}
else if (content.substring(1) == "7A 30 6E 7F") //找到設定的卡片(設定UID)
{ //在下面放入動作
Serial.println("卡片7A ");
point=point+presstime;
Serial.print("卡片點數為:");
Serial.println(point);
presstime=0;
display.clearDisplay(); //OLED 開頭指令
display.setTextSize(1); //字體大小
display.setTextColor(WHITE); //顏色
display.setCursor(35,0); //空格
display.println("CARD AC POINT:"); //輸出文字
display.setCursor(50,10);
display.setTextSize(2);
display.println(point);
display.display(); //OLED結尾指令
display.clearDisplay();
delay(2000);
}
else {
Serial.println(" Access denied");//如果找不到設定的卡片
delay(DENIED_DELAY);
}
}