From 24783454e8fb99e9902401af685b63760585fdcf Mon Sep 17 00:00:00 2001 From: Jean Jacques Avril Date: Wed, 29 Sep 2021 23:08:37 +0200 Subject: [PATCH] created Rfid class --- src/Keyboard.cpp | 104 +++++++++++++++++------------------------------ src/Keyboard.h | 4 +- src/Rfid.cpp | 50 ++++++++++++++++++++++- src/Rfid.h | 14 ++++++- src/main.cpp | 47 +++++---------------- 5 files changed, 111 insertions(+), 108 deletions(-) diff --git a/src/Keyboard.cpp b/src/Keyboard.cpp index 3b05df6..e0d114c 100644 --- a/src/Keyboard.cpp +++ b/src/Keyboard.cpp @@ -1,9 +1,24 @@ #include "Keyboard.h" + #define DEBUG #define PIN_WIRE_SDA D3 #define PIN_WIRE_SCL D4 Keyboard::Keyboard(uint8_t _debounce) { + this->keybind.insert({ + {1, '1'}, + {2, '4'}, + {3, '7'}, + {4, 'O'}, + {5, '2'}, + {6, '5'}, + {7, '8'}, + {8, '0'}, + {9, '3'}, + {10, '6'}, + {11, '9'}, + {12, 'X'}, + }); this->_debounce = _debounce; } void Keyboard::begin(TwoWire *databus) @@ -42,23 +57,7 @@ void Keyboard::scan() { pcf8574->digitalWrite(i, LOW); delay(15); - for (int j = 1; j < 5; j++) - { // Rows - key++; - uint8_t val = pcf8574->digitalRead(j); -#ifdef DEBUG - Serial.println("i=" + String(i) + " j=" + String(j) + " v=" + String(val)); - delay(500); -#endif - if (val == 0) - { - _timeElapsed = millis(); - this->_lastKey = key; - this->_buffer.push_back(mapChr(key)); - pcf8574->digitalWrite(i, HIGH); - return; - } - } + scanColumn(&key, 1, 4); pcf8574->digitalWrite(i, HIGH); } } @@ -67,63 +66,34 @@ void Keyboard::scanAsync() /** Without delay - scanning only one column per cycle **/ if (millis() < _timeElapsed + this->_debounce) return; - uint8_t key = 4*_current_scan_col; + uint8_t key = 4 * _current_scan_col; scanColumn(&key, 1, 4); - pcf8574->digitalWrite(7-(_current_scan_col+1)%3, LOW); - pcf8574->digitalWrite(7-_current_scan_col, HIGH); - _current_scan_col++; - if(_current_scan_col>2) - _current_scan_col = 0; + pcf8574->digitalWrite(7 - (_current_scan_col + 1) % 3, LOW); + pcf8574->digitalWrite(7 - _current_scan_col, HIGH); + _current_scan_col++; + if (_current_scan_col > 2) + _current_scan_col = 0; } -void Keyboard::scanColumn(uint8_t* key_ptr, uint8_t start, uint8_t stop){ +void Keyboard::scanColumn(uint8_t *key_ptr, uint8_t start, uint8_t stop) +{ for (int j = start; j <= stop; j++) - { // Rows - (*key_ptr)++; - uint8_t val = pcf8574->digitalRead(j); - if (val == 0) - { - _timeElapsed = millis(); - this->_lastKey = *key_ptr; - this->_buffer.push_back(mapChr(*key_ptr)); - Serial.print(*key_ptr); - return; - } - } + { // Rows + (*key_ptr)++; + uint8_t val = pcf8574->digitalRead(j); + if (val == 0) + { + _timeElapsed = millis(); + this->_lastKey = *key_ptr; + this->_buffer.push_back(mapChr(*key_ptr)); + Serial.print(*key_ptr); + return; + } + } } char Keyboard::mapChr(uint8_t key) { - - switch (key) - { - case 1: - return '1'; - case 2: - return '4'; - case 3: - return '7'; - case 4: - return 'O'; - case 5: - return '2'; - case 6: - return '5'; - case 7: - return '8'; - case 8: - return '0'; - case 9: - return '3'; - case 10: - return '6'; - case 11: - return '9'; - case 12: - return 'X'; - - default: - return 'F'; - } + return this->keybind[key]; } char Keyboard::getLastChr() { diff --git a/src/Keyboard.h b/src/Keyboard.h index ba4e459..12f0d96 100644 --- a/src/Keyboard.h +++ b/src/Keyboard.h @@ -2,11 +2,13 @@ #define KEYBOARD_CLASS #include "PCF8574.h" #include +#include class Keyboard { private: unsigned long _timeElapsed; std::deque _buffer; + std::map keybind; uint8_t _debounce; PCF8574* pcf8574; uint8_t _lastKey; @@ -19,7 +21,7 @@ public: void scan(); void scanAsync(); void begin(TwoWire *databus); - static char mapChr(uint8_t key); + char mapChr(uint8_t key); char getLastChr(); bool available(); void clear(); diff --git a/src/Rfid.cpp b/src/Rfid.cpp index d1aa5df..7a0d229 100644 --- a/src/Rfid.cpp +++ b/src/Rfid.cpp @@ -1,9 +1,55 @@ #include "Rfid.h" - -Rfid::Rfid(/* args */) +#define SS_PIN D8 +#define RST_PIN D1 +#define RFID_TIMEOUT 3000 +Rfid::Rfid(/* args */) : mfrc522(SS_PIN) { } Rfid::~Rfid() { } +void Rfid::begin() +{ + SPI.begin(); + SPI.setClockDivider(SPI_CLOCK_DIV8); + this->mfrc522.PCD_Init(); + this->mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); +} + +void Rfid::scan() +{ + if (this->mfrc522.PICC_IsNewCardPresent() && this->mfrc522.PICC_ReadCardSerial()) + { + this->rfid = ""; + for (byte i = 0; i < this->mfrc522.uid.size; i++) + { + this->rfid += this->mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "; + this->rfid += String(this->mfrc522.uid.uidByte[i], HEX); + } + this->rfid.trim(); + this->rfid.toUpperCase(); + if (this->rfid != this->lastRfid || millis() > this->lastRfidScan + RFID_TIMEOUT) + { + status = 1; + Serial.print(this->rfid); + this->lastRfid = this->rfid; + this->lastRfidScan = millis(); + } + } +} + +bool Rfid::available() +{ + if (this->status==1) + { + this->status = 0; + return true; + } + else + return false; +} +String Rfid::getID() +{ + return this->rfid; +} \ No newline at end of file diff --git a/src/Rfid.h b/src/Rfid.h index 5449a01..ba4efb2 100644 --- a/src/Rfid.h +++ b/src/Rfid.h @@ -1,8 +1,20 @@ +#pragma once +#include +#include class Rfid { private: - /* data */ + MFRC522 mfrc522; // Create MFRC522 instance + MFRC522::MIFARE_Key key; + int status = 0; + String rfid = ""; + String lastRfid = ""; + unsigned long lastRfidScan = 0; public: Rfid(/* args */); ~Rfid(); + void begin(); + void scan(); + bool available(); + String getID(); }; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ae7fa9f..4bb5713 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,18 +2,10 @@ #include #include #include "Keyboard.h" -#include -#include +#include "Rfid.h" -// RFID Reader -#define SS_PIN D8 -#define RST_PIN D1 -#define RFID_TIMEOUT 3000 -MFRC522 mfrc522(SS_PIN); // Create MFRC522 instance -MFRC522::MIFARE_Key key; -String rfid = ""; -String lastRfid = ""; -unsigned long lastRfidScan = 0; +// Rfid +Rfid rfid; // i2C Bus #define PIN_WIRE_SDA D3 #define PIN_WIRE_SCL D4 @@ -35,12 +27,9 @@ void setup() // LCD lcd.init(); lcd.backlight(); + rfid.begin(); + - // RFID - SPI.begin(); - SPI.setClockDivider(SPI_CLOCK_DIV8); - mfrc522.PCD_Init(); - mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); } namespace states @@ -60,26 +49,10 @@ namespace states void loop() { keyboard.scanAsync(); - - if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) - { - rfid = ""; - for (byte i = 0; i < mfrc522.uid.size; i++) - { - rfid += mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "; - rfid += String(mfrc522.uid.uidByte[i], HEX); - } - rfid.trim(); - rfid.toUpperCase(); - if (rfid != lastRfid || millis() > lastRfidScan + RFID_TIMEOUT) - { - - display_state = states::READ_RFID; - displayUpdate = true; - Serial.print(rfid); - lastRfid = rfid; - lastRfidScan = millis(); - } + rfid.scan(); + if(rfid.available()){ + display_state = states::READ_RFID; + displayUpdate = true; } if (keyboard.available()) { @@ -166,7 +139,7 @@ void loop() lcd.print("Card detected."); lcd.setCursor(0, 1); - lcd.print(rfid); + lcd.print(rfid.getID()); displayTimer1 = millis() + 3000; display_state = states::DELAY; break;