mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-29 05:36:39 +00:00
Prep RC522 rfid reader pt3
This commit is contained in:
parent
62b64c749b
commit
519a028477
376
lib/lib_div/rfid-1.4.7/README.rst
Normal file
376
lib/lib_div/rfid-1.4.7/README.rst
Normal file
@ -0,0 +1,376 @@
|
||||
MFRC522
|
||||
=======
|
||||
|
||||
.. image:: https://img.shields.io/maintenance/no/2019.svg
|
||||
:target: `development`_
|
||||
.. image:: https://travis-ci.org/miguelbalboa/rfid.svg?branch=master
|
||||
:target: https://travis-ci.org/miguelbalboa/rfid
|
||||
.. image:: https://img.shields.io/badge/C%2B%2B-11-brightgreen.svg
|
||||
:target: `compatible ide`_
|
||||
.. image:: https://img.shields.io/github/release/miguelbalboa/rfid.svg?colorB=green
|
||||
:target: https://github.com/miguelbalboa/rfid/releases
|
||||
.. image:: https://img.shields.io/badge/ArduinoIDE-%3E%3D1.6.10-lightgrey.svg
|
||||
:target: `compatible ide`_
|
||||
|
||||
Arduino library for MFRC522 and other RFID RC522 based modules.
|
||||
|
||||
Read and write different types of Radio-Frequency IDentification (RFID) cards
|
||||
on your Arduino using a RC522 based reader connected via the Serial Peripheral
|
||||
Interface (SPI) interface.
|
||||
|
||||
|
||||
.. _development:
|
||||
Development
|
||||
----------
|
||||
|
||||
**The development by owner miguelbalboa has ended**.
|
||||
|
||||
**Feature status: complete freeze**; no function or API change.
|
||||
|
||||
**Code status: partial freeze**; just fixes/typos or documentation updates; *no* extensions for other boards; *no* new examples.
|
||||
|
||||
**Maintenance status: sporadically**.
|
||||
|
||||
**Why no further development?**
|
||||
This library has a long history and is used in many projects. These projects often do not document what version they use. Committing changes might break those old projects and lead to bad experiences (for beginners) and support requests. For these reasons the library is in freeze mode. You can still commit typo, documentation or bug fixes.
|
||||
|
||||
|
||||
.. _before buy:
|
||||
Before buy
|
||||
----------
|
||||
Please notice that there are many sellers (ebay, aliexpress, ..) who sell mfrc522 boards. **The quality of these boards are extremely different.** Some are soldered with wrong/low quality capacitors or fake/defect mfrc522.
|
||||
|
||||
**Please consider buying several devices from different suppliers.** So the chance of getting a working device is higher.
|
||||
|
||||
If you got a bad board and you can tell us how to detect those boards (silk, chip description, ..), please share your knowledge.
|
||||
|
||||
|
||||
.. _what works and not:
|
||||
What works and not?
|
||||
----------
|
||||
|
||||
* **Works**
|
||||
|
||||
#. Communication (Crypto1) with MIFARE Classic (1k, 4k, Mini).
|
||||
#. Communication (Crypto1) with MIFARE Classic compatible PICCs.
|
||||
#. Firmware self check of MFRC522.
|
||||
#. Set the UID, write to sector 0, and unbrick Chinese UID changeable MIFARE cards.
|
||||
#. Manage the SPI chip select pin (aka SS, SDA)
|
||||
|
||||
* **Works partially**
|
||||
|
||||
#. Communication with MIFARE Ultralight.
|
||||
#. Other PICCs (Ntag216).
|
||||
#. More than 2 modules, require a multiplexer `#191 <https://github.com/miguelbalboa/rfid/issues/191#issuecomment-242631153>`_.
|
||||
|
||||
* **Doesn't work**
|
||||
|
||||
#. MIFARE DESFire, MIFARE DESFire EV1/EV2, not supported by software.
|
||||
#. Communication with 3DES or AES, not supported by software.
|
||||
#. Peer-to-peer (ISO/IEC 18092), not `supported by hardware`_.
|
||||
#. Communication with smart phone, not `supported by hardware`_.
|
||||
#. Card emulation, not `supported by hardware`_.
|
||||
#. Use of IRQ pin. But there is a proof-of-concept example.
|
||||
#. With Intel Galileo (Gen2) see `#310 <https://github.com/miguelbalboa/rfid/issues/310>`__, not supported by software.
|
||||
#. Power reduction modes `#269 <https://github.com/miguelbalboa/rfid/issues/269>`_, not supported by software.
|
||||
#. I2C instead of SPI `#240 <https://github.com/miguelbalboa/rfid/issues/240>`_, not supported by software.
|
||||
#. UART instead of SPI `#281 <https://github.com/miguelbalboa/rfid/issues/281>`_, not supported by software.
|
||||
|
||||
* **Need more?**
|
||||
|
||||
#. If software: code it and make a pull request.
|
||||
#. If hardware: buy a more expensive like PN532 (supports NFC and many more, but costs about $15 and not usable with this library).
|
||||
|
||||
|
||||
.. _compatible ide:
|
||||
Compatible IDE
|
||||
----------
|
||||
This library works with Arduino IDE 1.6, older versions are **not supported** and will cause compiler errors. The built-in library manager is supported.
|
||||
|
||||
If you use your own compiler, you have to enable ``c++11``-support.
|
||||
|
||||
|
||||
.. _compatible boards:
|
||||
Compatible boards
|
||||
----------
|
||||
|
||||
**!!!Only for advanced users!!!**
|
||||
|
||||
This library is compatible with the Teensy and ESP8266 if you use the board plugin of the Arduino IDE. Not all examples are available for every board. You also have to change pins. See `pin layout`_.
|
||||
|
||||
Some user made some patches/suggestions/ports for other boards:
|
||||
|
||||
* Linux: https://github.com/miguelbalboa/rfid/pull/216
|
||||
* chipKIT: https://github.com/miguelbalboa/rfid/pull/230
|
||||
* ESP8266 (native): https://github.com/miguelbalboa/rfid/pull/235
|
||||
* LPCOPen (in C): https://github.com/miguelbalboa/rfid/pull/258
|
||||
|
||||
Note that the main target/support of library is still Arduino.
|
||||
|
||||
.. _support issue:
|
||||
Support/issue
|
||||
----------
|
||||
1. First checkout `what works and not`_ and `troubleshooting`_ .
|
||||
|
||||
2. It seems to be a hardware issue or you need support to program your project?
|
||||
Please ask in the official `Arduino forum`_, where you would get a much faster answer than on Github.
|
||||
|
||||
3. It seems to be a software issue?
|
||||
Open an issue on Github.
|
||||
|
||||
|
||||
.. _code style:
|
||||
Code style
|
||||
----------
|
||||
|
||||
Please use ``fixed integers``, see `stdint.h`_. Why? This library is compatible with different boards which use different architectures (16bit and 32bit.) Unfixed ``int`` variables have different sizes in different environments and may cause unpredictable behaviour.
|
||||
|
||||
|
||||
.. _pin layout:
|
||||
Pin Layout
|
||||
----------
|
||||
|
||||
The following table shows the typical pin layout used:
|
||||
|
||||
+-----------+----------+---------------------------------------------------------------+--------------------------+
|
||||
| | PCD | Arduino | Teensy |
|
||||
| +----------+-------------+---------+---------+-----------------+-----------+--------+--------+--------+
|
||||
| | MFRC522 | Uno / 101 | Mega | Nano v3 |Leonardo / Micro | Pro Micro | 2.0 | ++ 2.0 | 3.1 |
|
||||
+-----------+----------+-------------+---------+---------+-----------------+-----------+--------+--------+--------+
|
||||
| Signal | Pin | Pin | Pin | Pin | Pin | Pin | Pin | Pin | Pin |
|
||||
+===========+==========+=============+=========+=========+=================+===========+========+========+========+
|
||||
| RST/Reset | RST | 9 [1]_ | 5 [1]_ | D9 | RESET / ICSP-5 | RST | 7 | 4 | 9 |
|
||||
+-----------+----------+-------------+---------+---------+-----------------+-----------+--------+--------+--------+
|
||||
| SPI SS | SDA [3]_ | 10 [2]_ | 53 [2]_ | D10 | 10 | 10 | 0 | 20 | 10 |
|
||||
+-----------+----------+-------------+---------+---------+-----------------+-----------+--------+--------+--------+
|
||||
| SPI MOSI | MOSI | 11 / ICSP-4 | 51 | D11 | ICSP-4 | 16 | 2 | 22 | 11 |
|
||||
+-----------+----------+-------------+---------+---------+-----------------+-----------+--------+--------+--------+
|
||||
| SPI MISO | MISO | 12 / ICSP-1 | 50 | D12 | ICSP-1 | 14 | 3 | 23 | 12 |
|
||||
+-----------+----------+-------------+---------+---------+-----------------+-----------+--------+--------+--------+
|
||||
| SPI SCK | SCK | 13 / ICSP-3 | 52 | D13 | ICSP-3 | 15 | 1 | 21 | 13 |
|
||||
+-----------+----------+-------------+---------+---------+-----------------+-----------+--------+--------+--------+
|
||||
|
||||
+-----------+---------------+---------+
|
||||
| | ESP8266 | Arduino |
|
||||
| +---------------+---------+
|
||||
| | Wemos D1 mini | Yun [4]_|
|
||||
+-----------+---------------+---------+
|
||||
| Signal | Pin | Pin |
|
||||
+===========+===============+=========+
|
||||
| RST/Reset | D3 | Pin9 |
|
||||
+-----------+---------------+---------+
|
||||
| SPI SS | D8 | Pin10 |
|
||||
+-----------+---------------+---------+
|
||||
| SPI MOSI | D7 | ICSP4 |
|
||||
+-----------+---------------+---------+
|
||||
| SPI MISO | D6 | ICSP1 |
|
||||
+-----------+---------------+---------+
|
||||
| SPI SCK | D5 | ICSP3 |
|
||||
+-----------+---------------+---------+
|
||||
|
||||
.. [1] Configurable, typically defined as RST_PIN in sketch/program.
|
||||
.. [2] Configurable, typically defined as SS_PIN in sketch/program.
|
||||
.. [3] The SDA pin might be labeled SS on some/older MFRC522 boards.
|
||||
.. [4] Source: https://github.com/miguelbalboa/rfid/issues/111#issuecomment-420433658 .
|
||||
|
||||
Important: If your micro controller supports multiple SPI interfaces, the library only uses the **default (first) SPI** of the Arduino framework.
|
||||
|
||||
.. _hardware:
|
||||
Hardware
|
||||
--------
|
||||
|
||||
There are three hardware components involved:
|
||||
|
||||
1. **Micro Controller**:
|
||||
|
||||
* An `Arduino`_ or compatible executing the Sketch using this library.
|
||||
|
||||
* Prices vary from USD 7 for clones, to USD 75 for "starter kits" (which
|
||||
might be a good choice if this is your first exposure to Arduino;
|
||||
check if such kit already includes the Arduino, Reader, and some Tags).
|
||||
|
||||
2. **Proximity Coupling Device (PCD)**:
|
||||
|
||||
* The PCD is the actual RFID **Reader** based on the `NXP MFRC522`_ Contactless
|
||||
Reader Integrated Circuit.
|
||||
|
||||
* Readers can be found on `eBay`_ for around USD 5: search for *"rc522"*.
|
||||
|
||||
* You can also find them on several web stores. They are often included in
|
||||
*"starter kits"*, so check your favourite electronics provider as well.
|
||||
|
||||
3. **Proximity Integrated Circuit Card (PICC)**:
|
||||
|
||||
* The PICC is the RFID **Card** or **Tag** using the `ISO/IEC 14443A`_
|
||||
interface, for example Mifare or NTAG203.
|
||||
|
||||
* One or two might be included with the Reader or *"starter kit"* already.
|
||||
|
||||
|
||||
.. _protocol:
|
||||
Protocols
|
||||
---------
|
||||
|
||||
1. The micro controller and the reader use SPI for communication.
|
||||
|
||||
* The protocol is described in the `NXP MFRC522`_ datasheet.
|
||||
|
||||
* See the `Pin Layout`_ section for details on connecting the pins.
|
||||
|
||||
2. The reader and the tags communicate using a 13.56 MHz electromagnetic field.
|
||||
|
||||
* The protocol is defined in ISO/IEC 14443-3:2011 Part 3 Type A.
|
||||
|
||||
* Details are found in chapter 6 *"Type A – Initialization and anticollision"*.
|
||||
|
||||
* See http://wg8.de/wg8n1496_17n3613_Ballot_FCD14443-3.pdf for a free version
|
||||
of the final draft (which might be outdated in some areas).
|
||||
|
||||
* The reader does not support ISO/IEC 14443-3 Type B.
|
||||
|
||||
|
||||
.. _security:
|
||||
Security
|
||||
-------
|
||||
* The **UID** of a card **can not be used** as an unique identification for security related projects. Some Chinese cards allow to change the UID which means you can easily clone a card. For projects like *access control*, *door opener* or *payment systems* you **must implement** an **additional security mechanism** like a password or normal key.
|
||||
|
||||
* This library only supports crypto1-encrypted communication. Crypto1 has been known as `broken`_ for a few years, so it does NOT offer ANY security, it is virtually unencrypted communication. **Do not use it for any security related applications!**
|
||||
|
||||
* This library does not offer 3DES or AES authentication used by cards like the Mifare DESFire, it may be possible to be implemented because the datasheet says there is support. We hope for pull requests :).
|
||||
|
||||
|
||||
.. _troubleshooting:
|
||||
Troubleshooting
|
||||
-------
|
||||
|
||||
* **I don't get input from reader** or **WARNING: Communication failure, is the MFRC522 properly connected?**
|
||||
|
||||
#. Check your physical connection, see `Pin Layout`_ .
|
||||
#. Check your pin settings/variables in the code, see `Pin Layout`_ .
|
||||
#. Check your pin header soldering. Maybe you have cold solder joints.
|
||||
#. Check voltage. Most breakouts work with 3.3V.
|
||||
#. SPI only works with 3.3V, most breakouts seem 5V tolerant, but try a level shifter.
|
||||
#. SPI does not like long connections. Try shorter connections.
|
||||
#. SPI does not like prototyping boards. Try soldered connections.
|
||||
#. According to reports #101, #126 and #131, there may be a problem with the soldering on the MFRC522 breakout. You could fix this on your own.
|
||||
|
||||
|
||||
* **Firmware Version: 0x12 = (unknown) or other random values**
|
||||
|
||||
#. The exact reason of this behaviour is unknown.
|
||||
#. Some boards need more time after `PCD_Init()` to be ready. As workaround add a `delay(4)` directly after `PCD_Init()` to give the PCD more time.
|
||||
#. If this sometimes appears, a bad connection or power source is the reason.
|
||||
#. If the firmware version is reported permanent, it is very likely that the hardware is a fake or has a defect. Contact your supplier.
|
||||
|
||||
|
||||
* **Sometimes I get timeouts** or **sometimes tag/card does not work.**
|
||||
|
||||
#. Try the other side of the antenna.
|
||||
#. Try to decrease the distance between the MFRC522 and your tag.
|
||||
#. Increase the antenna gain per firmware: ``mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);``
|
||||
#. Use better power supply.
|
||||
#. Hardware may be corrupted, most products are from china and sometimes the quality is really poor. Contact your seller.
|
||||
|
||||
|
||||
* **My tag/card doesn't work.**
|
||||
|
||||
#. Distance between antenna and token too large (>1cm).
|
||||
#. You got the wrong type PICC. Is it really 13.56 MHz? Is it really a Mifare Type A?
|
||||
#. NFC tokens are not supported. Some may work.
|
||||
#. Animal RFID tags are not supported. They use a different frequency (125 kHz).
|
||||
#. Hardware may be corrupted, most products are from china and sometimes the quality is really poor. Contact your seller.
|
||||
#. Newer versions of Mifare cards like DESFire/Ultralight maybe not work according to missing authentication, see `security`_ or different `protocol`_.
|
||||
#. Some boards bought from Chinese manufactures do not use the best components and this can affect the detection of different types of tag/card. In some of these boards, the L1 and L2 inductors do not have a high enough current so the signal generated is not enough to get Ultralight C and NTAG203 tags to work, replacing those with same inductance (2.2uH) but higher operating current inductors should make things work smoothly. Also, in some of those boards the harmonic and matching circuit needs to be tuned, for this replace C4 and C5 with 33pf capacitors and you are all set. (Source: `Mikro Elektronika`_)
|
||||
|
||||
* **My mobile phone doesn't recognize the MFRC522** or **my MFRC522 can't read data from other MFRC522**
|
||||
|
||||
#. Card simulation is not supported.
|
||||
#. Communication with mobile phones is not supported.
|
||||
#. Peer to peer communication is not supported.
|
||||
|
||||
* **I can only read the card UID.**
|
||||
|
||||
#. Maybe the `AccessBits` have been accidentally set and now an unknown password is set. This can not be reverted.
|
||||
#. Probably the card is encrypted. Especially official cards like public transport, university or library cards. There is *no* way to get access with this library.
|
||||
|
||||
* **I need more features.**
|
||||
|
||||
#. If software: code it and make a pull request.
|
||||
#. If hardware: buy a more expensive chip like the PN532 (supports NFC and many more, but costs about $15)
|
||||
|
||||
|
||||
.. _license:
|
||||
License
|
||||
-------
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to https://unlicense.org/
|
||||
|
||||
|
||||
.. _dependency:
|
||||
Dependency
|
||||
----------
|
||||
|
||||
* **Arduino.h**
|
||||
|
||||
* From: Arduino IDE / target specific
|
||||
* License: (target: Arduino) GNU Lesser General Public License 2.1
|
||||
|
||||
* **SPI.h**
|
||||
|
||||
* From: Arduino IDE / target specific
|
||||
* License: (target: Arduino) GNU Lesser General Public License 2.1
|
||||
|
||||
* **stdint.h**
|
||||
|
||||
* From: Arduino IDE / Compiler and target specific
|
||||
* License: different
|
||||
|
||||
|
||||
History
|
||||
-------
|
||||
|
||||
The MFRC522 library was first created in Jan 2012 by Miguel Balboa (from
|
||||
http://circuitito.com) based on code by Dr. Leong (from http://B2CQSHOP.com)
|
||||
for *"Arduino RFID module Kit 13.56 Mhz with Tags SPI W and R By COOQRobot"*.
|
||||
|
||||
It was translated into English and rewritten/refactored in the fall of 2013
|
||||
by Søren Thing Andersen (from http://access.thing.dk).
|
||||
|
||||
It has been extended with functionality to alter sector 0 on Chinese UID changeable MIFARE card in Oct 2014 by Tom Clement (from http://tomclement.nl).
|
||||
|
||||
Maintained by miguelbalboa until 2016.
|
||||
Maintained by Rotzbua from 2016 until 2020.
|
||||
|
||||
|
||||
.. _arduino: https://arduino.cc/
|
||||
.. _ebay: https://www.ebay.com/
|
||||
.. _iso/iec 14443a: https://en.wikipedia.org/wiki/ISO/IEC_14443
|
||||
.. _iso/iec 14443-3\:2011 part 3:
|
||||
.. _nxp mfrc522: https://www.nxp.com/documents/data_sheet/MFRC522.pdf
|
||||
.. _broken: https://eprint.iacr.org/2008/166
|
||||
.. _supported by hardware: https://web.archive.org/web/20151210045625/http://www.nxp.com/documents/leaflet/939775017564.pdf
|
||||
.. _Arduino forum: https://forum.arduino.cc
|
||||
.. _stdint.h: https://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h
|
||||
.. _Mikro Elektronika: https://forum.mikroe.com/viewtopic.php?f=147&t=64203
|
24
lib/lib_div/rfid-1.4.7/UNLICENSE
Normal file
24
lib/lib_div/rfid-1.4.7/UNLICENSE
Normal file
@ -0,0 +1,24 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <https://unlicense.org/>
|
185
lib/lib_div/rfid-1.4.7/changes.txt
Normal file
185
lib/lib_div/rfid-1.4.7/changes.txt
Normal file
@ -0,0 +1,185 @@
|
||||
-- Add changes to unreleased tag until we make a release.
|
||||
|
||||
xx 2020, v1.4.8
|
||||
|
||||
25 Jun 2020, v1.4.7
|
||||
- Fixed typos
|
||||
- Moved PICC memory layout to /doc
|
||||
|
||||
21 Jan 2020, v1.4.6
|
||||
- Library in freeze mode, no new features, no new examples, just bugfixes to keep compatibility for old projects
|
||||
- Updated documentation
|
||||
- Removed deprecation warnings due code freeze
|
||||
|
||||
12 Jun 2019, v1.4.5
|
||||
- Library in freeze mode, no new features, no new examples, just bugfixes to keep compatibility for old projects
|
||||
- Updated README
|
||||
|
||||
31 Mar 2019, v1.4.4
|
||||
- Fixed example
|
||||
- Fixed UnbrickUidSector
|
||||
- Updated comments
|
||||
- Removed teensy from CI and PlatformIO config
|
||||
|
||||
27 Oct 2018, v1.4.3
|
||||
- Added counterfeit detection and hint about bad boards
|
||||
- Improved hardware based reset
|
||||
|
||||
04 Oct 2018, v1.4.2
|
||||
- Fixed keywords
|
||||
- Changed development status of library
|
||||
|
||||
04 Oct 2018, v1.4.1
|
||||
- Replaced UINT8_MAX by UNUSED_PIN
|
||||
- Replaced default value NULL for pointer with correct nullptr
|
||||
- Added pin layout for wemos d1 mini @mmone
|
||||
- Added alternative fritzing layout for mfrc522 reader @jose1711
|
||||
- Added soft power control functions @Bill2462
|
||||
- Fixed typo in example ReadAndWrite.ino @Drachenfrucht1
|
||||
- Fixed grammar @KiddieD
|
||||
- Fixed infinite loop in example AccessControl.ino @mads256c
|
||||
- Fixed 0-index key ID equals to 0 fails in AccessControl.ino @thoaitrieu
|
||||
- Changed type boolean to bool for a more common use @Rotzbua
|
||||
- Fixed wrong var names in PICC_Select MFRC522.cpp @tuyethoa08041997
|
||||
- Fixed hang PCD_Init() on non-arduino boards @heziegl
|
||||
- Fixed possible infinite loop PCD_Reset() @psgreco
|
||||
- And many thanks to all other contributors
|
||||
|
||||
13 Apr 2018, v1.4.0
|
||||
- Replaced UINT8_MAX by UNUSED_PIN @Rotzbua
|
||||
- Fixed hang PCD_Init() on non-arduino boards @heziegl
|
||||
- deprecate MIFARE_SetAccessBits @Rotzbua
|
||||
- IMPORTANT: v1.4.X will be last version under license "unlicense"
|
||||
|
||||
22 Mar 2017, v1.3.6
|
||||
- Added deprecate and compiler warnings @Rotzbua
|
||||
|
||||
8 Apr 2017, v1.3.5
|
||||
- Updated "AccessControl.ino", bugs fixed and alternate wipe button polling method without using other library @beyondszine reviewed by @omersiar
|
||||
- Updated README notice about port for esp8266 @mmmmar
|
||||
|
||||
7 Apr 2017, v1.3.4
|
||||
- Added new example "rfid_read_personal_data.ino" @ryand1011
|
||||
- Updated example "rfid_write_personal_data.ino" code style to Arduino IDE @Rotzbua
|
||||
- Removed (temp.) Teensy from travis build script because fails @Rotzbua
|
||||
|
||||
26 Mar 2017, v1.3.3
|
||||
- Fixed bugs in MFRC522Extended, now should work with Desfire.h from JPG-Consulting @Rotzbua
|
||||
- Fixed UINT8_MAX error @Rotzbua
|
||||
|
||||
15 Mar 2017, v1.3.2
|
||||
- Added ESP8266 to library.properties
|
||||
|
||||
15 Mar 2017, v1.3.1
|
||||
- Fixed compiler warning in MFRC522Extended @Rotzbua
|
||||
- Removed unused function @Rotzbua
|
||||
|
||||
13 Mar 2017, v1.3.0
|
||||
- Warning: Source has moved to folder src!
|
||||
- Added addtional class to support ISO/IEC 14443-4 PICCs @JPG-Consulting
|
||||
- Added RATS (Request for Answer To Select) @JPG-Consulting
|
||||
- More information see https://github.com/miguelbalboa/rfid/pull/271 @JPG-Consulting
|
||||
|
||||
13 Mar 2017, v1.2.1
|
||||
- Removed need for reset pin #275 @tkoester
|
||||
- Added SPI speed option + Various minor changes #276 @tuyethoa08041997
|
||||
- Updated documentation, travis build script and small code change @Rotzbua
|
||||
|
||||
3 Jan 2017, v1.2.0
|
||||
- Warning: This version introduce usage of stdint.h, usage of not well defined int types are abandoned.
|
||||
Interface has changed: e.g. long -> int32_t
|
||||
@Rotzbua
|
||||
- Removed problematic example examples/servo_motor/servo_motor.ino @omersiar
|
||||
- Added examples/AccessControl/AccessControl.ino @omersiar
|
||||
- Fixed minor issues reported in #211 @omersiar
|
||||
- Added bad components hint to README @danielcbit
|
||||
- Fixed selftest @surr
|
||||
- Fixed auth problem with long UIDs @surr
|
||||
|
||||
26 Aug 2016, v1.1.9
|
||||
- Warning: Only Arduino IDE version 1.6 is supported, please update your IDE to 1.6 to use this Library.
|
||||
- Added ESP8266 platform support @Rotzbua
|
||||
- Changed README.rst content to show more info @Rotzbua
|
||||
- Minor Changes to examples/ReadUidMultiReader/ReadUidMultiReader.ino example @Rotzbua
|
||||
|
||||
11 Feb 2016, v1.1.8
|
||||
- Added examples/MinimalInterrupt/MinimalInterrupt.ino example, Interrupt example @lmmeng
|
||||
- Added .gitignore file allows the project to be more easily used as a subproject. @BenWiederhake
|
||||
- Added Added Teensy 2.0 & Tensy++ 2.0 pinouts to README.rst @jkutianski
|
||||
|
||||
16 Jan 2016, v1.1.7
|
||||
- README.rst Spelling and Grammar Tweak @cuthbertnibbles
|
||||
- Added examples/servo_motor/servo_motor.ino example, Arduino RFID Access Control with a Servo Motor @techied
|
||||
- Added examples/RFID-Cloner/RFID-Cloner.ino Copy from rfid cards with standard authentication @stefanblommaert
|
||||
- Fix compile error at examples/RFID-Cloner/RFID-Cloner.ino, using MFRC522:::PICC_Type, @Rotzbua
|
||||
|
||||
06 Jan 2016, v1.1.6
|
||||
- Fixed compilation error for examples/ReadNUID/ReadNUID.ino example. @Rotzbua
|
||||
|
||||
04 Jan 2016, v1.1.5
|
||||
- Use settings functions on SPI libraries, setSPIConfig was deleted, now the library use SPI.beginTransaction() and SPI.endTransaction() @sophiekovalevsky
|
||||
- Added examples/ReadNUID/ReadNUID.ino example, showing how to read new NUID from a PICC to serial. @sophiekovalevsky
|
||||
|
||||
03 Jan 2016, v1.1.4
|
||||
- Added Authentication with Ntag 213,215,216 returns the pACK MFRC522::PCD_NTAG216_AUTH @Gargantuanman
|
||||
- Starting to use versions http://semver.org/
|
||||
- Continuous Integration @ivankravets
|
||||
- functions return MFRC522::StatusCode and MFRC522::PICC_Type instead of generic byte @rotzbua
|
||||
- removed int-values of MFRC522::StatusCode and MFRC522::PICC_Type @rotzbua
|
||||
|
||||
05 Dec 2015
|
||||
- recognize infineon cards correctly @mayatforest
|
||||
- added multi reader support, see example @lmmeng
|
||||
|
||||
10 Nov 2014
|
||||
- Updated the changelog.
|
||||
- Added makefile.
|
||||
|
||||
24 Oct 2014
|
||||
- Added PlatformIO-based manifest file.
|
||||
|
||||
17 Jul 2014
|
||||
- Written documentation for the library.
|
||||
- Added rfid_default_keys example.
|
||||
|
||||
11 Jun 2014
|
||||
- Updated example: ReadAndWrite.
|
||||
|
||||
14 Apr 2014
|
||||
- Updated examples: DumpInfo, MifareClassicValueBlock, and ReadAndWrite.
|
||||
|
||||
12 Feb 2014
|
||||
- Fixed resetPowerDownPin initial state.
|
||||
|
||||
29 Jan 2014
|
||||
- Fixed chipSelectPin initial state.
|
||||
|
||||
30 Nov 2013
|
||||
- Examples put in their own folders.
|
||||
- Updated the keywords.txt file.
|
||||
|
||||
12 Nov 2013
|
||||
- Updated examples: DumpInfo, MifareClassicValueBlock, and ReadAndWrite.
|
||||
|
||||
20 Oct 2013
|
||||
- All constants, functions and parameters are now commented in English.
|
||||
- Code refactored, most function names have changed.
|
||||
- Support ISO-14443-3 anti collision and 4/7/10 byte UIDs (cascade levels).
|
||||
- Added functions for MIFARE Classic Decrement/Increment/Restore/Transfer
|
||||
and MIFARE Ultralight Write.
|
||||
- New examples written.
|
||||
|
||||
19 Oct 2013
|
||||
- Renamed library from RFID to MFRC522 (RFID seemed to generic).
|
||||
- Register names changed to comply with datasheet.
|
||||
- Global defines moved into class.
|
||||
|
||||
24 Sep 2013
|
||||
- Turn off encryption when tag is halted.
|
||||
|
||||
27 Jan 2013
|
||||
- Added README and small TODO list.
|
||||
- Added example to show Serial on LCD display.
|
||||
|
||||
09 Sep 2012
|
||||
- Initial commit to GitHub.
|
67
lib/lib_div/rfid-1.4.7/doc/PICCMemoryLayout.md
Normal file
67
lib/lib_div/rfid-1.4.7/doc/PICCMemoryLayout.md
Normal file
@ -0,0 +1,67 @@
|
||||
# Memory Layout of common PICCs
|
||||
|
||||
To read and write from MIFARE PICCs, the MIFARE protocol is used after the PICC has been selected.
|
||||
|
||||
## Datasheet References
|
||||
|
||||
The **MIFARE Classic** chips and protocol is described in the datasheets:
|
||||
* 1K: https://www.mouser.com/ds/2/302/MF1S503x-89574.pdf
|
||||
* 4K: https://datasheet.octopart.com/MF1S7035DA4,118-NXP-Semiconductors-datasheet-11046188.pdf
|
||||
* Mini: http://www.idcardmarket.com/download/mifare_S20_datasheet.pdf
|
||||
|
||||
The **MIFARE Ultralight** chip and protocol is described in the datasheets:
|
||||
* Ultralight: https://www.nxp.com/documents/data_sheet/MF0ICU1.pdf
|
||||
* Ultralight C: https://www.nxp.com/documents/short_data_sheet/MF0ICU2_SDS.pdf
|
||||
|
||||
## MIFARE Classic 1K (MF1S503x)
|
||||
|
||||
Has 16 sectors4 blocks/sector16 bytes/block = 1024 bytes.
|
||||
|
||||
The blocks are numbered 0-63.
|
||||
Block 3 in each sector is the Sector Trailer. See https://www.mouser.com/ds/2/302/MF1S503x-89574.pdf sections 8.6 and 8.7:
|
||||
Bytes 0-5: Key A
|
||||
Bytes 6-8: Access Bits
|
||||
Bytes 9: User data
|
||||
Bytes 10-15: Key B (or user data)
|
||||
Block 0 is read-only manufacturer data.
|
||||
To access a block, an authentication using a key from the block's sector must be performed first.
|
||||
Example: To read from block 10, first authenticate using a key from sector 3 (blocks 8-11).
|
||||
All keys are set to FFFFFFFFFFFFh at chip delivery.
|
||||
Warning: Please read section 8.7 "Memory Access". It includes this text: if the PICC detects a format violation the whole sector is irreversibly blocked.
|
||||
To use a block in "value block" mode (for Increment/Decrement operations) you need to change the sector trailer. Use PICC_SetAccessBits() to calculate the bit patterns.
|
||||
|
||||
## MIFARE Classic 4K (MF1S703x):
|
||||
|
||||
Has (32 sectors4 blocks/sector + 8 sectors16 blocks/sector)16 bytes/block = 4096 bytes.
|
||||
|
||||
The blocks are numbered 0-255.
|
||||
The last block in each sector is the Sector Trailer like above.
|
||||
|
||||
## MIFARE Classic Mini (MF1 IC S20):
|
||||
|
||||
Has 5 sectors4 blocks/sector16 bytes/block = 320 bytes.
|
||||
|
||||
The blocks are numbered 0-19.
|
||||
The last block in each sector is the Sector Trailer like above.
|
||||
|
||||
## MIFARE Ultralight (MF0ICU1):
|
||||
|
||||
Has 16 pages of 4 bytes = 64 bytes.
|
||||
|
||||
Pages 0 + 1 is used for the 7-byte UID.
|
||||
Page 2 contains the last check digit for the UID, one byte manufacturer internal data, and the lock bytes (see https://www.nxp.com/documents/data_sheet/MF0ICU1.pdf section 8.5.2)
|
||||
Page 3 is OTP, One Time Programmable bits. Once set to 1 they cannot revert to 0.
|
||||
Pages 4-15 are read/write unless blocked by the lock bytes in page 2.
|
||||
|
||||
## MIFARE Ultralight C (MF0ICU2):
|
||||
|
||||
Has 48 pages of 4 bytes = 192 bytes.
|
||||
|
||||
Pages 0 + 1 is used for the 7-byte UID.
|
||||
Page 2 contains the last check digit for the UID, one byte manufacturer internal data, and the lock bytes (see https://www.nxp.com/documents/data_sheet/MF0ICU1.pdf section 8.5.2)
|
||||
Page 3 is OTP, One Time Programmable bits. Once set to 1 they cannot revert to 0.
|
||||
Pages 4-39 are read/write unless blocked by the lock bytes in page 2.
|
||||
Page 40 Lock bytes
|
||||
Page 41 16 bit one way counter
|
||||
Pages 42-43 Authentication configuration
|
||||
Pages 44-47 Authentication key
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 282 KiB |
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522 - Pin Layout.png
Normal file
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522 - Pin Layout.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 162 KiB |
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522-v2.fzpz
Normal file
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522-v2.fzpz
Normal file
Binary file not shown.
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522-v2.png
Normal file
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522-v2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522-v3.fzpz
Normal file
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522-v3.fzpz
Normal file
Binary file not shown.
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522-v3.png
Normal file
BIN
lib/lib_div/rfid-1.4.7/doc/fritzing/RFID-RC522-v3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
lib/lib_div/rfid-1.4.7/doc/rfidmifare.pdf
Normal file
BIN
lib/lib_div/rfid-1.4.7/doc/rfidmifare.pdf
Normal file
Binary file not shown.
537
lib/lib_div/rfid-1.4.7/examples/AccessControl/AccessControl.ino
Normal file
537
lib/lib_div/rfid-1.4.7/examples/AccessControl/AccessControl.ino
Normal file
@ -0,0 +1,537 @@
|
||||
/*
|
||||
--------------------------------------------------------------------------------------------------------------------
|
||||
Example sketch/program showing An Arduino Door Access Control featuring RFID, EEPROM, Relay
|
||||
--------------------------------------------------------------------------------------------------------------------
|
||||
This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
|
||||
|
||||
This example showing a complete Door Access Control System
|
||||
|
||||
Simple Work Flow (not limited to) :
|
||||
+---------+
|
||||
+----------------------------------->READ TAGS+^------------------------------------------+
|
||||
| +--------------------+ |
|
||||
| | | |
|
||||
| | | |
|
||||
| +----v-----+ +-----v----+ |
|
||||
| |MASTER TAG| |OTHER TAGS| |
|
||||
| +--+-------+ ++-------------+ |
|
||||
| | | | |
|
||||
| | | | |
|
||||
| +-----v---+ +----v----+ +----v------+ |
|
||||
| +------------+READ TAGS+---+ |KNOWN TAG| |UNKNOWN TAG| |
|
||||
| | +-+-------+ | +-----------+ +------------------+ |
|
||||
| | | | | | |
|
||||
| +----v-----+ +----v----+ +--v--------+ +-v----------+ +------v----+ |
|
||||
| |MASTER TAG| |KNOWN TAG| |UNKNOWN TAG| |GRANT ACCESS| |DENY ACCESS| |
|
||||
| +----------+ +---+-----+ +-----+-----+ +-----+------+ +-----+-----+ |
|
||||
| | | | | |
|
||||
| +----+ +----v------+ +--v---+ | +--------------->
|
||||
+-------+EXIT| |DELETE FROM| |ADD TO| | |
|
||||
+----+ | EEPROM | |EEPROM| | |
|
||||
+-----------+ +------+ +-------------------------------+
|
||||
|
||||
|
||||
Use a Master Card which is act as Programmer then you can able to choose card holders who will granted access or not
|
||||
|
||||
* **Easy User Interface**
|
||||
|
||||
Just one RFID tag needed whether Delete or Add Tags. You can choose to use Leds for output or Serial LCD module to inform users.
|
||||
|
||||
* **Stores Information on EEPROM**
|
||||
|
||||
Information stored on non volatile Arduino's EEPROM memory to preserve Users' tag and Master Card. No Information lost
|
||||
if power lost. EEPROM has unlimited Read cycle but roughly 100,000 limited Write cycle.
|
||||
|
||||
* **Security**
|
||||
To keep it simple we are going to use Tag's Unique IDs. It's simple and not hacker proof.
|
||||
|
||||
@license Released into the public domain.
|
||||
|
||||
Typical pin layout used:
|
||||
-----------------------------------------------------------------------------------------
|
||||
MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
Signal Pin Pin Pin Pin Pin Pin
|
||||
-----------------------------------------------------------------------------------------
|
||||
RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
SPI SS SDA(SS) 10 53 D10 10 10
|
||||
SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*/
|
||||
|
||||
#include <EEPROM.h> // We are going to read and write PICC's UIDs from/to EEPROM
|
||||
#include <SPI.h> // RC522 Module uses SPI protocol
|
||||
#include <MFRC522.h> // Library for Mifare RC522 Devices
|
||||
|
||||
/*
|
||||
Instead of a Relay you may want to use a servo. Servos can lock and unlock door locks too
|
||||
Relay will be used by default
|
||||
*/
|
||||
|
||||
// #include <Servo.h>
|
||||
|
||||
/*
|
||||
For visualizing whats going on hardware we need some leds and to control door lock a relay and a wipe button
|
||||
(or some other hardware) Used common anode led,digitalWriting HIGH turns OFF led Mind that if you are going
|
||||
to use common cathode led or just seperate leds, simply comment out #define COMMON_ANODE,
|
||||
*/
|
||||
|
||||
#define COMMON_ANODE
|
||||
|
||||
#ifdef COMMON_ANODE
|
||||
#define LED_ON LOW
|
||||
#define LED_OFF HIGH
|
||||
#else
|
||||
#define LED_ON HIGH
|
||||
#define LED_OFF LOW
|
||||
#endif
|
||||
|
||||
#define redLed 7 // Set Led Pins
|
||||
#define greenLed 6
|
||||
#define blueLed 5
|
||||
|
||||
#define relay 4 // Set Relay Pin
|
||||
#define wipeB 3 // Button pin for WipeMode
|
||||
|
||||
bool programMode = false; // initialize programming mode to false
|
||||
|
||||
uint8_t successRead; // Variable integer to keep if we have Successful Read from Reader
|
||||
|
||||
byte storedCard[4]; // Stores an ID read from EEPROM
|
||||
byte readCard[4]; // Stores scanned ID read from RFID Module
|
||||
byte masterCard[4]; // Stores master card's ID read from EEPROM
|
||||
|
||||
// Create MFRC522 instance.
|
||||
#define SS_PIN 10
|
||||
#define RST_PIN 9
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN);
|
||||
|
||||
///////////////////////////////////////// Setup ///////////////////////////////////
|
||||
void setup() {
|
||||
//Arduino Pin Configuration
|
||||
pinMode(redLed, OUTPUT);
|
||||
pinMode(greenLed, OUTPUT);
|
||||
pinMode(blueLed, OUTPUT);
|
||||
pinMode(wipeB, INPUT_PULLUP); // Enable pin's pull up resistor
|
||||
pinMode(relay, OUTPUT);
|
||||
//Be careful how relay circuit behave on while resetting or power-cycling your Arduino
|
||||
digitalWrite(relay, HIGH); // Make sure door is locked
|
||||
digitalWrite(redLed, LED_OFF); // Make sure led is off
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure led is off
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure led is off
|
||||
|
||||
//Protocol Configuration
|
||||
Serial.begin(9600); // Initialize serial communications with PC
|
||||
SPI.begin(); // MFRC522 Hardware uses SPI protocol
|
||||
mfrc522.PCD_Init(); // Initialize MFRC522 Hardware
|
||||
|
||||
//If you set Antenna Gain to Max it will increase reading distance
|
||||
//mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
|
||||
|
||||
Serial.println(F("Access Control Example v0.1")); // For debugging purposes
|
||||
ShowReaderDetails(); // Show details of PCD - MFRC522 Card Reader details
|
||||
|
||||
//Wipe Code - If the Button (wipeB) Pressed while setup run (powered on) it wipes EEPROM
|
||||
if (digitalRead(wipeB) == LOW) { // when button pressed pin should get low, button connected to ground
|
||||
digitalWrite(redLed, LED_ON); // Red Led stays on to inform user we are going to wipe
|
||||
Serial.println(F("Wipe Button Pressed"));
|
||||
Serial.println(F("You have 10 seconds to Cancel"));
|
||||
Serial.println(F("This will be remove all records and cannot be undone"));
|
||||
bool buttonState = monitorWipeButton(10000); // Give user enough time to cancel operation
|
||||
if (buttonState == true && digitalRead(wipeB) == LOW) { // If button still be pressed, wipe EEPROM
|
||||
Serial.println(F("Starting Wiping EEPROM"));
|
||||
for (uint16_t x = 0; x < EEPROM.length(); x = x + 1) { //Loop end of EEPROM address
|
||||
if (EEPROM.read(x) == 0) { //If EEPROM address 0
|
||||
// do nothing, already clear, go to the next address in order to save time and reduce writes to EEPROM
|
||||
}
|
||||
else {
|
||||
EEPROM.write(x, 0); // if not write 0 to clear, it takes 3.3mS
|
||||
}
|
||||
}
|
||||
Serial.println(F("EEPROM Successfully Wiped"));
|
||||
digitalWrite(redLed, LED_OFF); // visualize a successful wipe
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_ON);
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_OFF);
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_ON);
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_OFF);
|
||||
}
|
||||
else {
|
||||
Serial.println(F("Wiping Cancelled")); // Show some feedback that the wipe button did not pressed for 15 seconds
|
||||
digitalWrite(redLed, LED_OFF);
|
||||
}
|
||||
}
|
||||
// Check if master card defined, if not let user choose a master card
|
||||
// This also useful to just redefine the Master Card
|
||||
// You can keep other EEPROM records just write other than 143 to EEPROM address 1
|
||||
// EEPROM address 1 should hold magical number which is '143'
|
||||
if (EEPROM.read(1) != 143) {
|
||||
Serial.println(F("No Master Card Defined"));
|
||||
Serial.println(F("Scan A PICC to Define as Master Card"));
|
||||
do {
|
||||
successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
|
||||
digitalWrite(blueLed, LED_ON); // Visualize Master Card need to be defined
|
||||
delay(200);
|
||||
digitalWrite(blueLed, LED_OFF);
|
||||
delay(200);
|
||||
}
|
||||
while (!successRead); // Program will not go further while you not get a successful read
|
||||
for ( uint8_t j = 0; j < 4; j++ ) { // Loop 4 times
|
||||
EEPROM.write( 2 + j, readCard[j] ); // Write scanned PICC's UID to EEPROM, start from address 3
|
||||
}
|
||||
EEPROM.write(1, 143); // Write to EEPROM we defined Master Card.
|
||||
Serial.println(F("Master Card Defined"));
|
||||
}
|
||||
Serial.println(F("-------------------"));
|
||||
Serial.println(F("Master Card's UID"));
|
||||
for ( uint8_t i = 0; i < 4; i++ ) { // Read Master Card's UID from EEPROM
|
||||
masterCard[i] = EEPROM.read(2 + i); // Write it to masterCard
|
||||
Serial.print(masterCard[i], HEX);
|
||||
}
|
||||
Serial.println("");
|
||||
Serial.println(F("-------------------"));
|
||||
Serial.println(F("Everything is ready"));
|
||||
Serial.println(F("Waiting PICCs to be scanned"));
|
||||
cycleLeds(); // Everything ready lets give user some feedback by cycling leds
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////// Main Loop ///////////////////////////////////
|
||||
void loop () {
|
||||
do {
|
||||
successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
|
||||
// When device is in use if wipe button pressed for 10 seconds initialize Master Card wiping
|
||||
if (digitalRead(wipeB) == LOW) { // Check if button is pressed
|
||||
// Visualize normal operation is iterrupted by pressing wipe button Red is like more Warning to user
|
||||
digitalWrite(redLed, LED_ON); // Make sure led is off
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure led is off
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure led is off
|
||||
// Give some feedback
|
||||
Serial.println(F("Wipe Button Pressed"));
|
||||
Serial.println(F("Master Card will be Erased! in 10 seconds"));
|
||||
bool buttonState = monitorWipeButton(10000); // Give user enough time to cancel operation
|
||||
if (buttonState == true && digitalRead(wipeB) == LOW) { // If button still be pressed, wipe EEPROM
|
||||
EEPROM.write(1, 0); // Reset Magic Number.
|
||||
Serial.println(F("Master Card Erased from device"));
|
||||
Serial.println(F("Please reset to re-program Master Card"));
|
||||
while (1);
|
||||
}
|
||||
Serial.println(F("Master Card Erase Cancelled"));
|
||||
}
|
||||
if (programMode) {
|
||||
cycleLeds(); // Program Mode cycles through Red Green Blue waiting to read a new card
|
||||
}
|
||||
else {
|
||||
normalModeOn(); // Normal mode, blue Power LED is on, all others are off
|
||||
}
|
||||
}
|
||||
while (!successRead); //the program will not go further while you are not getting a successful read
|
||||
if (programMode) {
|
||||
if ( isMaster(readCard) ) { //When in program mode check First If master card scanned again to exit program mode
|
||||
Serial.println(F("Master Card Scanned"));
|
||||
Serial.println(F("Exiting Program Mode"));
|
||||
Serial.println(F("-----------------------------"));
|
||||
programMode = false;
|
||||
return;
|
||||
}
|
||||
else {
|
||||
if ( findID(readCard) ) { // If scanned card is known delete it
|
||||
Serial.println(F("I know this PICC, removing..."));
|
||||
deleteID(readCard);
|
||||
Serial.println("-----------------------------");
|
||||
Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
|
||||
}
|
||||
else { // If scanned card is not known add it
|
||||
Serial.println(F("I do not know this PICC, adding..."));
|
||||
writeID(readCard);
|
||||
Serial.println(F("-----------------------------"));
|
||||
Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( isMaster(readCard)) { // If scanned card's ID matches Master Card's ID - enter program mode
|
||||
programMode = true;
|
||||
Serial.println(F("Hello Master - Entered Program Mode"));
|
||||
uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
|
||||
Serial.print(F("I have ")); // stores the number of ID's in EEPROM
|
||||
Serial.print(count);
|
||||
Serial.print(F(" record(s) on EEPROM"));
|
||||
Serial.println("");
|
||||
Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
|
||||
Serial.println(F("Scan Master Card again to Exit Program Mode"));
|
||||
Serial.println(F("-----------------------------"));
|
||||
}
|
||||
else {
|
||||
if ( findID(readCard) ) { // If not, see if the card is in the EEPROM
|
||||
Serial.println(F("Welcome, You shall pass"));
|
||||
granted(300); // Open the door lock for 300 ms
|
||||
}
|
||||
else { // If not, show that the ID was not valid
|
||||
Serial.println(F("You shall not pass"));
|
||||
denied();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Access Granted ///////////////////////////////////
|
||||
void granted ( uint16_t setDelay) {
|
||||
digitalWrite(blueLed, LED_OFF); // Turn off blue LED
|
||||
digitalWrite(redLed, LED_OFF); // Turn off red LED
|
||||
digitalWrite(greenLed, LED_ON); // Turn on green LED
|
||||
digitalWrite(relay, LOW); // Unlock door!
|
||||
delay(setDelay); // Hold door lock open for given seconds
|
||||
digitalWrite(relay, HIGH); // Relock door
|
||||
delay(1000); // Hold green LED on for a second
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Access Denied ///////////////////////////////////
|
||||
void denied() {
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
digitalWrite(redLed, LED_ON); // Turn on red LED
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
|
||||
uint8_t getID() {
|
||||
// Getting ready for Reading PICCs
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
|
||||
return 0;
|
||||
}
|
||||
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
|
||||
return 0;
|
||||
}
|
||||
// There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
|
||||
// I think we should assume every PICC as they have 4 byte UID
|
||||
// Until we support 7 byte PICCs
|
||||
Serial.println(F("Scanned PICC's UID:"));
|
||||
for ( uint8_t i = 0; i < 4; i++) { //
|
||||
readCard[i] = mfrc522.uid.uidByte[i];
|
||||
Serial.print(readCard[i], HEX);
|
||||
}
|
||||
Serial.println("");
|
||||
mfrc522.PICC_HaltA(); // Stop reading
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ShowReaderDetails() {
|
||||
// Get the MFRC522 software version
|
||||
byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
|
||||
Serial.print(F("MFRC522 Software Version: 0x"));
|
||||
Serial.print(v, HEX);
|
||||
if (v == 0x91)
|
||||
Serial.print(F(" = v1.0"));
|
||||
else if (v == 0x92)
|
||||
Serial.print(F(" = v2.0"));
|
||||
else
|
||||
Serial.print(F(" (unknown),probably a chinese clone?"));
|
||||
Serial.println("");
|
||||
// When 0x00 or 0xFF is returned, communication probably failed
|
||||
if ((v == 0x00) || (v == 0xFF)) {
|
||||
Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?"));
|
||||
Serial.println(F("SYSTEM HALTED: Check connections."));
|
||||
// Visualize system is halted
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
digitalWrite(redLed, LED_ON); // Turn on red LED
|
||||
while (true); // do not go further
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Cycle Leds (Program Mode) ///////////////////////////////////
|
||||
void cycleLeds() {
|
||||
digitalWrite(redLed, LED_OFF); // Make sure red LED is off
|
||||
digitalWrite(greenLed, LED_ON); // Make sure green LED is on
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_OFF); // Make sure red LED is off
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
|
||||
digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_ON); // Make sure red LED is on
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
delay(200);
|
||||
}
|
||||
|
||||
//////////////////////////////////////// Normal Mode Led ///////////////////////////////////
|
||||
void normalModeOn () {
|
||||
digitalWrite(blueLed, LED_ON); // Blue LED ON and ready to read card
|
||||
digitalWrite(redLed, LED_OFF); // Make sure Red LED is off
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure Green LED is off
|
||||
digitalWrite(relay, HIGH); // Make sure Door is Locked
|
||||
}
|
||||
|
||||
//////////////////////////////////////// Read an ID from EEPROM //////////////////////////////
|
||||
void readID( uint8_t number ) {
|
||||
uint8_t start = (number * 4 ) + 2; // Figure out starting position
|
||||
for ( uint8_t i = 0; i < 4; i++ ) { // Loop 4 times to get the 4 Bytes
|
||||
storedCard[i] = EEPROM.read(start + i); // Assign values read from EEPROM to array
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Add ID to EEPROM ///////////////////////////////////
|
||||
void writeID( byte a[] ) {
|
||||
if ( !findID( a ) ) { // Before we write to the EEPROM, check to see if we have seen this card before!
|
||||
uint8_t num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
|
||||
uint8_t start = ( num * 4 ) + 6; // Figure out where the next slot starts
|
||||
num++; // Increment the counter by one
|
||||
EEPROM.write( 0, num ); // Write the new count to the counter
|
||||
for ( uint8_t j = 0; j < 4; j++ ) { // Loop 4 times
|
||||
EEPROM.write( start + j, a[j] ); // Write the array values to EEPROM in the right position
|
||||
}
|
||||
successWrite();
|
||||
Serial.println(F("Succesfully added ID record to EEPROM"));
|
||||
}
|
||||
else {
|
||||
failedWrite();
|
||||
Serial.println(F("Failed! There is something wrong with ID or bad EEPROM"));
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Remove ID from EEPROM ///////////////////////////////////
|
||||
void deleteID( byte a[] ) {
|
||||
if ( !findID( a ) ) { // Before we delete from the EEPROM, check to see if we have this card!
|
||||
failedWrite(); // If not
|
||||
Serial.println(F("Failed! There is something wrong with ID or bad EEPROM"));
|
||||
}
|
||||
else {
|
||||
uint8_t num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
|
||||
uint8_t slot; // Figure out the slot number of the card
|
||||
uint8_t start; // = ( num * 4 ) + 6; // Figure out where the next slot starts
|
||||
uint8_t looping; // The number of times the loop repeats
|
||||
uint8_t j;
|
||||
uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that stores number of cards
|
||||
slot = findIDSLOT( a ); // Figure out the slot number of the card to delete
|
||||
start = (slot * 4) + 2;
|
||||
looping = ((num - slot) * 4);
|
||||
num--; // Decrement the counter by one
|
||||
EEPROM.write( 0, num ); // Write the new count to the counter
|
||||
for ( j = 0; j < looping; j++ ) { // Loop the card shift times
|
||||
EEPROM.write( start + j, EEPROM.read(start + 4 + j)); // Shift the array values to 4 places earlier in the EEPROM
|
||||
}
|
||||
for ( uint8_t k = 0; k < 4; k++ ) { // Shifting loop
|
||||
EEPROM.write( start + j + k, 0);
|
||||
}
|
||||
successDelete();
|
||||
Serial.println(F("Succesfully removed ID record from EEPROM"));
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Check Bytes ///////////////////////////////////
|
||||
bool checkTwo ( byte a[], byte b[] ) {
|
||||
for ( uint8_t k = 0; k < 4; k++ ) { // Loop 4 times
|
||||
if ( a[k] != b[k] ) { // IF a != b then false, because: one fails, all fail
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Find Slot ///////////////////////////////////
|
||||
uint8_t findIDSLOT( byte find[] ) {
|
||||
uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
|
||||
for ( uint8_t i = 1; i <= count; i++ ) { // Loop once for each EEPROM entry
|
||||
readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
|
||||
if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
|
||||
// is the same as the find[] ID card passed
|
||||
return i; // The slot number of the card
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Find ID From EEPROM ///////////////////////////////////
|
||||
bool findID( byte find[] ) {
|
||||
uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
|
||||
for ( uint8_t i = 1; i < count; i++ ) { // Loop once for each EEPROM entry
|
||||
readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
|
||||
if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
|
||||
return true;
|
||||
}
|
||||
else { // If not, return false
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Write Success to EEPROM ///////////////////////////////////
|
||||
// Flashes the green LED 3 times to indicate a successful write to EEPROM
|
||||
void successWrite() {
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
digitalWrite(redLed, LED_OFF); // Make sure red LED is off
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is on
|
||||
delay(200);
|
||||
digitalWrite(greenLed, LED_ON); // Make sure green LED is on
|
||||
delay(200);
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
|
||||
delay(200);
|
||||
digitalWrite(greenLed, LED_ON); // Make sure green LED is on
|
||||
delay(200);
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
|
||||
delay(200);
|
||||
digitalWrite(greenLed, LED_ON); // Make sure green LED is on
|
||||
delay(200);
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Write Failed to EEPROM ///////////////////////////////////
|
||||
// Flashes the red LED 3 times to indicate a failed write to EEPROM
|
||||
void failedWrite() {
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
digitalWrite(redLed, LED_OFF); // Make sure red LED is off
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_ON); // Make sure red LED is on
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_OFF); // Make sure red LED is off
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_ON); // Make sure red LED is on
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_OFF); // Make sure red LED is off
|
||||
delay(200);
|
||||
digitalWrite(redLed, LED_ON); // Make sure red LED is on
|
||||
delay(200);
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Success Remove UID From EEPROM ///////////////////////////////////
|
||||
// Flashes the blue LED 3 times to indicate a success delete to EEPROM
|
||||
void successDelete() {
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
digitalWrite(redLed, LED_OFF); // Make sure red LED is off
|
||||
digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
|
||||
delay(200);
|
||||
digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
|
||||
delay(200);
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
delay(200);
|
||||
digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
|
||||
delay(200);
|
||||
digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
|
||||
delay(200);
|
||||
digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
|
||||
delay(200);
|
||||
}
|
||||
|
||||
////////////////////// Check readCard IF is masterCard ///////////////////////////////////
|
||||
// Check to see if the ID passed is the master programing card
|
||||
bool isMaster( byte test[] ) {
|
||||
return checkTwo(test, masterCard);
|
||||
}
|
||||
|
||||
bool monitorWipeButton(uint32_t interval) {
|
||||
uint32_t now = (uint32_t)millis();
|
||||
while ((uint32_t)millis() - now < interval) {
|
||||
// check on every half a second
|
||||
if (((uint32_t)millis() % 500) == 0) {
|
||||
if (digitalRead(wipeB) != LOW)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
110
lib/lib_div/rfid-1.4.7/examples/ChangeUID/ChangeUID.ino
Normal file
110
lib/lib_div/rfid-1.4.7/examples/ChangeUID/ChangeUID.ino
Normal file
@ -0,0 +1,110 @@
|
||||
/*
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* Example to change UID of changeable MIFARE card.
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
|
||||
*
|
||||
* This sample shows how to set the UID on a UID changeable MIFARE card.
|
||||
*
|
||||
* @author Tom Clement
|
||||
* @license Released into the public domain.
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
|
||||
|
||||
/* Set your new UID here! */
|
||||
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
|
||||
|
||||
MFRC522::MIFARE_Key key;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!"));
|
||||
|
||||
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
key.keyByte[i] = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
// Setting the UID can be as simple as this:
|
||||
//void loop() {
|
||||
// byte newUid[] = NEW_UID;
|
||||
// if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
|
||||
// Serial.println("Wrote new UID to card.");
|
||||
// }
|
||||
// delay(1000);
|
||||
//}
|
||||
|
||||
// But of course this is a more proper approach
|
||||
void loop() {
|
||||
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle. And if present, select one.
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
|
||||
delay(50);
|
||||
return;
|
||||
}
|
||||
|
||||
// Now a card is selected. The UID and SAK is in mfrc522.uid.
|
||||
|
||||
// Dump UID
|
||||
Serial.print(F("Card UID:"));
|
||||
for (byte i = 0; i < mfrc522.uid.size; i++) {
|
||||
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
|
||||
Serial.print(mfrc522.uid.uidByte[i], HEX);
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
// Dump PICC type
|
||||
// MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
|
||||
// Serial.print(F("PICC type: "));
|
||||
// Serial.print(mfrc522.PICC_GetTypeName(piccType));
|
||||
// Serial.print(F(" (SAK "));
|
||||
// Serial.print(mfrc522.uid.sak);
|
||||
// Serial.print(")\r\n");
|
||||
// if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
|
||||
// && piccType != MFRC522::PICC_TYPE_MIFARE_1K
|
||||
// && piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
|
||||
// Serial.println(F("This sample only works with MIFARE Classic cards."));
|
||||
// return;
|
||||
// }
|
||||
|
||||
// Set new UID
|
||||
byte newUid[] = NEW_UID;
|
||||
if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
|
||||
Serial.println(F("Wrote new UID to card."));
|
||||
}
|
||||
|
||||
// Halt PICC and re-select it so DumpToSerial doesn't get confused
|
||||
mfrc522.PICC_HaltA();
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Dump the new memory contents
|
||||
Serial.println(F("New UID and contents:"));
|
||||
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
|
||||
|
||||
delay(2000);
|
||||
}
|
67
lib/lib_div/rfid-1.4.7/examples/DumpInfo/DumpInfo.ino
Normal file
67
lib/lib_div/rfid-1.4.7/examples/DumpInfo/DumpInfo.ino
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* Example sketch/program showing how to read data from a PICC to serial.
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
|
||||
*
|
||||
* Example sketch/program showing how to read data from a PICC (that is: a RFID Tag or Card) using a MFRC522 based RFID
|
||||
* Reader on the Arduino SPI interface.
|
||||
*
|
||||
* When the Arduino and the MFRC522 module are connected (see the pin layout below), load this sketch into Arduino IDE
|
||||
* then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M). When
|
||||
* you present a PICC (that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output
|
||||
* will show the ID/UID, type and any data blocks it can read. Note: you may see "Timeout in communication" messages
|
||||
* when removing the PICC from reading distance too early.
|
||||
*
|
||||
* If your reader supports it, this sketch/program will read all the PICCs presented (that is: multiple tag reading).
|
||||
* So if you stack two or more PICCs on top of each other and present them to the reader, it will first output all
|
||||
* details of the first and then the next PICC. Note that this may take some time as all data blocks are dumped, so
|
||||
* keep the PICCs at reading distance until complete.
|
||||
*
|
||||
* @license Released into the public domain.
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522
|
||||
delay(4); // Optional delay. Some board do need more time after init to be ready, see Readme
|
||||
mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD - MFRC522 Card Reader details
|
||||
Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Dump debug info about the card; PICC_HaltA() is automatically called
|
||||
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* Example sketch/program to fix a broken UID changeable MIFARE cards.
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
|
||||
*
|
||||
* This sample shows how to fix a broken UID changeable MIFARE cards that have a corrupted sector 0.
|
||||
*
|
||||
* @author Tom Clement
|
||||
* @license Released into the public domain.
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
|
||||
|
||||
MFRC522::MIFARE_Key key;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
Serial.println(F("Warning: this example clears your mifare UID, use with care!"));
|
||||
|
||||
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
key.keyByte[i] = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if ( mfrc522.MIFARE_UnbrickUidSector(false) ) {
|
||||
Serial.println(F("Cleared sector 0, set UID to 1234. Card should be responsive again now."));
|
||||
}
|
||||
delay(1000);
|
||||
}
|
@ -0,0 +1,319 @@
|
||||
/**
|
||||
* ----------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; see https://github.com/miguelbalboa/rfid
|
||||
* for further details and other examples.
|
||||
*
|
||||
* NOTE: The library file MFRC522.h has a lot of useful info. Please read it.
|
||||
*
|
||||
* Released into the public domain.
|
||||
* ----------------------------------------------------------------------------
|
||||
* This sample shows how to setup blocks on a MIFARE Classic PICC (= card/tag)
|
||||
* to be in "Value Block" mode: in this mode the operations Increment/Decrement,
|
||||
* Restore and Transfer can be used.
|
||||
*
|
||||
* BEWARE: Data will be written to the PICC, in sector #1 (blocks #4 to #7).
|
||||
*
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
|
||||
|
||||
MFRC522::MIFARE_Key key;
|
||||
|
||||
/**
|
||||
* Initialize.
|
||||
*/
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
|
||||
// Prepare the key (used both as key A and as key B)
|
||||
// using FFFFFFFFFFFFh which is the default at chip delivery from the factory
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
key.keyByte[i] = 0xFF;
|
||||
}
|
||||
|
||||
Serial.println(F("Scan a MIFARE Classic PICC to demonstrate Value Block mode."));
|
||||
Serial.print(F("Using key (for A and B):"));
|
||||
dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
|
||||
Serial.println();
|
||||
|
||||
Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Main loop.
|
||||
*/
|
||||
void loop() {
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent())
|
||||
return;
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial())
|
||||
return;
|
||||
|
||||
// Show some details of the PICC (that is: the tag/card)
|
||||
Serial.print(F("Card UID:"));
|
||||
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
|
||||
Serial.println();
|
||||
Serial.print(F("PICC type: "));
|
||||
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
|
||||
Serial.println(mfrc522.PICC_GetTypeName(piccType));
|
||||
|
||||
// Check for compatibility
|
||||
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
|
||||
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
|
||||
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
|
||||
Serial.println(F("This sample only works with MIFARE Classic cards."));
|
||||
return;
|
||||
}
|
||||
|
||||
// In this sample we use the second sector,
|
||||
// that is: sector #1, covering block #4 up to and including block #7
|
||||
byte sector = 1;
|
||||
byte valueBlockA = 5;
|
||||
byte valueBlockB = 6;
|
||||
byte trailerBlock = 7;
|
||||
MFRC522::StatusCode status;
|
||||
byte buffer[18];
|
||||
byte size = sizeof(buffer);
|
||||
int32_t value;
|
||||
|
||||
// Authenticate using key A
|
||||
Serial.println(F("Authenticating using key A..."));
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Show the whole sector as it currently is
|
||||
Serial.println(F("Current data in sector:"));
|
||||
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
|
||||
Serial.println();
|
||||
|
||||
// We need a sector trailer that defines blocks 5 and 6 as Value Blocks and enables key B
|
||||
// The last block in a sector (block #3 for Mifare Classic 1K) is the Sector Trailer.
|
||||
// See http://www.nxp.com/documents/data_sheet/MF1S503x.pdf sections 8.6 and 8.7:
|
||||
// Bytes 0-5: Key A
|
||||
// Bytes 6-8: Access Bits
|
||||
// Bytes 9: User data
|
||||
// Bytes 10-15: Key B (or user data)
|
||||
byte trailerBuffer[] = {
|
||||
255, 255, 255, 255, 255, 255, // Keep default key A
|
||||
0, 0, 0,
|
||||
0,
|
||||
255, 255, 255, 255, 255, 255}; // Keep default key B
|
||||
// The access bits are stored in a peculiar fashion.
|
||||
// There are four groups:
|
||||
// g[0] Access bits for block 0 (for sectors 0-31)
|
||||
// or blocks 0-4 (for sectors 32-39)
|
||||
// g[1] Access bits for block 1 (for sectors 0-31)
|
||||
// or blocks 5-9 (for sectors 32-39)
|
||||
// g[2] Access bits for block 2 (for sectors 0-31)
|
||||
// or blocks 10-14 (for sectors 32-39)
|
||||
// g[3] Access bits for the Sector Trailer: block 3 (for sectors 0-31)
|
||||
// or block 15 (for sectors 32-39)
|
||||
// Each group has access bits [C1 C2 C3], in this code C1 is MSB and C3 is LSB.
|
||||
// Determine the bit pattern needed using MIFARE_SetAccessBits:
|
||||
// g0=0 access bits for block 0 (of this sector) using [0 0 0] = 000b = 0
|
||||
// which means key A|B have r/w for block 0 of this sector
|
||||
// which (in this example) translates to block #4 within sector #1;
|
||||
// this is the transport configuration (at factory delivery).
|
||||
// g1=6 access bits for block 1 (of this sector) using [1 1 0] = 110b = 6
|
||||
// which means block 1 (of this sector) is used as a value block,
|
||||
// which (in this example) translates to block #5 within sector #1;
|
||||
// where key A|B have r, key B has w, key B can increment,
|
||||
// and key A|B can decrement, transfer, and restore.
|
||||
// g2=6 same thing for block 2 (of this sector): set it to a value block;
|
||||
// which (in this example) translates to block #6 within sector #1;
|
||||
// g3=3 access bits for block 3 (of this sector): the Sector Trailer here;
|
||||
// using [0 1 1] = 011b = 3 which means only key B has r/w access
|
||||
// to the Sector Trailer (block 3 of this sector) from now on
|
||||
// which (in this example) translates to block #7 within sector #1;
|
||||
mfrc522.MIFARE_SetAccessBits(&trailerBuffer[6], 0, 6, 6, 3);
|
||||
|
||||
// Read the sector trailer as it is currently stored on the PICC
|
||||
Serial.println(F("Reading sector trailer..."));
|
||||
status = mfrc522.MIFARE_Read(trailerBlock, buffer, &size);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Read() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
// Check if it matches the desired access pattern already;
|
||||
// because if it does, we don't need to write it again...
|
||||
if ( buffer[6] != trailerBuffer[6]
|
||||
|| buffer[7] != trailerBuffer[7]
|
||||
|| buffer[8] != trailerBuffer[8]) {
|
||||
// They don't match (yet), so write it to the PICC
|
||||
Serial.println(F("Writing new sector trailer..."));
|
||||
status = mfrc522.MIFARE_Write(trailerBlock, trailerBuffer, 16);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Write() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Authenticate using key B
|
||||
Serial.println(F("Authenticating again using key B..."));
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// A value block has a 32 bit signed value stored three times
|
||||
// and an 8 bit address stored 4 times. Make sure that valueBlockA
|
||||
// and valueBlockB have that format (note that it will only format
|
||||
// the block when it doesn't comply to the expected format already).
|
||||
formatValueBlock(valueBlockA);
|
||||
formatValueBlock(valueBlockB);
|
||||
|
||||
// Add 1 to the value of valueBlockA and store the result in valueBlockA.
|
||||
Serial.print("Adding 1 to value of block "); Serial.println(valueBlockA);
|
||||
status = mfrc522.MIFARE_Increment(valueBlockA, 1);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Increment() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
status = mfrc522.MIFARE_Transfer(valueBlockA);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Transfer() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
// Show the new value of valueBlockA
|
||||
status = mfrc522.MIFARE_GetValue(valueBlockA, &value);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("mifare_GetValue() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
Serial.print("New value of value block "); Serial.print(valueBlockA);
|
||||
Serial.print(" = "); Serial.println(value);
|
||||
|
||||
// Decrement 10 from the value of valueBlockB and store the result in valueBlockB.
|
||||
Serial.print("Subtracting 10 from value of block "); Serial.println(valueBlockB);
|
||||
status = mfrc522.MIFARE_Decrement(valueBlockB, 10);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Decrement() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
status = mfrc522.MIFARE_Transfer(valueBlockB);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Transfer() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
// Show the new value of valueBlockB
|
||||
status = mfrc522.MIFARE_GetValue(valueBlockB, &value);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("mifare_GetValue() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
Serial.print(F("New value of value block ")); Serial.print(valueBlockB);
|
||||
Serial.print(F(" = ")); Serial.println(value);
|
||||
// Check some boundary...
|
||||
if (value <= -100) {
|
||||
Serial.println(F("Below -100, so resetting it to 255 = 0xFF just for fun..."));
|
||||
status = mfrc522.MIFARE_SetValue(valueBlockB, 255);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("mifare_SetValue() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Dump the sector data
|
||||
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
|
||||
Serial.println();
|
||||
|
||||
// Halt PICC
|
||||
mfrc522.PICC_HaltA();
|
||||
// Stop encryption on PCD
|
||||
mfrc522.PCD_StopCrypto1();
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper routine to dump a byte array as hex values to Serial.
|
||||
*/
|
||||
void 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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that a given block is formatted as a Value Block.
|
||||
*/
|
||||
void formatValueBlock(byte blockAddr) {
|
||||
byte buffer[18];
|
||||
byte size = sizeof(buffer);
|
||||
MFRC522::StatusCode status;
|
||||
|
||||
Serial.print(F("Reading block ")); Serial.println(blockAddr);
|
||||
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Read() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (buffer[0] == (byte)~buffer[4])
|
||||
&& (buffer[1] == (byte)~buffer[5])
|
||||
&& (buffer[2] == (byte)~buffer[6])
|
||||
&& (buffer[3] == (byte)~buffer[7])
|
||||
|
||||
&& (buffer[0] == buffer[8])
|
||||
&& (buffer[1] == buffer[9])
|
||||
&& (buffer[2] == buffer[10])
|
||||
&& (buffer[3] == buffer[11])
|
||||
|
||||
&& (buffer[12] == (byte)~buffer[13])
|
||||
&& (buffer[12] == buffer[14])
|
||||
&& (buffer[12] == (byte)~buffer[15])) {
|
||||
Serial.println(F("Block has correct Value Block format."));
|
||||
}
|
||||
else {
|
||||
Serial.println(F("Formatting as Value Block..."));
|
||||
byte valueBlock[] = {
|
||||
0, 0, 0, 0,
|
||||
255, 255, 255, 255,
|
||||
0, 0, 0, 0,
|
||||
blockAddr, ~blockAddr, blockAddr, ~blockAddr };
|
||||
status = mfrc522.MIFARE_Write(blockAddr, valueBlock, 16);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Write() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,137 @@
|
||||
/**
|
||||
* ----------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; see https://github.com/miguelbalboa/rfid
|
||||
* for further details and other examples.
|
||||
*
|
||||
* NOTE: The library file MFRC522.h has a lot of useful info. Please read it.
|
||||
*
|
||||
* Released into the public domain.
|
||||
* ----------------------------------------------------------------------------
|
||||
* Minimal example how to use the interrupts to read the UID of a MIFARE Classic PICC
|
||||
* (= card/tag).
|
||||
*
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 3 10
|
||||
* IRQ ? ? ? ? 2 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 3 // Configurable, see typical pin layout above
|
||||
#define IRQ_PIN 2 // Configurable, depends on hardware
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
|
||||
|
||||
MFRC522::MIFARE_Key key;
|
||||
|
||||
volatile bool bNewInt = false;
|
||||
byte regVal = 0x7F;
|
||||
void activateRec(MFRC522 mfrc522);
|
||||
void clearInt(MFRC522 mfrc522);
|
||||
|
||||
/**
|
||||
* Initialize.
|
||||
*/
|
||||
void setup() {
|
||||
Serial.begin(115200); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
|
||||
/* read and printout the MFRC522 version (valid values 0x91 & 0x92)*/
|
||||
Serial.print(F("Ver: 0x"));
|
||||
byte readReg = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
|
||||
Serial.println(readReg, HEX);
|
||||
|
||||
/* setup the IRQ pin*/
|
||||
pinMode(IRQ_PIN, INPUT_PULLUP);
|
||||
|
||||
/*
|
||||
* Allow the ... irq to be propagated to the IRQ pin
|
||||
* For test purposes propagate the IdleIrq and loAlert
|
||||
*/
|
||||
regVal = 0xA0; //rx irq
|
||||
mfrc522.PCD_WriteRegister(mfrc522.ComIEnReg, regVal);
|
||||
|
||||
bNewInt = false; //interrupt flag
|
||||
|
||||
/*Activate the interrupt*/
|
||||
attachInterrupt(digitalPinToInterrupt(IRQ_PIN), readCard, FALLING);
|
||||
|
||||
do { //clear a spourious interrupt at start
|
||||
;
|
||||
} while (!bNewInt);
|
||||
bNewInt = false;
|
||||
|
||||
Serial.println(F("End setup"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Main loop.
|
||||
*/
|
||||
void loop() {
|
||||
if (bNewInt) { //new read interrupt
|
||||
Serial.print(F("Interrupt. "));
|
||||
mfrc522.PICC_ReadCardSerial(); //read the tag data
|
||||
// Show some details of the PICC (that is: the tag/card)
|
||||
Serial.print(F("Card UID:"));
|
||||
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
|
||||
Serial.println();
|
||||
|
||||
clearInt(mfrc522);
|
||||
mfrc522.PICC_HaltA();
|
||||
bNewInt = false;
|
||||
}
|
||||
|
||||
// The receiving block needs regular retriggering (tell the tag it should transmit??)
|
||||
// (mfrc522.PCD_WriteRegister(mfrc522.FIFODataReg,mfrc522.PICC_CMD_REQA);)
|
||||
activateRec(mfrc522);
|
||||
delay(100);
|
||||
} //loop()
|
||||
|
||||
/**
|
||||
* Helper routine to dump a byte array as hex values to Serial.
|
||||
*/
|
||||
void 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);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* MFRC522 interrupt serving routine
|
||||
*/
|
||||
void readCard() {
|
||||
bNewInt = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* The function sending to the MFRC522 the needed commands to activate the reception
|
||||
*/
|
||||
void activateRec(MFRC522 mfrc522) {
|
||||
mfrc522.PCD_WriteRegister(mfrc522.FIFODataReg, mfrc522.PICC_CMD_REQA);
|
||||
mfrc522.PCD_WriteRegister(mfrc522.CommandReg, mfrc522.PCD_Transceive);
|
||||
mfrc522.PCD_WriteRegister(mfrc522.BitFramingReg, 0x87);
|
||||
}
|
||||
|
||||
/*
|
||||
* The function to clear the pending interrupt bits after interrupt serving routine
|
||||
*/
|
||||
void clearInt(MFRC522 mfrc522) {
|
||||
mfrc522.PCD_WriteRegister(mfrc522.ComIrqReg, 0x7F);
|
||||
}
|
||||
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This example show how you can get Authenticated by the NTAG213,215,216. By default the tags are unprotected in order to protect them we need to write 4 different values:
|
||||
* Using mfrc522.MIFARE_Ultralight_Write(PageNum, Data, #Databytes))
|
||||
* 1.- We need to write the 32bit passWord to page 0xE5 !for ntag 213 and 215 page is different refer to nxp documentation!
|
||||
* 2.- Now Write the 16 bits pACK to the page 0xE6 use the 2 high bytes like this: pACKH + pACKL + 00 + 00 after an authentication the tag will return this secret bytes
|
||||
* 3.- Now we need to write the first page we want to protect this is a 1 byte data in page 0xE3 we need to write 00 + 00 + 00 + firstPage all pages after this one are write protected
|
||||
* Now WRITE protection is ACTIVATED so we need to get authenticated in order to write the last data
|
||||
* 4.- Finally we need to write an access record in order to READ protect the card this step is optional only if you want to read protect also write 80 + 00 + 00 + 00 to 0xE4
|
||||
* After completing all these steps you will nee to authenticate first in order to read or write ant page after the first page you selected to protect.
|
||||
* To disengage protection just write the page (0xE3) to 00 + 00 + 00 + FF that going to remove all protection.
|
||||
*
|
||||
* @author GARGANTUA from RoboCreators.com & paradoxalabs.com
|
||||
* @license Released into the public domain.
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 //
|
||||
#define SS_PIN 10 //
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522
|
||||
Serial.println(F("Scan PICC to see UID, type, and data blocks..."));
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial()) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte PSWBuff[] = {0xFF, 0xFF, 0xFF, 0xFF}; // 32 bit password default FFFFFFFF.
|
||||
byte pACK[] = {0, 0}; // 16 bit password ACK returned by the NFCtag.
|
||||
|
||||
Serial.print("Auth: ");
|
||||
Serial.println(mfrc522.PCD_NTAG216_AUTH(&PSWBuff[0], pACK)); // Request authentification if return STATUS_OK we are good.
|
||||
|
||||
//Print PassWordACK
|
||||
Serial.print(pACK[0], HEX);
|
||||
Serial.println(pACK[1], HEX);
|
||||
|
||||
byte WBuff[] = {0x00, 0x00, 0x00, 0x04};
|
||||
byte RBuff[18];
|
||||
|
||||
//Serial.print("CHG BLK: ");
|
||||
//Serial.println(mfrc522.MIFARE_Ultralight_Write(0xE3, WBuff, 4)); // How to write to a page.
|
||||
|
||||
mfrc522.PICC_DumpMifareUltralightToSerial(); // This is a modifier dump just change the for circle to < 232 instead of < 16 in order to see all the pages on NTAG216.
|
||||
|
||||
delay(3000);
|
||||
}
|
312
lib/lib_div/rfid-1.4.7/examples/RFID-Cloner/RFID-Cloner.ino
Normal file
312
lib/lib_div/rfid-1.4.7/examples/RFID-Cloner/RFID-Cloner.ino
Normal file
@ -0,0 +1,312 @@
|
||||
/*
|
||||
* Copy the RFID card data into variables and then
|
||||
* scan the second empty card to copy all the data
|
||||
* ----------------------------------------------------------------------------
|
||||
* Example sketch/program which will try the most used default keys listed in
|
||||
* https://code.google.com/p/mfcuk/wiki/MifareClassicDefaultKeys to dump the
|
||||
* block 0 of a MIFARE RFID card using a RFID-RC522 reader.
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
|
||||
|
||||
byte buffer[18];
|
||||
byte block;
|
||||
byte waarde[64][16];
|
||||
MFRC522::StatusCode status;
|
||||
|
||||
MFRC522::MIFARE_Key key;
|
||||
|
||||
// Number of known default keys (hard-coded)
|
||||
// NOTE: Synchronize the NR_KNOWN_KEYS define with the defaultKeys[] array
|
||||
#define NR_KNOWN_KEYS 8
|
||||
// Known keys, see: https://code.google.com/p/mfcuk/wiki/MifareClassicDefaultKeys
|
||||
byte knownKeys[NR_KNOWN_KEYS][MFRC522::MF_KEY_SIZE] = {
|
||||
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // FF FF FF FF FF FF = factory default
|
||||
{0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // A0 A1 A2 A3 A4 A5
|
||||
{0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5}, // B0 B1 B2 B3 B4 B5
|
||||
{0x4d, 0x3a, 0x99, 0xc3, 0x51, 0xdd}, // 4D 3A 99 C3 51 DD
|
||||
{0x1a, 0x98, 0x2c, 0x7e, 0x45, 0x9a}, // 1A 98 2C 7E 45 9A
|
||||
{0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // D3 F7 D3 F7 D3 F7
|
||||
{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, // AA BB CC DD EE FF
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // 00 00 00 00 00 00
|
||||
};
|
||||
|
||||
char choice;
|
||||
/*
|
||||
* Initialize.
|
||||
*/
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
Serial.println(F("Try the most used default keys to print block 0 to 63 of a MIFARE PICC."));
|
||||
Serial.println("1.Read card \n2.Write to card \n3.Copy the data.");
|
||||
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
key.keyByte[i] = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Via seriele monitor de bytes uitlezen in hexadecimaal
|
||||
|
||||
void 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);
|
||||
}
|
||||
}
|
||||
//Via seriele monitor de bytes uitlezen in ASCI
|
||||
|
||||
void dump_byte_array1(byte *buffer, byte bufferSize) {
|
||||
for (byte i = 0; i < bufferSize; i++) {
|
||||
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
|
||||
Serial.write(buffer[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Try using the PICC (the tag/card) with the given key to access block 0 to 63.
|
||||
* On success, it will show the key details, and dump the block data on Serial.
|
||||
*
|
||||
* @return true when the given key worked, false otherwise.
|
||||
*/
|
||||
|
||||
bool try_key(MFRC522::MIFARE_Key *key)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
for(byte block = 0; block < 64; block++){
|
||||
|
||||
// Serial.println(F("Authenticating using key A..."));
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read block
|
||||
byte byteCount = sizeof(buffer);
|
||||
status = mfrc522.MIFARE_Read(block, buffer, &byteCount);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Read() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
}
|
||||
else {
|
||||
// Successful read
|
||||
result = true;
|
||||
Serial.print(F("Success with key:"));
|
||||
dump_byte_array((*key).keyByte, MFRC522::MF_KEY_SIZE);
|
||||
Serial.println();
|
||||
|
||||
// Dump block data
|
||||
Serial.print(F("Block ")); Serial.print(block); Serial.print(F(":"));
|
||||
dump_byte_array1(buffer, 16); //omzetten van hex naar ASCI
|
||||
Serial.println();
|
||||
|
||||
for (int p = 0; p < 16; p++) //De 16 bits uit de block uitlezen
|
||||
{
|
||||
waarde [block][p] = buffer[p];
|
||||
Serial.print(waarde[block][p]);
|
||||
Serial.print(" ");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
Serial.println("1.Read card \n2.Write to card \n3.Copy the data.");
|
||||
|
||||
mfrc522.PICC_HaltA(); // Halt PICC
|
||||
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
|
||||
return result;
|
||||
|
||||
start();
|
||||
}
|
||||
|
||||
/*
|
||||
* Main loop.
|
||||
*/
|
||||
void loop() {
|
||||
start();
|
||||
|
||||
}
|
||||
|
||||
void start(){
|
||||
choice = Serial.read();
|
||||
|
||||
if(choice == '1')
|
||||
{
|
||||
Serial.println("Read the card");
|
||||
keuze1();
|
||||
|
||||
}
|
||||
else if(choice == '2')
|
||||
{
|
||||
Serial.println("See what is in the variables");
|
||||
keuze2();
|
||||
}
|
||||
else if(choice == '3')
|
||||
{
|
||||
Serial.println("Copying the data on to the new card");
|
||||
keuze3();
|
||||
}
|
||||
}
|
||||
|
||||
void keuze2(){ //Test waardes in blokken
|
||||
|
||||
for(block = 4; block <= 62; block++){
|
||||
if(block == 7 || block == 11 || block == 15 || block == 19 || block == 23 || block == 27 || block == 31 || block == 35 || block == 39 || block == 43 || block == 47 || block == 51 || block == 55 || block == 59){
|
||||
block ++;
|
||||
}
|
||||
|
||||
Serial.print(F("Writing data into block "));
|
||||
Serial.print(block);
|
||||
Serial.println("\n");
|
||||
|
||||
for(int j = 0; j < 16; j++){
|
||||
Serial.print(waarde[block][j]);
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println("\n");
|
||||
|
||||
}
|
||||
|
||||
Serial.println("1.Read card \n2.Write to card \n3.Copy the data.");
|
||||
start();
|
||||
}
|
||||
|
||||
void keuze3(){ //Copy the data in the new card
|
||||
Serial.println("Insert new card...");
|
||||
// Look for new cards
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent())
|
||||
return;
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial())
|
||||
return;
|
||||
|
||||
// Show some details of the PICC (that is: the tag/card)
|
||||
Serial.print(F("Card UID:"));
|
||||
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
|
||||
Serial.println();
|
||||
Serial.print(F("PICC type: "));
|
||||
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
|
||||
Serial.println(mfrc522.PICC_GetTypeName(piccType));
|
||||
|
||||
// Try the known default keys
|
||||
/*MFRC522::MIFARE_Key key;
|
||||
for (byte k = 0; k < NR_KNOWN_KEYS; k++) {
|
||||
// Copy the known key into the MIFARE_Key structure
|
||||
for (byte i = 0; i < MFRC522::MF_KEY_SIZE; i++) {
|
||||
key.keyByte[i] = knownKeys[k][i];
|
||||
}
|
||||
}*/
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
key.keyByte[i] = 0xFF;
|
||||
}
|
||||
|
||||
for(int i = 4; i <= 62; i++){ //De blocken 4 tot 62 kopieren, behalve al deze onderstaande blocken (omdat deze de authenticatie blokken zijn)
|
||||
if(i == 7 || i == 11 || i == 15 || i == 19 || i == 23 || i == 27 || i == 31 || i == 35 || i == 39 || i == 43 || i == 47 || i == 51 || i == 55 || i == 59){
|
||||
i++;
|
||||
}
|
||||
block = i;
|
||||
|
||||
// Authenticate using key A
|
||||
Serial.println(F("Authenticating using key A..."));
|
||||
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Authenticate using key B
|
||||
Serial.println(F("Authenticating again using key B..."));
|
||||
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, block, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Write data to the block
|
||||
Serial.print(F("Writing data into block "));
|
||||
Serial.print(block);
|
||||
Serial.println("\n");
|
||||
|
||||
dump_byte_array(waarde[block], 16);
|
||||
|
||||
|
||||
status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(block, waarde[block], 16);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Write() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
}
|
||||
|
||||
|
||||
Serial.println("\n");
|
||||
|
||||
}
|
||||
mfrc522.PICC_HaltA(); // Halt PICC
|
||||
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
|
||||
|
||||
Serial.println("1.Read card \n2.Write to card \n3.Copy the data.");
|
||||
start();
|
||||
}
|
||||
|
||||
void keuze1(){ //Read card
|
||||
Serial.println("Insert card...");
|
||||
// Look for new cards
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent())
|
||||
return;
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial())
|
||||
return;
|
||||
|
||||
// Show some details of the PICC (that is: the tag/card)
|
||||
Serial.print(F("Card UID:"));
|
||||
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
|
||||
Serial.println();
|
||||
Serial.print(F("PICC type: "));
|
||||
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
|
||||
Serial.println(mfrc522.PICC_GetTypeName(piccType));
|
||||
|
||||
// Try the known default keys
|
||||
MFRC522::MIFARE_Key key;
|
||||
for (byte k = 0; k < NR_KNOWN_KEYS; k++) {
|
||||
// Copy the known key into the MIFARE_Key structure
|
||||
for (byte i = 0; i < MFRC522::MF_KEY_SIZE; i++) {
|
||||
key.keyByte[i] = knownKeys[k][i];
|
||||
}
|
||||
// Try the key
|
||||
if (try_key(&key)) {
|
||||
// Found and reported on the key and block,
|
||||
// no need to try other keys for this PICC
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
200
lib/lib_div/rfid-1.4.7/examples/ReadAndWrite/ReadAndWrite.ino
Normal file
200
lib/lib_div/rfid-1.4.7/examples/ReadAndWrite/ReadAndWrite.ino
Normal file
@ -0,0 +1,200 @@
|
||||
/**
|
||||
* ----------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; see https://github.com/miguelbalboa/rfid
|
||||
* for further details and other examples.
|
||||
*
|
||||
* NOTE: The library file MFRC522.h has a lot of useful info. Please read it.
|
||||
*
|
||||
* Released into the public domain.
|
||||
* ----------------------------------------------------------------------------
|
||||
* This sample shows how to read and write data blocks on a MIFARE Classic PICC
|
||||
* (= card/tag).
|
||||
*
|
||||
* BEWARE: Data will be written to the PICC, in sector #1 (blocks #4 to #7).
|
||||
*
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
|
||||
|
||||
MFRC522::MIFARE_Key key;
|
||||
|
||||
/**
|
||||
* Initialize.
|
||||
*/
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
|
||||
// Prepare the key (used both as key A and as key B)
|
||||
// using FFFFFFFFFFFFh which is the default at chip delivery from the factory
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
key.keyByte[i] = 0xFF;
|
||||
}
|
||||
|
||||
Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write."));
|
||||
Serial.print(F("Using key (for A and B):"));
|
||||
dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
|
||||
Serial.println();
|
||||
|
||||
Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Main loop.
|
||||
*/
|
||||
void loop() {
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent())
|
||||
return;
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial())
|
||||
return;
|
||||
|
||||
// Show some details of the PICC (that is: the tag/card)
|
||||
Serial.print(F("Card UID:"));
|
||||
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
|
||||
Serial.println();
|
||||
Serial.print(F("PICC type: "));
|
||||
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
|
||||
Serial.println(mfrc522.PICC_GetTypeName(piccType));
|
||||
|
||||
// Check for compatibility
|
||||
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
|
||||
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
|
||||
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
|
||||
Serial.println(F("This sample only works with MIFARE Classic cards."));
|
||||
return;
|
||||
}
|
||||
|
||||
// In this sample we use the second sector,
|
||||
// that is: sector #1, covering block #4 up to and including block #7
|
||||
byte sector = 1;
|
||||
byte blockAddr = 4;
|
||||
byte dataBlock[] = {
|
||||
0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4,
|
||||
0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8,
|
||||
0x09, 0x0a, 0xff, 0x0b, // 9, 10, 255, 11,
|
||||
0x0c, 0x0d, 0x0e, 0x0f // 12, 13, 14, 15
|
||||
};
|
||||
byte trailerBlock = 7;
|
||||
MFRC522::StatusCode status;
|
||||
byte buffer[18];
|
||||
byte size = sizeof(buffer);
|
||||
|
||||
// Authenticate using key A
|
||||
Serial.println(F("Authenticating using key A..."));
|
||||
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Show the whole sector as it currently is
|
||||
Serial.println(F("Current data in sector:"));
|
||||
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
|
||||
Serial.println();
|
||||
|
||||
// Read data from the block
|
||||
Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
|
||||
Serial.println(F(" ..."));
|
||||
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Read() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
}
|
||||
Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
|
||||
dump_byte_array(buffer, 16); Serial.println();
|
||||
Serial.println();
|
||||
|
||||
// Authenticate using key B
|
||||
Serial.println(F("Authenticating again using key B..."));
|
||||
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Write data to the block
|
||||
Serial.print(F("Writing data into block ")); Serial.print(blockAddr);
|
||||
Serial.println(F(" ..."));
|
||||
dump_byte_array(dataBlock, 16); Serial.println();
|
||||
status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Write() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
// Read data from the block (again, should now be what we have written)
|
||||
Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
|
||||
Serial.println(F(" ..."));
|
||||
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Read() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
}
|
||||
Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
|
||||
dump_byte_array(buffer, 16); Serial.println();
|
||||
|
||||
// Check that data in block is what we have written
|
||||
// by counting the number of bytes that are equal
|
||||
Serial.println(F("Checking result..."));
|
||||
byte count = 0;
|
||||
for (byte i = 0; i < 16; i++) {
|
||||
// Compare buffer (= what we've read) with dataBlock (= what we've written)
|
||||
if (buffer[i] == dataBlock[i])
|
||||
count++;
|
||||
}
|
||||
Serial.print(F("Number of bytes that match = ")); Serial.println(count);
|
||||
if (count == 16) {
|
||||
Serial.println(F("Success :-)"));
|
||||
} else {
|
||||
Serial.println(F("Failure, no match :-("));
|
||||
Serial.println(F(" perhaps the write didn't work properly..."));
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
// Dump the sector data
|
||||
Serial.println(F("Current data in sector:"));
|
||||
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
|
||||
Serial.println();
|
||||
|
||||
// Halt PICC
|
||||
mfrc522.PICC_HaltA();
|
||||
// Stop encryption on PCD
|
||||
mfrc522.PCD_StopCrypto1();
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper routine to dump a byte array as hex values to Serial.
|
||||
*/
|
||||
void 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);
|
||||
}
|
||||
}
|
127
lib/lib_div/rfid-1.4.7/examples/ReadNUID/ReadNUID.ino
Normal file
127
lib/lib_div/rfid-1.4.7/examples/ReadNUID/ReadNUID.ino
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* Example sketch/program showing how to read new NUID from a PICC to serial.
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
|
||||
*
|
||||
* Example sketch/program showing how to the read data from a PICC (that is: a RFID Tag or Card) using a MFRC522 based RFID
|
||||
* Reader on the Arduino SPI interface.
|
||||
*
|
||||
* When the Arduino and the MFRC522 module are connected (see the pin layout below), load this sketch into Arduino IDE
|
||||
* then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M). When
|
||||
* you present a PICC (that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output
|
||||
* will show the type, and the NUID if a new card has been detected. Note: you may see "Timeout in communication" messages
|
||||
* when removing the PICC from reading distance too early.
|
||||
*
|
||||
* @license Released into the public domain.
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define SS_PIN 10
|
||||
#define RST_PIN 9
|
||||
|
||||
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
|
||||
|
||||
MFRC522::MIFARE_Key key;
|
||||
|
||||
// Init array that will store new NUID
|
||||
byte nuidPICC[4];
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
SPI.begin(); // Init SPI bus
|
||||
rfid.PCD_Init(); // Init MFRC522
|
||||
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
key.keyByte[i] = 0xFF;
|
||||
}
|
||||
|
||||
Serial.println(F("This code scan the MIFARE Classsic NUID."));
|
||||
Serial.print(F("Using the following key:"));
|
||||
printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
|
||||
if ( ! rfid.PICC_IsNewCardPresent())
|
||||
return;
|
||||
|
||||
// Verify if the NUID has been readed
|
||||
if ( ! rfid.PICC_ReadCardSerial())
|
||||
return;
|
||||
|
||||
Serial.print(F("PICC type: "));
|
||||
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
|
||||
Serial.println(rfid.PICC_GetTypeName(piccType));
|
||||
|
||||
// Check is the PICC of Classic MIFARE type
|
||||
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
|
||||
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
|
||||
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
|
||||
Serial.println(F("Your tag is not of type MIFARE Classic."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (rfid.uid.uidByte[0] != nuidPICC[0] ||
|
||||
rfid.uid.uidByte[1] != nuidPICC[1] ||
|
||||
rfid.uid.uidByte[2] != nuidPICC[2] ||
|
||||
rfid.uid.uidByte[3] != nuidPICC[3] ) {
|
||||
Serial.println(F("A new card has been detected."));
|
||||
|
||||
// Store NUID into nuidPICC array
|
||||
for (byte i = 0; i < 4; i++) {
|
||||
nuidPICC[i] = rfid.uid.uidByte[i];
|
||||
}
|
||||
|
||||
Serial.println(F("The NUID tag is:"));
|
||||
Serial.print(F("In hex: "));
|
||||
printHex(rfid.uid.uidByte, rfid.uid.size);
|
||||
Serial.println();
|
||||
Serial.print(F("In dec: "));
|
||||
printDec(rfid.uid.uidByte, rfid.uid.size);
|
||||
Serial.println();
|
||||
}
|
||||
else Serial.println(F("Card read previously."));
|
||||
|
||||
// Halt PICC
|
||||
rfid.PICC_HaltA();
|
||||
|
||||
// Stop encryption on PCD
|
||||
rfid.PCD_StopCrypto1();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Helper routine to dump a byte array as hex values to Serial.
|
||||
*/
|
||||
void printHex(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 dec values to Serial.
|
||||
*/
|
||||
void printDec(byte *buffer, byte bufferSize) {
|
||||
for (byte i = 0; i < bufferSize; i++) {
|
||||
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
|
||||
Serial.print(buffer[i], DEC);
|
||||
}
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
/**
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* Example sketch/program showing how to read data from more than one PICC to serial.
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
|
||||
*
|
||||
* Example sketch/program showing how to read data from more than one PICC (that is: a RFID Tag or Card) using a
|
||||
* MFRC522 based RFID Reader on the Arduino SPI interface.
|
||||
*
|
||||
* Warning: This may not work! Multiple devices at one SPI are difficult and cause many trouble!! Engineering skill
|
||||
* and knowledge are required!
|
||||
*
|
||||
* @license Released into the public domain.
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS 1 SDA(SS) ** custom, take a unused pin, only HIGH/LOW required **
|
||||
* SPI SS 2 SDA(SS) ** custom, take a unused pin, only HIGH/LOW required **
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_1_PIN 10 // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 2
|
||||
#define SS_2_PIN 8 // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 1
|
||||
|
||||
#define NR_OF_READERS 2
|
||||
|
||||
byte ssPins[] = {SS_1_PIN, SS_2_PIN};
|
||||
|
||||
MFRC522 mfrc522[NR_OF_READERS]; // Create MFRC522 instance.
|
||||
|
||||
/**
|
||||
* Initialize.
|
||||
*/
|
||||
void setup() {
|
||||
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
|
||||
SPI.begin(); // Init SPI bus
|
||||
|
||||
for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
|
||||
mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card
|
||||
Serial.print(F("Reader "));
|
||||
Serial.print(reader);
|
||||
Serial.print(F(": "));
|
||||
mfrc522[reader].PCD_DumpVersionToSerial();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Main loop.
|
||||
*/
|
||||
void loop() {
|
||||
|
||||
for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
|
||||
// Look for new cards
|
||||
|
||||
if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
|
||||
Serial.print(F("Reader "));
|
||||
Serial.print(reader);
|
||||
// Show some details of the PICC (that is: the tag/card)
|
||||
Serial.print(F(": Card UID:"));
|
||||
dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
|
||||
Serial.println();
|
||||
Serial.print(F("PICC type: "));
|
||||
MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
|
||||
Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));
|
||||
|
||||
// Halt PICC
|
||||
mfrc522[reader].PICC_HaltA();
|
||||
// Stop encryption on PCD
|
||||
mfrc522[reader].PCD_StopCrypto1();
|
||||
} //if (mfrc522[reader].PICC_IsNewC
|
||||
} //for(uint8_t reader
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper routine to dump a byte array as hex values to Serial.
|
||||
*/
|
||||
void 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);
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* Example sketch/program to test your firmware.
|
||||
* --------------------------------------------------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
|
||||
*
|
||||
* This example test the firmware of your MFRC522 reader module, only known version can be checked. If the test passed
|
||||
* it do not mean that your module is faultless! Some modules have bad or broken antennas or the PICC is broken.
|
||||
*
|
||||
* @author Rotzbua
|
||||
* @license Released into the public domain.
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
|
||||
|
||||
/**
|
||||
* Check firmware only once at startup
|
||||
*/
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 module
|
||||
|
||||
Serial.println(F("*****************************"));
|
||||
Serial.println(F("MFRC522 Digital self test"));
|
||||
Serial.println(F("*****************************"));
|
||||
mfrc522.PCD_DumpVersionToSerial(); // Show version of PCD - MFRC522 Card Reader
|
||||
Serial.println(F("-----------------------------"));
|
||||
Serial.println(F("Only known versions supported"));
|
||||
Serial.println(F("-----------------------------"));
|
||||
Serial.println(F("Performing test..."));
|
||||
bool result = mfrc522.PCD_PerformSelfTest(); // perform the test
|
||||
Serial.println(F("-----------------------------"));
|
||||
Serial.print(F("Result: "));
|
||||
if (result)
|
||||
Serial.println(F("OK"));
|
||||
else
|
||||
Serial.println(F("DEFECT or UNKNOWN"));
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void loop() {} // nothing to do
|
@ -0,0 +1,158 @@
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* This is a MFRC522 library example; see https://github.com/miguelbalboa/rfid
|
||||
* for further details and other examples.
|
||||
*
|
||||
* NOTE: The library file MFRC522.h has a lot of useful info. Please read it.
|
||||
*
|
||||
* Released into the public domain.
|
||||
* ----------------------------------------------------------------------------
|
||||
* Example sketch/program which will try the most used default keys listed in
|
||||
* https://code.google.com/p/mfcuk/wiki/MifareClassicDefaultKeys to dump the
|
||||
* block 0 of a MIFARE RFID card using a RFID-RC522 reader.
|
||||
*
|
||||
* Typical pin layout used:
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
|
||||
|
||||
// Number of known default keys (hard-coded)
|
||||
// NOTE: Synchronize the NR_KNOWN_KEYS define with the defaultKeys[] array
|
||||
#define NR_KNOWN_KEYS 8
|
||||
// Known keys, see: https://code.google.com/p/mfcuk/wiki/MifareClassicDefaultKeys
|
||||
byte knownKeys[NR_KNOWN_KEYS][MFRC522::MF_KEY_SIZE] = {
|
||||
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // FF FF FF FF FF FF = factory default
|
||||
{0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // A0 A1 A2 A3 A4 A5
|
||||
{0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5}, // B0 B1 B2 B3 B4 B5
|
||||
{0x4d, 0x3a, 0x99, 0xc3, 0x51, 0xdd}, // 4D 3A 99 C3 51 DD
|
||||
{0x1a, 0x98, 0x2c, 0x7e, 0x45, 0x9a}, // 1A 98 2C 7E 45 9A
|
||||
{0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // D3 F7 D3 F7 D3 F7
|
||||
{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, // AA BB CC DD EE FF
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // 00 00 00 00 00 00
|
||||
};
|
||||
|
||||
/*
|
||||
* Initialize.
|
||||
*/
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
Serial.println(F("Try the most used default keys to print block 0 of a MIFARE PICC."));
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper routine to dump a byte array as hex values to Serial.
|
||||
*/
|
||||
void 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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Try using the PICC (the tag/card) with the given key to access block 0.
|
||||
* On success, it will show the key details, and dump the block data on Serial.
|
||||
*
|
||||
* @return true when the given key worked, false otherwise.
|
||||
*/
|
||||
bool try_key(MFRC522::MIFARE_Key *key)
|
||||
{
|
||||
bool result = false;
|
||||
byte buffer[18];
|
||||
byte block = 0;
|
||||
MFRC522::StatusCode status;
|
||||
|
||||
// Serial.println(F("Authenticating using key A..."));
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
// Serial.print(F("PCD_Authenticate() failed: "));
|
||||
// Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read block
|
||||
byte byteCount = sizeof(buffer);
|
||||
status = mfrc522.MIFARE_Read(block, buffer, &byteCount);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
// Serial.print(F("MIFARE_Read() failed: "));
|
||||
// Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
}
|
||||
else {
|
||||
// Successful read
|
||||
result = true;
|
||||
Serial.print(F("Success with key:"));
|
||||
dump_byte_array((*key).keyByte, MFRC522::MF_KEY_SIZE);
|
||||
Serial.println();
|
||||
// Dump block data
|
||||
Serial.print(F("Block ")); Serial.print(block); Serial.print(F(":"));
|
||||
dump_byte_array(buffer, 16);
|
||||
Serial.println();
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
mfrc522.PICC_HaltA(); // Halt PICC
|
||||
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Main loop.
|
||||
*/
|
||||
void loop() {
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent())
|
||||
return;
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial())
|
||||
return;
|
||||
|
||||
// Show some details of the PICC (that is: the tag/card)
|
||||
Serial.print(F("Card UID:"));
|
||||
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
|
||||
Serial.println();
|
||||
Serial.print(F("PICC type: "));
|
||||
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
|
||||
Serial.println(mfrc522.PICC_GetTypeName(piccType));
|
||||
|
||||
// Try the known default keys
|
||||
MFRC522::MIFARE_Key key;
|
||||
for (byte k = 0; k < NR_KNOWN_KEYS; k++) {
|
||||
// Copy the known key into the MIFARE_Key structure
|
||||
for (byte i = 0; i < MFRC522::MF_KEY_SIZE; i++) {
|
||||
key.keyByte[i] = knownKeys[k][i];
|
||||
}
|
||||
// Try the key
|
||||
if (try_key(&key)) {
|
||||
// Found and reported on the key and block,
|
||||
// no need to try other keys for this PICC
|
||||
break;
|
||||
}
|
||||
|
||||
// http://arduino.stackexchange.com/a/14316
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent())
|
||||
break;
|
||||
if ( ! mfrc522.PICC_ReadCardSerial())
|
||||
break;
|
||||
}
|
||||
}
|
@ -0,0 +1,138 @@
|
||||
/*
|
||||
* Initial Author: ryand1011 (https://github.com/ryand1011)
|
||||
*
|
||||
* Reads data written by a program such as "rfid_write_personal_data.ino"
|
||||
*
|
||||
* See: https://github.com/miguelbalboa/rfid/tree/master/examples/rfid_write_personal_data
|
||||
*
|
||||
* Uses MIFARE RFID card using RFID-RC522 reader
|
||||
* Uses MFRC522 - Library
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
|
||||
|
||||
//*****************************************************************************************//
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
Serial.println(F("Read personal data on a MIFARE PICC:")); //shows in serial that it is ready to read
|
||||
}
|
||||
|
||||
//*****************************************************************************************//
|
||||
void loop() {
|
||||
|
||||
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
|
||||
MFRC522::MIFARE_Key key;
|
||||
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
|
||||
|
||||
//some variables we need
|
||||
byte block;
|
||||
byte len;
|
||||
MFRC522::StatusCode status;
|
||||
|
||||
//-------------------------------------------
|
||||
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.println(F("**Card Detected:**"));
|
||||
|
||||
//-------------------------------------------
|
||||
|
||||
mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); //dump some details about the card
|
||||
|
||||
//mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); //uncomment this to see all blocks in hex
|
||||
|
||||
//-------------------------------------------
|
||||
|
||||
Serial.print(F("Name: "));
|
||||
|
||||
byte buffer1[18];
|
||||
|
||||
block = 4;
|
||||
len = 18;
|
||||
|
||||
//------------------------------------------- GET FIRST NAME
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("Authentication failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
status = mfrc522.MIFARE_Read(block, buffer1, &len);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("Reading failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
//PRINT FIRST NAME
|
||||
for (uint8_t i = 0; i < 16; i++)
|
||||
{
|
||||
if (buffer1[i] != 32)
|
||||
{
|
||||
Serial.write(buffer1[i]);
|
||||
}
|
||||
}
|
||||
Serial.print(" ");
|
||||
|
||||
//---------------------------------------- GET LAST NAME
|
||||
|
||||
byte buffer2[18];
|
||||
block = 1;
|
||||
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid)); //line 834
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("Authentication failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
status = mfrc522.MIFARE_Read(block, buffer2, &len);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("Reading failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
//PRINT LAST NAME
|
||||
for (uint8_t i = 0; i < 16; i++) {
|
||||
Serial.write(buffer2[i] );
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Serial.println(F("\n**End Reading**\n"));
|
||||
|
||||
delay(1000); //change value if you want to read cards faster
|
||||
|
||||
mfrc522.PICC_HaltA();
|
||||
mfrc522.PCD_StopCrypto1();
|
||||
}
|
||||
//*****************************************************************************************//
|
@ -0,0 +1,156 @@
|
||||
/*
|
||||
* Write personal data of a MIFARE RFID card using a RFID-RC522 reader
|
||||
* Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* MFRC522 Arduino Arduino Arduino Arduino Arduino
|
||||
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
|
||||
* Signal Pin Pin Pin Pin Pin Pin
|
||||
* -----------------------------------------------------------------------------------------
|
||||
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
|
||||
* SPI SS SDA(SS) 10 53 D10 10 10
|
||||
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
|
||||
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
|
||||
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
|
||||
*
|
||||
* Hardware required:
|
||||
* Arduino
|
||||
* PCD (Proximity Coupling Device): NXP MFRC522 Contactless Reader IC
|
||||
* PICC (Proximity Integrated Circuit Card): A card or tag using the ISO 14443A interface, eg Mifare or NTAG203.
|
||||
* The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
|
||||
*/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
|
||||
#define RST_PIN 9 // Configurable, see typical pin layout above
|
||||
#define SS_PIN 10 // Configurable, see typical pin layout above
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600); // Initialize serial communications with the PC
|
||||
SPI.begin(); // Init SPI bus
|
||||
mfrc522.PCD_Init(); // Init MFRC522 card
|
||||
Serial.println(F("Write personal data on a MIFARE PICC "));
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
|
||||
MFRC522::MIFARE_Key key;
|
||||
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
|
||||
|
||||
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
|
||||
if ( ! mfrc522.PICC_IsNewCardPresent()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Select one of the cards
|
||||
if ( ! mfrc522.PICC_ReadCardSerial()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.print(F("Card UID:")); //Dump UID
|
||||
for (byte i = 0; i < mfrc522.uid.size; i++) {
|
||||
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
|
||||
Serial.print(mfrc522.uid.uidByte[i], HEX);
|
||||
}
|
||||
Serial.print(F(" PICC type: ")); // Dump PICC type
|
||||
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
|
||||
Serial.println(mfrc522.PICC_GetTypeName(piccType));
|
||||
|
||||
byte buffer[34];
|
||||
byte block;
|
||||
MFRC522::StatusCode status;
|
||||
byte len;
|
||||
|
||||
Serial.setTimeout(20000L) ; // wait until 20 seconds for input from serial
|
||||
// Ask personal data: Family name
|
||||
Serial.println(F("Type Family name, ending with #"));
|
||||
len = Serial.readBytesUntil('#', (char *) buffer, 30) ; // read family name from serial
|
||||
for (byte i = len; i < 30; i++) buffer[i] = ' '; // pad with spaces
|
||||
|
||||
block = 1;
|
||||
//Serial.println(F("Authenticating using key A..."));
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
else Serial.println(F("PCD_Authenticate() success: "));
|
||||
|
||||
// Write block
|
||||
status = mfrc522.MIFARE_Write(block, buffer, 16);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Write() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
else Serial.println(F("MIFARE_Write() success: "));
|
||||
|
||||
block = 2;
|
||||
//Serial.println(F("Authenticating using key A..."));
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Write block
|
||||
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Write() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
else Serial.println(F("MIFARE_Write() success: "));
|
||||
|
||||
// Ask personal data: First name
|
||||
Serial.println(F("Type First name, ending with #"));
|
||||
len = Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
|
||||
for (byte i = len; i < 20; i++) buffer[i] = ' '; // pad with spaces
|
||||
|
||||
block = 4;
|
||||
//Serial.println(F("Authenticating using key A..."));
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Write block
|
||||
status = mfrc522.MIFARE_Write(block, buffer, 16);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Write() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
else Serial.println(F("MIFARE_Write() success: "));
|
||||
|
||||
block = 5;
|
||||
//Serial.println(F("Authenticating using key A..."));
|
||||
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("PCD_Authenticate() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Write block
|
||||
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
|
||||
if (status != MFRC522::STATUS_OK) {
|
||||
Serial.print(F("MIFARE_Write() failed: "));
|
||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
||||
return;
|
||||
}
|
||||
else Serial.println(F("MIFARE_Write() success: "));
|
||||
|
||||
|
||||
Serial.println(" ");
|
||||
mfrc522.PICC_HaltA(); // Halt PICC
|
||||
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
|
||||
|
||||
}
|
223
lib/lib_div/rfid-1.4.7/keywords.txt
Normal file
223
lib/lib_div/rfid-1.4.7/keywords.txt
Normal file
@ -0,0 +1,223 @@
|
||||
#######################################
|
||||
# Syntax Coloring Map for library MFRC522
|
||||
#######################################
|
||||
|
||||
#######################################
|
||||
# KEYWORD1 Classes, datatypes, and C++ keywords
|
||||
#######################################
|
||||
MFRC522 KEYWORD1
|
||||
MFRC522Extended KEYWORD1
|
||||
PCD_Register KEYWORD1
|
||||
PCD_Command KEYWORD1
|
||||
PCD_RxGain KEYWORD1
|
||||
PICC_Command KEYWORD1
|
||||
MIFARE_Misc KEYWORD1
|
||||
PICC_Type KEYWORD1
|
||||
StatusCode KEYWORD1
|
||||
TagBitRates KEYWORD1
|
||||
Uid KEYWORD1
|
||||
CardInfo KEYWORD1
|
||||
MIFARE_Key KEYWORD1
|
||||
PcbBlock KEYWORD1
|
||||
|
||||
#######################################
|
||||
# KEYWORD2 Methods and functions
|
||||
#######################################
|
||||
|
||||
# Basic interface functions for communicating with the MFRC522
|
||||
PCD_WriteRegister KEYWORD2
|
||||
PCD_WriteRegister KEYWORD2
|
||||
PCD_ReadRegister KEYWORD2
|
||||
PCD_ReadRegister KEYWORD2
|
||||
setBitMask KEYWORD2
|
||||
PCD_SetRegisterBitMask KEYWORD2
|
||||
PCD_ClearRegisterBitMask KEYWORD2
|
||||
PCD_CalculateCRC KEYWORD2
|
||||
|
||||
# Functions for manipulating the MFRC522
|
||||
PCD_Init KEYWORD2
|
||||
PCD_Reset KEYWORD2
|
||||
PCD_AntennaOn KEYWORD2
|
||||
PCD_AntennaOff KEYWORD2
|
||||
PCD_GetAntennaGain KEYWORD2
|
||||
PCD_SetAntennaGain KEYWORD2
|
||||
PCD_PerformSelfTest KEYWORD2
|
||||
|
||||
# Power control functions MFRC522
|
||||
PCD_SoftPowerDown KEYWORD2
|
||||
PCD_SoftPowerUp KEYWORD2
|
||||
|
||||
# Functions for communicating with PICCs
|
||||
PCD_TransceiveData KEYWORD2
|
||||
PCD_CommunicateWithPICC KEYWORD2
|
||||
PICC_RequestA KEYWORD2
|
||||
PICC_WakeupA KEYWORD2
|
||||
PICC_REQA_or_WUPA KEYWORD2
|
||||
PICC_Select KEYWORD2
|
||||
PICC_HaltA KEYWORD2
|
||||
PICC_RATS KEYWORD2
|
||||
PICC_PPS KEYWORD2
|
||||
|
||||
# Functions for communicating with ISO/IEC 14433-4 cards
|
||||
TCL_Transceive KEYWORD2
|
||||
TCL_TransceiveRBlock KEYWORD2
|
||||
TCL_Deselect KEYWORD2
|
||||
|
||||
# Functions for communicating with MIFARE PICCs
|
||||
PCD_Authenticate KEYWORD2
|
||||
PCD_StopCrypto1 KEYWORD2
|
||||
MIFARE_Read KEYWORD2
|
||||
MIFARE_Write KEYWORD2
|
||||
MIFARE_Increment KEYWORD2
|
||||
MIFARE_Ultralight_Write KEYWORD2
|
||||
MIFARE_GetValue KEYWORD2
|
||||
MIFARE_SetValue KEYWORD2
|
||||
PCD_NTAG216_AUTH KEYWORD2
|
||||
|
||||
# Support functions
|
||||
PCD_MIFARE_Transceive KEYWORD2
|
||||
GetStatusCodeName KEYWORD2
|
||||
PICC_GetType KEYWORD2
|
||||
PICC_GetTypeName KEYWORD2
|
||||
|
||||
# Support functions for debuging
|
||||
PCD_DumpVersionToSerial KEYWORD2
|
||||
PICC_DumpToSerial KEYWORD2
|
||||
PICC_DumpDetailsToSerial KEYWORD2
|
||||
PICC_DumpMifareClassicToSerial KEYWORD2
|
||||
PICC_DumpMifareClassicSectorToSerial KEYWORD2
|
||||
PICC_DumpMifareUltralightToSerial KEYWORD2
|
||||
PICC_DumpISO14443_4 KEYWORD2
|
||||
|
||||
# Advanced functions for MIFARE
|
||||
MIFARE_SetAccessBits KEYWORD2
|
||||
MIFARE_OpenUidBackdoor KEYWORD2
|
||||
MIFARE_SetUid KEYWORD2
|
||||
MIFARE_UnbrickUidSector KEYWORD2
|
||||
|
||||
# Convenience functions - does not add extra functionality
|
||||
PICC_IsNewCardPresent KEYWORD2
|
||||
PICC_ReadCardSerial KEYWORD2
|
||||
|
||||
#######################################
|
||||
# KEYWORD3 setup and loop functions, as well as the Serial keywords
|
||||
#######################################
|
||||
|
||||
#######################################
|
||||
# LITERAL1 Constants
|
||||
#######################################
|
||||
CommandReg LITERAL1
|
||||
ComIEnReg LITERAL1
|
||||
DivIEnReg LITERAL1
|
||||
ComIrqReg LITERAL1
|
||||
DivIrqReg LITERAL1
|
||||
ErrorReg LITERAL1
|
||||
Status1Reg LITERAL1
|
||||
Status2Reg LITERAL1
|
||||
FIFODataReg LITERAL1
|
||||
FIFOLevelReg LITERAL1
|
||||
WaterLevelReg LITERAL1
|
||||
ControlReg LITERAL1
|
||||
BitFramingReg LITERAL1
|
||||
CollReg LITERAL1
|
||||
ModeReg LITERAL1
|
||||
TxModeReg LITERAL1
|
||||
RxModeReg LITERAL1
|
||||
TxControlReg LITERAL1
|
||||
TxASKReg LITERAL1
|
||||
TxSelReg LITERAL1
|
||||
RxSelReg LITERAL1
|
||||
RxThresholdReg LITERAL1
|
||||
DemodReg LITERAL1
|
||||
MfTxReg LITERAL1
|
||||
MfRxReg LITERAL1
|
||||
SerialSpeedReg LITERAL1
|
||||
CRCResultRegH LITERAL1
|
||||
CRCResultRegL LITERAL1
|
||||
ModWidthReg LITERAL1
|
||||
RFCfgReg LITERAL1
|
||||
GsNReg LITERAL1
|
||||
CWGsPReg LITERAL1
|
||||
ModGsPReg LITERAL1
|
||||
TModeReg LITERAL1
|
||||
TPrescalerReg LITERAL1
|
||||
TReloadRegH LITERAL1
|
||||
TReloadRegL LITERAL1
|
||||
TCounterValueRegH LITERAL1
|
||||
TCounterValueRegL LITERAL1
|
||||
TestSel1Reg LITERAL1
|
||||
TestSel2Reg LITERAL1
|
||||
TestPinEnReg LITERAL1
|
||||
TestPinValueReg LITERAL1
|
||||
TestBusReg LITERAL1
|
||||
AutoTestReg LITERAL1
|
||||
VersionReg LITERAL1
|
||||
AnalogTestReg LITERAL1
|
||||
TestDAC1Reg LITERAL1
|
||||
TestDAC2Reg LITERAL1
|
||||
TestADCReg LITERAL1
|
||||
PCD_Idle LITERAL1
|
||||
PCD_Mem LITERAL1
|
||||
PCD_GenerateRandomID LITERAL1
|
||||
PCD_CalcCRC LITERAL1
|
||||
PCD_Transmit LITERAL1
|
||||
PCD_NoCmdChange LITERAL1
|
||||
PCD_Receive LITERAL1
|
||||
PCD_Transceive LITERAL1
|
||||
PCD_MFAuthent LITERAL1
|
||||
PCD_SoftReset LITERAL1
|
||||
RxGain_18dB LITERAL1
|
||||
RxGain_23dB LITERAL1
|
||||
RxGain_18dB_2 LITERAL1
|
||||
RxGain_23dB_2 LITERAL1
|
||||
RxGain_33dB LITERAL1
|
||||
RxGain_38dB LITERAL1
|
||||
RxGain_43dB LITERAL1
|
||||
RxGain_48dB LITERAL1
|
||||
RxGain_min LITERAL1
|
||||
RxGain_avg LITERAL1
|
||||
RxGain_max LITERAL1
|
||||
PICC_CMD_REQA LITERAL1
|
||||
PICC_CMD_WUPA LITERAL1
|
||||
PICC_CMD_CT LITERAL1
|
||||
PICC_CMD_SEL_CL1 LITERAL1
|
||||
PICC_CMD_SEL_CL2 LITERAL1
|
||||
PICC_CMD_SEL_CL3 LITERAL1
|
||||
PICC_CMD_HLTA LITERAL1
|
||||
PICC_CMD_RATS LITERAL1
|
||||
PICC_CMD_MF_AUTH_KEY_A LITERAL1
|
||||
PICC_CMD_MF_AUTH_KEY_B LITERAL1
|
||||
PICC_CMD_MF_READ LITERAL1
|
||||
PICC_CMD_MF_WRITE LITERAL1
|
||||
PICC_CMD_MF_DECREMENT LITERAL1
|
||||
PICC_CMD_MF_INCREMENT LITERAL1
|
||||
PICC_CMD_MF_RESTORE LITERAL1
|
||||
PICC_CMD_MF_TRANSFER LITERAL1
|
||||
PICC_CMD_UL_WRITE LITERAL1
|
||||
MF_ACK LITERAL1
|
||||
MF_KEY_SIZE LITERAL1
|
||||
PICC_TYPE_UNKNOWN LITERAL1
|
||||
PICC_TYPE_ISO_14443_4 LITERAL1
|
||||
PICC_TYPE_ISO_18092 LITERAL1
|
||||
PICC_TYPE_MIFARE_MINI LITERAL1
|
||||
PICC_TYPE_MIFARE_1K LITERAL1
|
||||
PICC_TYPE_MIFARE_4K LITERAL1
|
||||
PICC_TYPE_MIFARE_UL LITERAL1
|
||||
PICC_TYPE_MIFARE_PLUS LITERAL1
|
||||
PICC_TYPE_MIFARE_DESFIRE LITERAL1
|
||||
PICC_TYPE_TNP3XXX LITERAL1
|
||||
PICC_TYPE_NOT_COMPLETE LITERAL1
|
||||
STATUS_OK LITERAL1
|
||||
STATUS_ERROR LITERAL1
|
||||
STATUS_COLLISION LITERAL1
|
||||
STATUS_TIMEOUT LITERAL1
|
||||
STATUS_NO_ROOM LITERAL1
|
||||
STATUS_INTERNAL_ERROR LITERAL1
|
||||
STATUS_INVALID LITERAL1
|
||||
STATUS_CRC_WRONG LITERAL1
|
||||
STATUS_MIFARE_NACK LITERAL1
|
||||
FIFO_SIZE LITERAL1
|
||||
BITRATE_106KBITS LITERAL1
|
||||
BITRATE_212KBITS LITERAL1
|
||||
BITRATE_424KBITS LITERAL1
|
||||
BITRATE_848KBITS LITERAL1
|
15
lib/lib_div/rfid-1.4.7/library.json
Normal file
15
lib/lib_div/rfid-1.4.7/library.json
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "MFRC522",
|
||||
"version": "1.4.7",
|
||||
"license": "Unlicense",
|
||||
"keywords": "rfid, spi",
|
||||
"description": "Read a card using a MFRC522 reader on your SPI interface.",
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/miguelbalboa/rfid.git"
|
||||
},
|
||||
"exclude": "doc",
|
||||
"frameworks": "arduino",
|
||||
"platforms": ["atmelavr", "ststm32", "espressif8266", "espressif32", "samd"]
|
||||
}
|
9
lib/lib_div/rfid-1.4.7/library.properties
Normal file
9
lib/lib_div/rfid-1.4.7/library.properties
Normal file
@ -0,0 +1,9 @@
|
||||
name=MFRC522
|
||||
version=1.4.7
|
||||
author=GithubCommunity
|
||||
maintainer=GithubCommunity
|
||||
sentence=Arduino RFID Library for MFRC522 (SPI)
|
||||
paragraph=Read/Write a RFID Card or Tag using the ISO/IEC 14443A/MIFARE interface.
|
||||
category=Communication
|
||||
url=https://github.com/miguelbalboa/rfid
|
||||
architectures=avr,megaavr,STM32F1,teensy,esp8266,esp32,samd
|
1929
lib/lib_div/rfid-1.4.7/src/MFRC522.cpp
Normal file
1929
lib/lib_div/rfid-1.4.7/src/MFRC522.cpp
Normal file
File diff suppressed because it is too large
Load Diff
371
lib/lib_div/rfid-1.4.7/src/MFRC522.h
Normal file
371
lib/lib_div/rfid-1.4.7/src/MFRC522.h
Normal file
@ -0,0 +1,371 @@
|
||||
/**
|
||||
* Library to use Arduino MFRC522 module.
|
||||
*
|
||||
* @authors Dr.Leong, Miguel Balboa, Søren Thing Andersen, Tom Clement, many more! See GitLog.
|
||||
*
|
||||
* For more information read the README.
|
||||
*
|
||||
* Please read this file for an overview and then MFRC522.cpp for comments on the specific functions.
|
||||
*/
|
||||
#ifndef MFRC522_h
|
||||
#define MFRC522_h
|
||||
|
||||
#include "require_cpp11.h"
|
||||
#include "deprecated.h"
|
||||
// Enable integer limits
|
||||
#define __STDC_LIMIT_MACROS
|
||||
#include <stdint.h>
|
||||
#include <Arduino.h>
|
||||
#include <SPI.h>
|
||||
|
||||
#ifndef MFRC522_SPICLOCK
|
||||
#define MFRC522_SPICLOCK SPI_CLOCK_DIV4 // MFRC522 accept upto 10MHz
|
||||
#endif
|
||||
|
||||
// Firmware data for self-test
|
||||
// Reference values based on firmware version
|
||||
// Hint: if needed, you can remove unused self-test data to save flash memory
|
||||
//
|
||||
// Version 0.0 (0x90)
|
||||
// Philips Semiconductors; Preliminary Specification Revision 2.0 - 01 August 2005; 16.1 self-test
|
||||
const byte MFRC522_firmware_referenceV0_0[] PROGMEM = {
|
||||
0x00, 0x87, 0x98, 0x0f, 0x49, 0xFF, 0x07, 0x19,
|
||||
0xBF, 0x22, 0x30, 0x49, 0x59, 0x63, 0xAD, 0xCA,
|
||||
0x7F, 0xE3, 0x4E, 0x03, 0x5C, 0x4E, 0x49, 0x50,
|
||||
0x47, 0x9A, 0x37, 0x61, 0xE7, 0xE2, 0xC6, 0x2E,
|
||||
0x75, 0x5A, 0xED, 0x04, 0x3D, 0x02, 0x4B, 0x78,
|
||||
0x32, 0xFF, 0x58, 0x3B, 0x7C, 0xE9, 0x00, 0x94,
|
||||
0xB4, 0x4A, 0x59, 0x5B, 0xFD, 0xC9, 0x29, 0xDF,
|
||||
0x35, 0x96, 0x98, 0x9E, 0x4F, 0x30, 0x32, 0x8D
|
||||
};
|
||||
// Version 1.0 (0x91)
|
||||
// NXP Semiconductors; Rev. 3.8 - 17 September 2014; 16.1.1 self-test
|
||||
const byte MFRC522_firmware_referenceV1_0[] PROGMEM = {
|
||||
0x00, 0xC6, 0x37, 0xD5, 0x32, 0xB7, 0x57, 0x5C,
|
||||
0xC2, 0xD8, 0x7C, 0x4D, 0xD9, 0x70, 0xC7, 0x73,
|
||||
0x10, 0xE6, 0xD2, 0xAA, 0x5E, 0xA1, 0x3E, 0x5A,
|
||||
0x14, 0xAF, 0x30, 0x61, 0xC9, 0x70, 0xDB, 0x2E,
|
||||
0x64, 0x22, 0x72, 0xB5, 0xBD, 0x65, 0xF4, 0xEC,
|
||||
0x22, 0xBC, 0xD3, 0x72, 0x35, 0xCD, 0xAA, 0x41,
|
||||
0x1F, 0xA7, 0xF3, 0x53, 0x14, 0xDE, 0x7E, 0x02,
|
||||
0xD9, 0x0F, 0xB5, 0x5E, 0x25, 0x1D, 0x29, 0x79
|
||||
};
|
||||
// Version 2.0 (0x92)
|
||||
// NXP Semiconductors; Rev. 3.8 - 17 September 2014; 16.1.1 self-test
|
||||
const byte MFRC522_firmware_referenceV2_0[] PROGMEM = {
|
||||
0x00, 0xEB, 0x66, 0xBA, 0x57, 0xBF, 0x23, 0x95,
|
||||
0xD0, 0xE3, 0x0D, 0x3D, 0x27, 0x89, 0x5C, 0xDE,
|
||||
0x9D, 0x3B, 0xA7, 0x00, 0x21, 0x5B, 0x89, 0x82,
|
||||
0x51, 0x3A, 0xEB, 0x02, 0x0C, 0xA5, 0x00, 0x49,
|
||||
0x7C, 0x84, 0x4D, 0xB3, 0xCC, 0xD2, 0x1B, 0x81,
|
||||
0x5D, 0x48, 0x76, 0xD5, 0x71, 0x61, 0x21, 0xA9,
|
||||
0x86, 0x96, 0x83, 0x38, 0xCF, 0x9D, 0x5B, 0x6D,
|
||||
0xDC, 0x15, 0xBA, 0x3E, 0x7D, 0x95, 0x3B, 0x2F
|
||||
};
|
||||
// Clone
|
||||
// Fudan Semiconductor FM17522 (0x88)
|
||||
const byte FM17522_firmware_reference[] PROGMEM = {
|
||||
0x00, 0xD6, 0x78, 0x8C, 0xE2, 0xAA, 0x0C, 0x18,
|
||||
0x2A, 0xB8, 0x7A, 0x7F, 0xD3, 0x6A, 0xCF, 0x0B,
|
||||
0xB1, 0x37, 0x63, 0x4B, 0x69, 0xAE, 0x91, 0xC7,
|
||||
0xC3, 0x97, 0xAE, 0x77, 0xF4, 0x37, 0xD7, 0x9B,
|
||||
0x7C, 0xF5, 0x3C, 0x11, 0x8F, 0x15, 0xC3, 0xD7,
|
||||
0xC1, 0x5B, 0x00, 0x2A, 0xD0, 0x75, 0xDE, 0x9E,
|
||||
0x51, 0x64, 0xAB, 0x3E, 0xE9, 0x15, 0xB5, 0xAB,
|
||||
0x56, 0x9A, 0x98, 0x82, 0x26, 0xEA, 0x2A, 0x62
|
||||
};
|
||||
|
||||
class MFRC522 {
|
||||
public:
|
||||
// Size of the MFRC522 FIFO
|
||||
static constexpr byte FIFO_SIZE = 64; // The FIFO is 64 bytes.
|
||||
// Default value for unused pin
|
||||
static constexpr uint8_t UNUSED_PIN = UINT8_MAX;
|
||||
|
||||
// MFRC522 registers. Described in chapter 9 of the datasheet.
|
||||
// When using SPI all addresses are shifted one bit left in the "SPI address byte" (section 8.1.2.3)
|
||||
enum PCD_Register : byte {
|
||||
// Page 0: Command and status
|
||||
// 0x00 // reserved for future use
|
||||
CommandReg = 0x01 << 1, // starts and stops command execution
|
||||
ComIEnReg = 0x02 << 1, // enable and disable interrupt request control bits
|
||||
DivIEnReg = 0x03 << 1, // enable and disable interrupt request control bits
|
||||
ComIrqReg = 0x04 << 1, // interrupt request bits
|
||||
DivIrqReg = 0x05 << 1, // interrupt request bits
|
||||
ErrorReg = 0x06 << 1, // error bits showing the error status of the last command executed
|
||||
Status1Reg = 0x07 << 1, // communication status bits
|
||||
Status2Reg = 0x08 << 1, // receiver and transmitter status bits
|
||||
FIFODataReg = 0x09 << 1, // input and output of 64 byte FIFO buffer
|
||||
FIFOLevelReg = 0x0A << 1, // number of bytes stored in the FIFO buffer
|
||||
WaterLevelReg = 0x0B << 1, // level for FIFO underflow and overflow warning
|
||||
ControlReg = 0x0C << 1, // miscellaneous control registers
|
||||
BitFramingReg = 0x0D << 1, // adjustments for bit-oriented frames
|
||||
CollReg = 0x0E << 1, // bit position of the first bit-collision detected on the RF interface
|
||||
// 0x0F // reserved for future use
|
||||
|
||||
// Page 1: Command
|
||||
// 0x10 // reserved for future use
|
||||
ModeReg = 0x11 << 1, // defines general modes for transmitting and receiving
|
||||
TxModeReg = 0x12 << 1, // defines transmission data rate and framing
|
||||
RxModeReg = 0x13 << 1, // defines reception data rate and framing
|
||||
TxControlReg = 0x14 << 1, // controls the logical behavior of the antenna driver pins TX1 and TX2
|
||||
TxASKReg = 0x15 << 1, // controls the setting of the transmission modulation
|
||||
TxSelReg = 0x16 << 1, // selects the internal sources for the antenna driver
|
||||
RxSelReg = 0x17 << 1, // selects internal receiver settings
|
||||
RxThresholdReg = 0x18 << 1, // selects thresholds for the bit decoder
|
||||
DemodReg = 0x19 << 1, // defines demodulator settings
|
||||
// 0x1A // reserved for future use
|
||||
// 0x1B // reserved for future use
|
||||
MfTxReg = 0x1C << 1, // controls some MIFARE communication transmit parameters
|
||||
MfRxReg = 0x1D << 1, // controls some MIFARE communication receive parameters
|
||||
// 0x1E // reserved for future use
|
||||
SerialSpeedReg = 0x1F << 1, // selects the speed of the serial UART interface
|
||||
|
||||
// Page 2: Configuration
|
||||
// 0x20 // reserved for future use
|
||||
CRCResultRegH = 0x21 << 1, // shows the MSB and LSB values of the CRC calculation
|
||||
CRCResultRegL = 0x22 << 1,
|
||||
// 0x23 // reserved for future use
|
||||
ModWidthReg = 0x24 << 1, // controls the ModWidth setting?
|
||||
// 0x25 // reserved for future use
|
||||
RFCfgReg = 0x26 << 1, // configures the receiver gain
|
||||
GsNReg = 0x27 << 1, // selects the conductance of the antenna driver pins TX1 and TX2 for modulation
|
||||
CWGsPReg = 0x28 << 1, // defines the conductance of the p-driver output during periods of no modulation
|
||||
ModGsPReg = 0x29 << 1, // defines the conductance of the p-driver output during periods of modulation
|
||||
TModeReg = 0x2A << 1, // defines settings for the internal timer
|
||||
TPrescalerReg = 0x2B << 1, // the lower 8 bits of the TPrescaler value. The 4 high bits are in TModeReg.
|
||||
TReloadRegH = 0x2C << 1, // defines the 16-bit timer reload value
|
||||
TReloadRegL = 0x2D << 1,
|
||||
TCounterValueRegH = 0x2E << 1, // shows the 16-bit timer value
|
||||
TCounterValueRegL = 0x2F << 1,
|
||||
|
||||
// Page 3: Test Registers
|
||||
// 0x30 // reserved for future use
|
||||
TestSel1Reg = 0x31 << 1, // general test signal configuration
|
||||
TestSel2Reg = 0x32 << 1, // general test signal configuration
|
||||
TestPinEnReg = 0x33 << 1, // enables pin output driver on pins D1 to D7
|
||||
TestPinValueReg = 0x34 << 1, // defines the values for D1 to D7 when it is used as an I/O bus
|
||||
TestBusReg = 0x35 << 1, // shows the status of the internal test bus
|
||||
AutoTestReg = 0x36 << 1, // controls the digital self-test
|
||||
VersionReg = 0x37 << 1, // shows the software version
|
||||
AnalogTestReg = 0x38 << 1, // controls the pins AUX1 and AUX2
|
||||
TestDAC1Reg = 0x39 << 1, // defines the test value for TestDAC1
|
||||
TestDAC2Reg = 0x3A << 1, // defines the test value for TestDAC2
|
||||
TestADCReg = 0x3B << 1 // shows the value of ADC I and Q channels
|
||||
// 0x3C // reserved for production tests
|
||||
// 0x3D // reserved for production tests
|
||||
// 0x3E // reserved for production tests
|
||||
// 0x3F // reserved for production tests
|
||||
};
|
||||
|
||||
// MFRC522 commands. Described in chapter 10 of the datasheet.
|
||||
enum PCD_Command : byte {
|
||||
PCD_Idle = 0x00, // no action, cancels current command execution
|
||||
PCD_Mem = 0x01, // stores 25 bytes into the internal buffer
|
||||
PCD_GenerateRandomID = 0x02, // generates a 10-byte random ID number
|
||||
PCD_CalcCRC = 0x03, // activates the CRC coprocessor or performs a self-test
|
||||
PCD_Transmit = 0x04, // transmits data from the FIFO buffer
|
||||
PCD_NoCmdChange = 0x07, // no command change, can be used to modify the CommandReg register bits without affecting the command, for example, the PowerDown bit
|
||||
PCD_Receive = 0x08, // activates the receiver circuits
|
||||
PCD_Transceive = 0x0C, // transmits data from FIFO buffer to antenna and automatically activates the receiver after transmission
|
||||
PCD_MFAuthent = 0x0E, // performs the MIFARE standard authentication as a reader
|
||||
PCD_SoftReset = 0x0F // resets the MFRC522
|
||||
};
|
||||
|
||||
// MFRC522 RxGain[2:0] masks, defines the receiver's signal voltage gain factor (on the PCD).
|
||||
// Described in 9.3.3.6 / table 98 of the datasheet at http://www.nxp.com/documents/data_sheet/MFRC522.pdf
|
||||
enum PCD_RxGain : byte {
|
||||
RxGain_18dB = 0x00 << 4, // 000b - 18 dB, minimum
|
||||
RxGain_23dB = 0x01 << 4, // 001b - 23 dB
|
||||
RxGain_18dB_2 = 0x02 << 4, // 010b - 18 dB, it seems 010b is a duplicate for 000b
|
||||
RxGain_23dB_2 = 0x03 << 4, // 011b - 23 dB, it seems 011b is a duplicate for 001b
|
||||
RxGain_33dB = 0x04 << 4, // 100b - 33 dB, average, and typical default
|
||||
RxGain_38dB = 0x05 << 4, // 101b - 38 dB
|
||||
RxGain_43dB = 0x06 << 4, // 110b - 43 dB
|
||||
RxGain_48dB = 0x07 << 4, // 111b - 48 dB, maximum
|
||||
RxGain_min = 0x00 << 4, // 000b - 18 dB, minimum, convenience for RxGain_18dB
|
||||
RxGain_avg = 0x04 << 4, // 100b - 33 dB, average, convenience for RxGain_33dB
|
||||
RxGain_max = 0x07 << 4 // 111b - 48 dB, maximum, convenience for RxGain_48dB
|
||||
};
|
||||
|
||||
// Commands sent to the PICC.
|
||||
enum PICC_Command : byte {
|
||||
// The commands used by the PCD to manage communication with several PICCs (ISO 14443-3, Type A, section 6.4)
|
||||
PICC_CMD_REQA = 0x26, // REQuest command, Type A. Invites PICCs in state IDLE to go to READY and prepare for anticollision or selection. 7 bit frame.
|
||||
PICC_CMD_WUPA = 0x52, // Wake-UP command, Type A. Invites PICCs in state IDLE and HALT to go to READY(*) and prepare for anticollision or selection. 7 bit frame.
|
||||
PICC_CMD_CT = 0x88, // Cascade Tag. Not really a command, but used during anti collision.
|
||||
PICC_CMD_SEL_CL1 = 0x93, // Anti collision/Select, Cascade Level 1
|
||||
PICC_CMD_SEL_CL2 = 0x95, // Anti collision/Select, Cascade Level 2
|
||||
PICC_CMD_SEL_CL3 = 0x97, // Anti collision/Select, Cascade Level 3
|
||||
PICC_CMD_HLTA = 0x50, // HaLT command, Type A. Instructs an ACTIVE PICC to go to state HALT.
|
||||
PICC_CMD_RATS = 0xE0, // Request command for Answer To Reset.
|
||||
// The commands used for MIFARE Classic (from http://www.mouser.com/ds/2/302/MF1S503x-89574.pdf, Section 9)
|
||||
// Use PCD_MFAuthent to authenticate access to a sector, then use these commands to read/write/modify the blocks on the sector.
|
||||
// The read/write commands can also be used for MIFARE Ultralight.
|
||||
PICC_CMD_MF_AUTH_KEY_A = 0x60, // Perform authentication with Key A
|
||||
PICC_CMD_MF_AUTH_KEY_B = 0x61, // Perform authentication with Key B
|
||||
PICC_CMD_MF_READ = 0x30, // Reads one 16 byte block from the authenticated sector of the PICC. Also used for MIFARE Ultralight.
|
||||
PICC_CMD_MF_WRITE = 0xA0, // Writes one 16 byte block to the authenticated sector of the PICC. Called "COMPATIBILITY WRITE" for MIFARE Ultralight.
|
||||
PICC_CMD_MF_DECREMENT = 0xC0, // Decrements the contents of a block and stores the result in the internal data register.
|
||||
PICC_CMD_MF_INCREMENT = 0xC1, // Increments the contents of a block and stores the result in the internal data register.
|
||||
PICC_CMD_MF_RESTORE = 0xC2, // Reads the contents of a block into the internal data register.
|
||||
PICC_CMD_MF_TRANSFER = 0xB0, // Writes the contents of the internal data register to a block.
|
||||
// The commands used for MIFARE Ultralight (from http://www.nxp.com/documents/data_sheet/MF0ICU1.pdf, Section 8.6)
|
||||
// The PICC_CMD_MF_READ and PICC_CMD_MF_WRITE can also be used for MIFARE Ultralight.
|
||||
PICC_CMD_UL_WRITE = 0xA2 // Writes one 4 byte page to the PICC.
|
||||
};
|
||||
|
||||
// MIFARE constants that does not fit anywhere else
|
||||
enum MIFARE_Misc {
|
||||
MF_ACK = 0xA, // The MIFARE Classic uses a 4 bit ACK/NAK. Any other value than 0xA is NAK.
|
||||
MF_KEY_SIZE = 6 // A Mifare Crypto1 key is 6 bytes.
|
||||
};
|
||||
|
||||
// PICC types we can detect. Remember to update PICC_GetTypeName() if you add more.
|
||||
// last value set to 0xff, then compiler uses less ram, it seems some optimisations are triggered
|
||||
enum PICC_Type : byte {
|
||||
PICC_TYPE_UNKNOWN ,
|
||||
PICC_TYPE_ISO_14443_4 , // PICC compliant with ISO/IEC 14443-4
|
||||
PICC_TYPE_ISO_18092 , // PICC compliant with ISO/IEC 18092 (NFC)
|
||||
PICC_TYPE_MIFARE_MINI , // MIFARE Classic protocol, 320 bytes
|
||||
PICC_TYPE_MIFARE_1K , // MIFARE Classic protocol, 1KB
|
||||
PICC_TYPE_MIFARE_4K , // MIFARE Classic protocol, 4KB
|
||||
PICC_TYPE_MIFARE_UL , // MIFARE Ultralight or Ultralight C
|
||||
PICC_TYPE_MIFARE_PLUS , // MIFARE Plus
|
||||
PICC_TYPE_MIFARE_DESFIRE, // MIFARE DESFire
|
||||
PICC_TYPE_TNP3XXX , // Only mentioned in NXP AN 10833 MIFARE Type Identification Procedure
|
||||
PICC_TYPE_NOT_COMPLETE = 0xff // SAK indicates UID is not complete.
|
||||
};
|
||||
|
||||
// Return codes from the functions in this class. Remember to update GetStatusCodeName() if you add more.
|
||||
// last value set to 0xff, then compiler uses less ram, it seems some optimisations are triggered
|
||||
enum StatusCode : byte {
|
||||
STATUS_OK , // Success
|
||||
STATUS_ERROR , // Error in communication
|
||||
STATUS_COLLISION , // Collission detected
|
||||
STATUS_TIMEOUT , // Timeout in communication.
|
||||
STATUS_NO_ROOM , // A buffer is not big enough.
|
||||
STATUS_INTERNAL_ERROR , // Internal error in the code. Should not happen ;-)
|
||||
STATUS_INVALID , // Invalid argument.
|
||||
STATUS_CRC_WRONG , // The CRC_A does not match
|
||||
STATUS_MIFARE_NACK = 0xff // A MIFARE PICC responded with NAK.
|
||||
};
|
||||
|
||||
// A struct used for passing the UID of a PICC.
|
||||
typedef struct {
|
||||
byte size; // Number of bytes in the UID. 4, 7 or 10.
|
||||
byte uidByte[10];
|
||||
byte sak; // The SAK (Select acknowledge) byte returned from the PICC after successful selection.
|
||||
} Uid;
|
||||
|
||||
// A struct used for passing a MIFARE Crypto1 key
|
||||
typedef struct {
|
||||
byte keyByte[MF_KEY_SIZE];
|
||||
} MIFARE_Key;
|
||||
|
||||
// Member variables
|
||||
Uid uid; // Used by PICC_ReadCardSerial().
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Functions for setting up the Arduino
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
MFRC522();
|
||||
MFRC522(byte resetPowerDownPin);
|
||||
MFRC522(byte chipSelectPin, byte resetPowerDownPin);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Basic interface functions for communicating with the MFRC522
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
void PCD_WriteRegister(PCD_Register reg, byte value);
|
||||
void PCD_WriteRegister(PCD_Register reg, byte count, byte *values);
|
||||
byte PCD_ReadRegister(PCD_Register reg);
|
||||
void PCD_ReadRegister(PCD_Register reg, byte count, byte *values, byte rxAlign = 0);
|
||||
void PCD_SetRegisterBitMask(PCD_Register reg, byte mask);
|
||||
void PCD_ClearRegisterBitMask(PCD_Register reg, byte mask);
|
||||
StatusCode PCD_CalculateCRC(byte *data, byte length, byte *result);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Functions for manipulating the MFRC522
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
void PCD_Init();
|
||||
void PCD_Init(byte resetPowerDownPin);
|
||||
void PCD_Init(byte chipSelectPin, byte resetPowerDownPin);
|
||||
void PCD_Reset();
|
||||
void PCD_AntennaOn();
|
||||
void PCD_AntennaOff();
|
||||
byte PCD_GetAntennaGain();
|
||||
void PCD_SetAntennaGain(byte mask);
|
||||
bool PCD_PerformSelfTest();
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Power control functions
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
void PCD_SoftPowerDown();
|
||||
void PCD_SoftPowerUp();
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Functions for communicating with PICCs
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
StatusCode PCD_TransceiveData(byte *sendData, byte sendLen, byte *backData, byte *backLen, byte *validBits = nullptr, byte rxAlign = 0, bool checkCRC = false);
|
||||
StatusCode PCD_CommunicateWithPICC(byte command, byte waitIRq, byte *sendData, byte sendLen, byte *backData = nullptr, byte *backLen = nullptr, byte *validBits = nullptr, byte rxAlign = 0, bool checkCRC = false);
|
||||
StatusCode PICC_RequestA(byte *bufferATQA, byte *bufferSize);
|
||||
StatusCode PICC_WakeupA(byte *bufferATQA, byte *bufferSize);
|
||||
StatusCode PICC_REQA_or_WUPA(byte command, byte *bufferATQA, byte *bufferSize);
|
||||
virtual StatusCode PICC_Select(Uid *uid, byte validBits = 0);
|
||||
StatusCode PICC_HaltA();
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Functions for communicating with MIFARE PICCs
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
StatusCode PCD_Authenticate(byte command, byte blockAddr, MIFARE_Key *key, Uid *uid);
|
||||
void PCD_StopCrypto1();
|
||||
StatusCode MIFARE_Read(byte blockAddr, byte *buffer, byte *bufferSize);
|
||||
StatusCode MIFARE_Write(byte blockAddr, byte *buffer, byte bufferSize);
|
||||
StatusCode MIFARE_Ultralight_Write(byte page, byte *buffer, byte bufferSize);
|
||||
StatusCode MIFARE_Decrement(byte blockAddr, int32_t delta);
|
||||
StatusCode MIFARE_Increment(byte blockAddr, int32_t delta);
|
||||
StatusCode MIFARE_Restore(byte blockAddr);
|
||||
StatusCode MIFARE_Transfer(byte blockAddr);
|
||||
StatusCode MIFARE_GetValue(byte blockAddr, int32_t *value);
|
||||
StatusCode MIFARE_SetValue(byte blockAddr, int32_t value);
|
||||
StatusCode PCD_NTAG216_AUTH(byte *passWord, byte pACK[]);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Support functions
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
StatusCode PCD_MIFARE_Transceive(byte *sendData, byte sendLen, bool acceptTimeout = false);
|
||||
// old function used too much memory, now name moved to flash; if you need char, copy from flash to memory
|
||||
//const char *GetStatusCodeName(byte code);
|
||||
static const __FlashStringHelper *GetStatusCodeName(StatusCode code);
|
||||
static PICC_Type PICC_GetType(byte sak);
|
||||
// old function used too much memory, now name moved to flash; if you need char, copy from flash to memory
|
||||
//const char *PICC_GetTypeName(byte type);
|
||||
static const __FlashStringHelper *PICC_GetTypeName(PICC_Type type);
|
||||
|
||||
// Support functions for debuging
|
||||
void PCD_DumpVersionToSerial();
|
||||
void PICC_DumpToSerial(Uid *uid);
|
||||
void PICC_DumpDetailsToSerial(Uid *uid);
|
||||
void PICC_DumpMifareClassicToSerial(Uid *uid, PICC_Type piccType, MIFARE_Key *key);
|
||||
void PICC_DumpMifareClassicSectorToSerial(Uid *uid, MIFARE_Key *key, byte sector);
|
||||
void PICC_DumpMifareUltralightToSerial();
|
||||
|
||||
// Advanced functions for MIFARE
|
||||
void MIFARE_SetAccessBits(byte *accessBitBuffer, byte g0, byte g1, byte g2, byte g3);
|
||||
bool MIFARE_OpenUidBackdoor(bool logErrors);
|
||||
bool MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors);
|
||||
bool MIFARE_UnbrickUidSector(bool logErrors);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Convenience functions - does not add extra functionality
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
virtual bool PICC_IsNewCardPresent();
|
||||
virtual bool PICC_ReadCardSerial();
|
||||
|
||||
protected:
|
||||
byte _chipSelectPin; // Arduino pin connected to MFRC522's SPI slave select input (Pin 24, NSS, active low)
|
||||
byte _resetPowerDownPin; // Arduino pin connected to MFRC522's reset and power down input (Pin 6, NRSTPD, active low)
|
||||
StatusCode MIFARE_TwoStepHelper(byte command, byte blockAddr, int32_t data);
|
||||
};
|
||||
|
||||
#endif
|
1160
lib/lib_div/rfid-1.4.7/src/MFRC522Extended.cpp
Normal file
1160
lib/lib_div/rfid-1.4.7/src/MFRC522Extended.cpp
Normal file
File diff suppressed because it is too large
Load Diff
120
lib/lib_div/rfid-1.4.7/src/MFRC522Extended.h
Normal file
120
lib/lib_div/rfid-1.4.7/src/MFRC522Extended.h
Normal file
@ -0,0 +1,120 @@
|
||||
/**
|
||||
* Library extends MFRC522.h to support RATS for ISO-14443-4 PICC.
|
||||
* RATS - Request for Answer To Select.
|
||||
* @author JPG-Consulting
|
||||
*/
|
||||
#ifndef MFRC522Extended_h
|
||||
#define MFRC522Extended_h
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "MFRC522.h"
|
||||
|
||||
class MFRC522Extended : public MFRC522 {
|
||||
|
||||
public:
|
||||
// ISO/IEC 14443-4 bit rates
|
||||
enum TagBitRates : byte {
|
||||
BITRATE_106KBITS = 0x00,
|
||||
BITRATE_212KBITS = 0x01,
|
||||
BITRATE_424KBITS = 0x02,
|
||||
BITRATE_848KBITS = 0x03
|
||||
};
|
||||
|
||||
// Structure to store ISO/IEC 14443-4 ATS
|
||||
typedef struct {
|
||||
byte size;
|
||||
byte fsc; // Frame size for proximity card
|
||||
|
||||
struct {
|
||||
bool transmitted;
|
||||
bool sameD; // Only the same D for both directions supported
|
||||
TagBitRates ds; // Send D
|
||||
TagBitRates dr; // Receive D
|
||||
} ta1;
|
||||
|
||||
struct {
|
||||
bool transmitted;
|
||||
byte fwi; // Frame waiting time integer
|
||||
byte sfgi; // Start-up frame guard time integer
|
||||
} tb1;
|
||||
|
||||
struct {
|
||||
bool transmitted;
|
||||
bool supportsCID;
|
||||
bool supportsNAD;
|
||||
} tc1;
|
||||
|
||||
// Raw data from ATS
|
||||
byte data[FIFO_SIZE - 2]; // ATS cannot be bigger than FSD - 2 bytes (CRC), according to ISO 14443-4 5.2.2
|
||||
} Ats;
|
||||
|
||||
// A struct used for passing the PICC information
|
||||
typedef struct {
|
||||
uint16_t atqa;
|
||||
Uid uid;
|
||||
Ats ats;
|
||||
|
||||
// For Block PCB
|
||||
bool blockNumber;
|
||||
} TagInfo;
|
||||
|
||||
// A struct used for passing PCB Block
|
||||
typedef struct {
|
||||
struct {
|
||||
byte pcb;
|
||||
byte cid;
|
||||
byte nad;
|
||||
} prologue;
|
||||
struct {
|
||||
byte size;
|
||||
byte *data;
|
||||
} inf;
|
||||
} PcbBlock;
|
||||
|
||||
// Member variables
|
||||
TagInfo tag;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Contructors
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
MFRC522Extended() : MFRC522() {};
|
||||
MFRC522Extended(uint8_t rst) : MFRC522(rst) {};
|
||||
MFRC522Extended(uint8_t ss, uint8_t rst) : MFRC522(ss, rst) {};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Functions for communicating with PICCs
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
StatusCode PICC_Select(Uid *uid, byte validBits = 0) override; // overrride
|
||||
StatusCode PICC_RequestATS(Ats *ats);
|
||||
StatusCode PICC_PPS(); // PPS command without bitrate parameter
|
||||
StatusCode PICC_PPS(TagBitRates sendBitRate, TagBitRates receiveBitRate); // Different D values
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Functions for communicating with ISO/IEC 14433-4 cards
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
StatusCode TCL_Transceive(PcbBlock *send, PcbBlock *back);
|
||||
StatusCode TCL_Transceive(TagInfo * tag, byte *sendData, byte sendLen, byte *backData = NULL, byte *backLen = NULL);
|
||||
StatusCode TCL_TransceiveRBlock(TagInfo *tag, bool ack, byte *backData = NULL, byte *backLen = NULL);
|
||||
StatusCode TCL_Deselect(TagInfo *tag);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Support functions
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
static PICC_Type PICC_GetType(TagInfo *tag);
|
||||
using MFRC522::PICC_GetType;// // make old PICC_GetType(byte sak) available, otherwise would be hidden by PICC_GetType(TagInfo *tag)
|
||||
|
||||
// Support functions for debuging
|
||||
void PICC_DumpToSerial(TagInfo *tag);
|
||||
using MFRC522::PICC_DumpToSerial; // make old PICC_DumpToSerial(Uid *uid) available, otherwise would be hidden by PICC_DumpToSerial(TagInfo *tag)
|
||||
void PICC_DumpDetailsToSerial(TagInfo *tag);
|
||||
using MFRC522::PICC_DumpDetailsToSerial; // make old PICC_DumpDetailsToSerial(Uid *uid) available, otherwise would be hidden by PICC_DumpDetailsToSerial(TagInfo *tag)
|
||||
void PICC_DumpISO14443_4(TagInfo *tag);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// Convenience functions - does not add extra functionality
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
bool PICC_IsNewCardPresent() override; // overrride
|
||||
bool PICC_ReadCardSerial() override; // overrride
|
||||
};
|
||||
|
||||
#endif
|
20
lib/lib_div/rfid-1.4.7/src/deprecated.h
Normal file
20
lib/lib_div/rfid-1.4.7/src/deprecated.h
Normal file
@ -0,0 +1,20 @@
|
||||
/**
|
||||
* Copyright (c) 2016 by Ludwig Grill (www.rotzbua.de)
|
||||
* Simple deprecated workaround for Arduino IDE
|
||||
* IDE 1.6.8 use gcc 4.8 which do not support c++14 [[deprecated]]
|
||||
* Later versions should support c++14, then use c++14 syntax
|
||||
*/
|
||||
#ifndef DEPRECATED_H
|
||||
#define DEPRECATED_H
|
||||
|
||||
#ifdef __has_cpp_attribute
|
||||
#if __has_cpp_attribute(deprecated)
|
||||
#define DEPRECATED [[deprecated]]
|
||||
#define DEPRECATED_MSG(msg) [[deprecated(msg)]]
|
||||
#endif // __has_cpp_attribute(deprecated)
|
||||
#else
|
||||
#define DEPRECATED __attribute__((deprecated))
|
||||
#define DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
|
||||
#endif // __has_cpp_attribute
|
||||
|
||||
#endif // DEPRECATED_H
|
12
lib/lib_div/rfid-1.4.7/src/require_cpp11.h
Normal file
12
lib/lib_div/rfid-1.4.7/src/require_cpp11.h
Normal file
@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Copyright (c) 2016 by Ludwig Grill (www.rotzbua.de)
|
||||
* Throws error if c++11 is not supported
|
||||
*/
|
||||
#ifndef REQUIRE_CPP11_H
|
||||
#define REQUIRE_CPP11_H
|
||||
|
||||
#if __cplusplus < 201103L
|
||||
#error "This library needs at least a C++11 compliant compiler, maybe compiler argument for C++11 support is missing or if you use Arduino IDE upgrade to version >=1.6.6"
|
||||
#endif
|
||||
|
||||
#endif // REQUIRE_CPP11_H
|
@ -18,6 +18,9 @@
|
||||
*/
|
||||
|
||||
#ifdef USE_PN532_HSU
|
||||
/*********************************************************************************************\
|
||||
* PN532 - 13.56 MHz RFID and NFC reader
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define XSNS_40 40
|
||||
|
||||
|
@ -20,6 +20,18 @@
|
||||
#ifdef USE_RC522
|
||||
/*********************************************************************************************\
|
||||
* MFRC522 - 13.56 MHz RFID reader
|
||||
*
|
||||
* Connections:
|
||||
* MFRC522 ESP8266 Tasmota
|
||||
* ------- -------------- ----------
|
||||
* SDA GPIO0..5,15,16 SPI CS
|
||||
* SCK GPIO14 SPI CLK
|
||||
* MOSI GPIO13 SPI MOSI
|
||||
* MISO GPIO12 SPI MISO
|
||||
* IRQ not used
|
||||
* Gnd Gnd
|
||||
* Rst GPIO0..5,15,16 RC522 Rst
|
||||
* 3V3 3V3
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define XSNS_80 80
|
||||
@ -30,8 +42,9 @@
|
||||
MFRC522 *Mfrc522;
|
||||
|
||||
struct RC522 {
|
||||
char uids[21]; // Number of bytes in the UID. 4, 7 or 10
|
||||
bool present = false;
|
||||
uint8_t scantimer = 0;
|
||||
uint8_t scantimer = 16;
|
||||
} Rc522;
|
||||
|
||||
void RC522ScanForTag(void) {
|
||||
@ -41,8 +54,7 @@ void RC522ScanForTag(void) {
|
||||
MFRC522::PICC_Type piccType = Mfrc522->PICC_GetType(Mfrc522->uid.sak);
|
||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR("MFR: Type %s"), Mfrc522->PICC_GetTypeName(piccType));
|
||||
|
||||
char uids[21]; // Number of bytes in the UID. 4, 7 or 10
|
||||
ToHex_P((unsigned char*)Mfrc522->uid.uidByte, Mfrc522->uid.size, uids, sizeof(uids));
|
||||
ToHex_P((unsigned char*)Mfrc522->uid.uidByte, Mfrc522->uid.size, Rc522.uids, sizeof(Rc522.uids));
|
||||
|
||||
#ifdef USE_RC522_DATA_FUNCTION
|
||||
bool didit = false;
|
||||
@ -70,15 +82,15 @@ void RC522ScanForTag(void) {
|
||||
}
|
||||
}
|
||||
didit = true;
|
||||
ResponseTime_P(PSTR(",\"MFRC522\":{\"UID\":\"%s\",\"" D_JSON_DATA "\":\"%s\"}}"), uids, card_datas);
|
||||
ResponseTime_P(PSTR(",\"MFRC522\":{\"UID\":\"%s\",\"" D_JSON_DATA "\":\"%s\"}}"), Rc522.uids, card_datas);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!didit) {
|
||||
ResponseTime_P(PSTR(",\"MFRC522\":{\"UID\":\"%s\"}}"), uids);
|
||||
ResponseTime_P(PSTR(",\"MFRC522\":{\"UID\":\"%s\"}}"), Rc522.uids);
|
||||
}
|
||||
#else
|
||||
ResponseTime_P(PSTR(",\"MFRC522\":{\"UID\":\"%s\"}}"), uids);
|
||||
ResponseTime_P(PSTR(",\"MFRC522\":{\"UID\":\"%s\"}}"), Rc522.uids);
|
||||
#endif
|
||||
MqttPublishTeleSensor();
|
||||
|
||||
@ -103,11 +115,19 @@ void RC522Init(void) {
|
||||
case 0x00: case 0xFF: strcpy_P(ver, PSTR("fail")); break;
|
||||
}
|
||||
AddLog_P(LOG_LEVEL_INFO, PSTR("MFR: MFRC522 Rfid reader %s"), ver);
|
||||
uint8_t empty_uid[4] = { 0 };
|
||||
ToHex_P((unsigned char*)empty_uid, sizeof(empty_uid), Rc522.uids, sizeof(Rc522.uids));
|
||||
Rc522.present = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_WEBSERVER
|
||||
void RC522Show(void) {
|
||||
WSContentSend_PD(PSTR("{s}MFRC522 UID{m}%s {e}"), Rc522.uids);
|
||||
}
|
||||
#endif // USE_WEBSERVER
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Interface
|
||||
\*********************************************************************************************/
|
||||
@ -128,6 +148,11 @@ bool Xsns80(uint8_t function)
|
||||
RC522ScanForTag();
|
||||
}
|
||||
break;
|
||||
#ifdef USE_WEBSERVER
|
||||
case FUNC_WEB_SENSOR:
|
||||
RC522Show();
|
||||
break;
|
||||
#endif // USE_WEBSERVER
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
Loading…
x
Reference in New Issue
Block a user