N.B. Cet article a été mis à jour le 28 juillet 2019 afin d'ajouter les informations concernant l'ESP32.
Aujourd'hui, notre mission consistera à créer, au moyen d'un module RC522 et d'une carte ESP8266 ou ESP32, un système qui affichera dans une page web les 10 plus récentes détections de tags RFID.
Les informations présentées sur la page web seront, pour chaque détection: la date et l'heure de l'événement, et le numéro d'identification (UID) du tag.
Pour le développement de ce petit projet, j'ai utilisé ma carte Wemos D1, qui est rapidement devenue mon outil préféré pour le prototypage impliquant l'ESP8266. Bien entendu, vous pourrez réaliser le projet avec n'importe quel module ESP8266 (sauf l'ESP-01, qui comporte trop peu de broches GPIO).
Chaque tag RFID possède son propre numéro d'identification. Lorsque vous approchez le tag du module RC522, celui-ci détecte la présence du tag et capte son numéro d'identification.
Pour des projets RFID n'impliquant pas de communication Wi-Fi, vous pouvez consulter mes articles sur l'utilisation d'un détecteur RC522 avec un Arduino, un Raspberry Pi (python), un STM32 Nucleo (mbed) ou un MSP430 Launchpad (Energia).
Installation de la bibliothèque MFRC522
J'ai utilisé la bibliothèque MFRC522 de Miguel Balboa, qui est pleinement compatible avec l'ESP8266.
Connexions
Puisque le module RC522 utilise le protocole SPI, il est connecté à l'ESP8266 de la façon suivante:
- SDA du RC522 --- GPIO4 de l'ESP8266 ou de l'ESP32
- SCK du RC522 --- GPIO14 de l'ESP8266 ou GPIO18 de l'ESP32
- MOSI du RC522 --- GPIO13 de l'ESP8266 ou GPIO23 de l'ESP32
- MISO du RC522 -- GPIO12 de l'ESP8266 ou GPIO19 de l'ESP32
- IRQ du RC522 -- Pas connectée
- GND du RC522 -- GND
- RST du RC522 -- GPIO 5 de l'ESP8266 ou de l'ESP32
- 3.3 V du RC522 -- 3.3 V
Et voici un schéma des connexions sur une carte ESP32:
Vérification du bon fonctionnement du module
Avant d'aborder un programme plus élaboré, ce n'est pas une mauvaise idée d'utiliser un programme minimaliste qui nous permettra de vérifier rapidement le fonctionnement correct de notre module RC522.
Le sketch ci-dessous affiche dans le moniteur série l'UID (numéro d'identification) de chaque tag détecté. Il s'agit du même sketch que j'avais déjà utilisé pour une carte Arduino, la seule différence étant le numéro des broches assignées aux broches RST et SDA.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************************************************************** | |
Ce sketch permet de connaître l'IUD d'un tag RFID | |
branché à un ESP8266 ou un ESP32. | |
Utilisation de la bibliothèque MFRC522 par Miguel Balboa | |
https://electroniqueamateur.blogspot.com/2019/02/module-rfid-rc522-et-esp8266.html | |
*****************************************************************/ | |
#include <SPI.h> | |
#include <MFRC522.h> | |
const int pinRST = 5; // pin RST du module RC522 | |
const int pinSDA = 4; // pin SDA du module RC522 | |
MFRC522 rfid(pinSDA, pinRST); | |
void setup() | |
{ | |
SPI.begin(); | |
rfid.PCD_Init(); | |
Serial.begin(9600); | |
} | |
void loop() | |
{ | |
if (rfid.PICC_IsNewCardPresent()) // on a dédecté un tag | |
{ | |
if (rfid.PICC_ReadCardSerial()) // on a lu avec succès son contenu | |
{ | |
Serial.println("Voici l'UID de ce tag:"); | |
Serial.print("const byte bonUID["); | |
Serial.print(rfid.uid.size); | |
Serial.print("] = {"); | |
for (byte i = 0; i < rfid.uid.size; i++) | |
{ | |
Serial.print(rfid.uid.uidByte[i]); | |
if (i < rfid.uid.size - 1) | |
{ | |
Serial.print(", "); | |
} | |
else | |
Serial.println("};"); | |
} | |
Serial.println(); | |
delay (2000); | |
} | |
} | |
} |
Un sketch plus élaboré
Pour terminer, voici un sketch qui exploite beaucoup mieux les possibilités de l'ESP8266: il permet de consulter une page web qui affiche les 10 plus récents scans d'un tag RFID (une fois ouverte, cette page web se met à jour automatiquement toutes les 10 secondes).
Lors du démarrage du programme, l'adresse IP qui permet d'accéder à la page web est affichée dans le moniteur série.
Chaque fois qu'un tag RFID est scanné, l'ESP8266 mémorise son numéro d'identification (UID). Il communique également avec un serveur NTP afin de connaître l'heure exacte.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************************************************************** | |
Lecteur RFID RC522 et ESP8266 / ESP32 | |
On peut consulter, par l'entremise d'une page web, les | |
10 plus récentes lectures de tag RFID par le module RC522 | |
branché à un ESP8266 ou à un ESP32. | |
https://electroniqueamateur.blogspot.com/2019/02/module-rfid-rc522-et-esp8266.html | |
*****************************************************************/ | |
// pour le RC522: | |
#include <SPI.h> | |
#include <MFRC522.h> | |
// pour la communication WiFi | |
#if defined ARDUINO_ARCH_ESP8266 // s'il s'agit d'un ESP8266 | |
#include <ESP8266WiFi.h> | |
#include <ESP8266WebServer.h> | |
#elif defined ARDUINO_ARCH_ESP32 // s'il s'agit d'un ESP32 | |
#include "WiFi.h" | |
#include <WebServer.h> | |
#endif | |
#include <WiFiClient.h> | |
// pour l'affichage de la date et de l'heure | |
#include <time.h> | |
const char* ssid = "**********"; | |
const char* password = "**********"; | |
const int pinRST = 5; // pin RST du module RC522 : GPIO5 | |
const int pinSDA = 4; // pin SDA du module RC522 : GPIO4 | |
const int stockage_max = 10; //nombre maximal de données stockées dans UID et dateHeure | |
const int decalage = -5; // la valeur dépend de votre fuseau horaire. Essayez 2 pour la France. | |
int UID [stockage_max][4]; // variable contenant les plus récents UID scannés | |
time_t date_et_heure[stockage_max]; // tableau contenant le moment des plus récents scans | |
int nb_de_donnees = 0; // nombre de données déjà stockées dans UID et dateHeure | |
MFRC522 rfid(pinSDA, pinRST); | |
#if defined ARDUINO_ARCH_ESP8266 // s'il s'agit d'un ESP8266 | |
ESP8266WebServer serveur(80); | |
#elif defined ARDUINO_ARCH_ESP32 // s'il s'agit d'un ESP32 | |
WebServer serveur(80); | |
#endif | |
// Construction de la page web | |
void handle_root() { | |
struct tm * timeinfo; | |
String contenu; // les informations concernant les scans de tags RFID | |
for (int i = 0; i < stockage_max; i++) { | |
if (date_et_heure[i] != 0) | |
{ | |
timeinfo = localtime(&date_et_heure[i]); | |
contenu.concat( "<p> Date et heure: " + String(timeinfo->tm_mday) + "-" + String(timeinfo->tm_mon + 1) + "-" + String(timeinfo->tm_year + 1900) + " " + String(timeinfo->tm_hour) + ":" + String(timeinfo->tm_min) + ":" + String(timeinfo->tm_sec) + " Numéro: " + String(UID[i][0]) + " - " + String(UID[i][1]) + " - " + String(UID[i][2]) + " - " + String(UID[i][3]) + "</p>"); | |
} | |
} | |
serveur.send(200, "html", "<head> <title>ESP8266 et RFID</title> <meta http-equiv=Refresh content=10></head> " | |
"<body><H1>" + String(stockage_max) + " plus récents événements</H1>" | |
"<p>" + contenu + "<p>" | |
"<p>Visitez <a href=http://electroniqueamateur.blogspot.ca/>Électronique en Amateur</a>!</p></body>"); | |
delay(100); | |
} | |
// Initialisation du WiFi. Les progrès s'affichent dans le moniteur série | |
// pour faciliter le débogage, et pour connaître l'adresse IP de l'ESP8266. | |
void setup() | |
{ | |
SPI.begin(); | |
rfid.PCD_Init(); | |
Serial.begin(9600); | |
Serial.println(); | |
WiFi.begin(ssid, password); | |
Serial.print("Connexion au reseau WiFi"); | |
while (WiFi.status() != WL_CONNECTED) { | |
Serial.print("."); | |
delay(1000); | |
} | |
Serial.println(); | |
Serial.print("Nom du reseau WiFi: "); | |
Serial.println(ssid); | |
Serial.print("Adresse IP de la page web: "); | |
Serial.println(WiFi.localIP()); | |
serveur.on("/", handle_root); | |
serveur.begin(); | |
Serial.println("Le serveur web est en fonction."); | |
configTime(decalage * 3600, 0, "ca.pool.ntp.org"); //serveurs canadiens | |
// en Europe, essayez europe.pool.ntp.org ou fr.pool.ntp.org | |
Serial.print("Attente date et heure"); | |
while (time(nullptr) <= 100000) { | |
Serial.print("."); | |
delay(1000); | |
} | |
Serial.println(); | |
Serial.println("Pret."); | |
} | |
void loop() | |
{ | |
if (rfid.PICC_IsNewCardPresent()) // on a dédecté un tag | |
{ | |
if (rfid.PICC_ReadCardSerial()) // on a lu avec succès son contenu | |
{ | |
if (nb_de_donnees < stockage_max) { // il y a des lignes vides dans le tableau UID | |
for (int i = 0; i <= 3; i++) { | |
UID[nb_de_donnees][i] = rfid.uid.uidByte[i]; | |
} | |
time(&date_et_heure[nb_de_donnees]); // quelle heure est-il? | |
nb_de_donnees++; | |
} | |
else // le tableau UID est plein | |
{ | |
for (int i = 0; i < stockage_max - 1; i++) { // on décale toutes les infos d'une ligne | |
for (int j = 0; j <= 3; j++) { | |
UID[i][j] = UID[i + 1][j]; | |
} | |
date_et_heure[i] = date_et_heure[i + 1]; | |
} | |
for (int i = 0; i <= 3; i++) { | |
UID[stockage_max - 1][i] = rfid.uid.uidByte[i]; // on enregistre la nouvelle info | |
} | |
time(&date_et_heure[stockage_max - 1]); // quelle heure est-il? | |
} | |
delay (2000); // on veut éviter que le même tag soit scanné plusieurs fois | |
} | |
} | |
serveur.handleClient(); | |
} |
Bonjour ,je viens de faire cette application,
RépondreSupprimeravec Edge impossible d'avoir l'adresse 192 ect...
avec Chrome çà va sauf l'heure qui est moins 6 heures
cordialement JC
Pour éliminer le décalage de 6 heures, il s'agit de régler la constante "decalage" en fonction de votre lieu de résidence.
SupprimerCAN YU TEL ME WERE DO YU GET THAT esp8266 ON FRITZING ?
RépondreSupprimerJe l'ai trouvée sur Google.
Supprimerbonjour,
RépondreSupprimerc'est possible d'utiliser votre programme en incluant a une arduino uno ou mega un ESP8266 et un module rc522 ?
merci
ah oui et une autre question, si je veut envoyer une information a mon programme par wifi (esp8266) à l'arduino à partie de mon serveur web, comment dois- je faire ? en fait j'aimerais que par l'envoie d'une information a mon proggrame, une action s'execute.
RépondreSupprimervoila, sinon super site que je viens de decouvrir bravo
Bonjour, je veux réaliser le même type de projet mais avec l'esp32. J'ai trouver sur instructable un projet dans ce sens avec l'esp8266, seulement je ne comprends pas et je ne c'est pas si je peux l'adapter à l'esp32.
RépondreSupprimerMerci
Question bête... comment télécharger les programmes de vos sketch s ?
RépondreSupprimer