diff --git a/platformio.ini b/platformio.ini index 9e84adc..d0cf268 100644 --- a/platformio.ini +++ b/platformio.ini @@ -14,5 +14,5 @@ board = d1 framework = arduino lib_deps = adafruit/Adafruit SSD1306@^2.5.9 - miguelbalboa/MFRC522@^1.4.11 arduino-libraries/Arduino_JSON@^0.2.0 + adafruit/Adafruit PN532@^1.3.3 diff --git a/src/SmartRFID.cpp b/src/SmartRFID.cpp new file mode 100644 index 0000000..599d934 --- /dev/null +++ b/src/SmartRFID.cpp @@ -0,0 +1,60 @@ +#include "SmartRFID.hpp" + +SmartRFID::SmartRFID(Adafruit_PN532 *nfc) +{ + m_nfc = nfc; // RFID with I2C +} + +void SmartRFID::init() +{ + m_nfc->begin(); + unsigned long versiondata = m_nfc->getFirmwareVersion(); + if (!versiondata) + { + Serial.print("No board found!"); + while (1) + ; + } + Serial.println("PN5 chip found!"); +} + +String SmartRFID::readTag() +{ + m_nfc->SAMConfig(); + Serial.println("Waiting for ISO14443A chip..."); + + uint8_t success; + uint8_t uid[] = {0, 0, 0, 0, 0, 0, 0}; // buffer for UID + uint8_t uidLength; // UID length (4 or 7 bytes depending on ISO14443A Card/Chip type) + success = m_nfc->readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength); + if (success) + { + Serial.println("Found an ISO14443A card"); + Serial.print(" UID Length: "); + Serial.print(uidLength, DEC); + Serial.println(" bytes"); + Serial.print(" UID Value: "); + m_nfc->PrintHex(uid, uidLength); + Serial.println(""); + Serial.print(" compact hex code: "); + String s = string_dump_byte_array(uid, uidLength); + Serial.println(s); + return s; + } + return "error_reading_tag"; +} + +/** + * Helper routine to dump a byte array as hex values to a string. + */ +String SmartRFID::string_dump_byte_array(byte *buffer, byte bufferSize) +{ + String result = ""; + for (byte i = 0; i < bufferSize; i++) + { + result += (buffer[i] < 0x10 ? " 0" : " "); + result += String(buffer[i], HEX); + } + result.replace(" ", ""); + return result; +} \ No newline at end of file diff --git a/src/SmartRFID.hpp b/src/SmartRFID.hpp new file mode 100644 index 0000000..4e6bd94 --- /dev/null +++ b/src/SmartRFID.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +class SmartRFID +{ + +public: + SmartRFID(Adafruit_PN532 *nfc); + void init(); + String readTag(); + +private: + String string_dump_byte_array(byte *buffer, byte bufferSize); + +private: + unsigned long m_cardid; + Adafruit_PN532 *m_nfc; + +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index fb6582c..758a2fd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,21 +3,27 @@ #define WIRE Wire -#define DISPLAY_PIN 4 // D2 (SDA) -#define SERVO_PIN 0 // D3 -#define TOUCH_BTN_PIN 16 // D0 +#define SERVO_PIN 14 // D5 #define POTENTIOMETER_PIN A0 // A0 -// RFID -#define RST_PIN 2 // D4 -#define SS_PIN 15 // D8 -MFRC522 mfrc522(SS_PIN, RST_PIN); // create RFID instance -MFRC522::MIFARE_Key key; +// buttons +#define TACTILE_BTN_LEFT 0 // D3 +#define TACTILE_BTN_RIGHT 2 // D4 +#define TOUCH_BTN_PIN 16 // D0 +// RFID +#define PN532_IRQ 13 // D7 +#define PN532_RESET 12 // D6 (not connected) +Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); // RFID with I2C + +// OLED display +#define DISPLAY_PIN 4 // D2 (SDA) auto display = Adafruit_SSD1306(128, 32, &WIRE); +// util classes ContinuousServo contServo(SERVO_PIN); TeaTimer teaTimer(&contServo); +SmartRFID smartRFID(&nfc); SmartDial smartDial(POTENTIOMETER_PIN); SmartDisplay smartDisplay(&display); TeaNetworking teaNet; @@ -25,7 +31,7 @@ TeaNetworking teaNet; // networking String shuttleServer = "https://ias-tea-axum.shuttleapp.rs"; -TeaData currentTea; +TeaData currentTea("Teafault", "c0derfid", 100, 30); enum State { @@ -43,12 +49,7 @@ void setup() teaNet.init(ssid, password); - Serial.println("Initializing SPI..."); - SPI.begin(); - - Serial.println("Initializing RFID..."); - mfrc522.PCD_Init(); - mfrc522.PICC_HaltA(); + smartRFID.init(); Serial.println("Initializing OLED..."); display.begin(SSD1306_SWITCHCAPVCC, 0x3C, false); // Address 0x3C for 128x32 @@ -56,14 +57,11 @@ void setup() delay(1000); - // Prepare the key (used both as key A and key B) - for (byte i = 0; i < 6; i++) - { - key.keyByte[i] = 0xFF; - } - pinMode(LED_BUILTIN, OUTPUT); pinMode(TOUCH_BTN_PIN, INPUT); + + pinMode(TACTILE_BTN_LEFT, INPUT); + pinMode(TACTILE_BTN_RIGHT, INPUT); } int steepingSeconds = 60; @@ -95,33 +93,16 @@ void loop() case WAIT_FOR_RFID_SCAN: { smartDisplay.printWaitForRFIDScreen(); - // Look for new cards - if (!mfrc522.PICC_IsNewCardPresent()) - return; - // Select one of the cards - if (!mfrc522.PICC_ReadCardSerial()) - return; + String uid = smartRFID.readTag(); - // UID is a unique four hex pairs, e.g. E6 67 2A 12 - Serial.print("Card UID:"); - oled_dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); - serial_dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); - display.println(); + display.println(uid); display.display(); delay(1000); - Serial.println(); - Serial.print("String UID:"); - String uid = string_dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); - Serial.println(uid); - - // Halt PICC - mfrc522.PICC_HaltA(); - display.println("Success!"); display.display(); - delay(1000); + delay(500); JSONVar result = teaNet.httpsGETRequest(shuttleServer + "/teabyrfid/" + uid); Serial.print("Result:"); @@ -138,12 +119,25 @@ void loop() currentTea = TeaData(result["teaname"], result["rfidcode"], result["watertemp"], result["steepingSeconds"]); state = State::DISPLAY_SCANNED_TEA_CONFIG; + break; } case DISPLAY_SCANNED_TEA_CONFIG: { int dir = smartDial.smoothEdit(¤tTea.m_steepingSeconds, 0, 6000); - smartDisplay.printTeaConfigScreen(currentTea.m_teaName, currentTea.m_steepingSeconds, dir); + + if (digitalRead(TACTILE_BTN_LEFT) == LOW) + { + printMsg("BUTTON GREEN"); + } + else if (digitalRead(TACTILE_BTN_RIGHT) == LOW) + { + printMsg("BUTTON RED"); + } + else + { + smartDisplay.printTeaConfigScreen(currentTea.m_teaName, currentTea.m_steepingSeconds, dir); + } // change state if start pressed if (isBtnPressed()) @@ -189,43 +183,6 @@ bool isBtnPressed() return digitalRead(TOUCH_BTN_PIN) == HIGH; } -/** - * Helper routine to dump a byte array as hex values to a string. - */ -String string_dump_byte_array(byte *buffer, byte bufferSize) -{ - String result = ""; - for (byte i = 0; i < bufferSize; i++) - { - result += (buffer[i] < 0x10 ? " 0" : " "); - result += String(buffer[i], HEX); - } - result.replace(" ", ""); - return result; -} -/** - * Helper routine to dump a byte array as hex values to Serial. - */ -void serial_dump_byte_array(byte *buffer, byte bufferSize) -{ - for (byte i = 0; i < bufferSize; i++) - { - Serial.print(buffer[i] < 0x10 ? " 0" : " "); - Serial.print(buffer[i], HEX); - } -} -/** - * Helper routine to dump a byte array as hex values to OLED. - */ -void oled_dump_byte_array(byte *buffer, byte bufferSize) -{ - for (byte i = 0; i < bufferSize; i++) - { - display.print(buffer[i] < 0x10 ? " 0" : " "); - display.print(buffer[i], HEX); - } -} - void printMsg(const String &s) { display.clearDisplay(); diff --git a/src/main.hpp b/src/main.hpp index cf6213b..1eeffa7 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -1,15 +1,16 @@ #include #include -#include #include #include #include -#include +#include + #include #include #include #include "TeaTimer.hpp" +#include "SmartRFID.hpp" #include "ContinuousServo.hpp" #include "SmartDial.hpp" #include "SmartDisplay.hpp" @@ -19,8 +20,4 @@ bool toggle_led(void *); void printMsg(const String &s); void printMsg(unsigned long l); -bool isBtnPressed(); - -void serial_dump_byte_array(byte *buffer, byte bufferSize); -void oled_dump_byte_array(byte *buffer, byte bufferSize); -String string_dump_byte_array(byte *buffer, byte bufferSize); \ No newline at end of file +bool isBtnPressed(); \ No newline at end of file