Énigme d'Escape Game - Carte magnétique et carte au trésor

Auteur avatarPierre Touchard | Dernière modification 6/11/2024 par Pierre Touchard

Nigme d Escape Game - Carte magn tique et carte au tr sor WhatsApp Image 2024-11-06 at 15.44.55.jpeg
Vous avez un trésor à faire trouver et pour cela, quoi de mieux qu’une carte au trésor ? Celle-ci sera électronique et ne pourra être lu que par le détenteur du bon badge !
Licence : Attribution (CC-BY)

Introduction

Le code a été conçu en utilisant les codes et montages présents sur les sites suivants:


https://retroetgeek.com/arduino/arduino-rfid-rc522/


https://randomnerdtutorials.com/guide-for-oled-display-with-arduino/




Étape 1 - Réaliser

Réaliser le montage suivant




Étape 2 - Lancer

Lancer le logiciel Arduino

Étape 3 - Copier

Copier/code suivant dans le programme permettant d’utiliser Arduino :


// Inspiré des codes du site https://retroetgeek.com/arduino/arduino-rfid-rc522/ et ceux du site https://randomnerdtutorials.com/guide-for-oled-display-with-arduino/

#include "SPI.h"

#include "MFRC522.h"

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#include <Fonts/FreeSerif9pt7b.h>

#define RST_PIN  9 // RES pin

#define SS_PIN  10 // SDA (SS) pin

#define SCREEN_WIDTH 128 // OLED display width, in pixels

#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define ORG 3

#define GRN 4

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

MFRC522 mfrc522(SS_PIN, RST_PIN);

//keyOk ets l'ensemble des valeurs de la clé UID de la carte que l'on veut définir comme valide

String keyOk[]={"39 11 d1 59"};

void setup() {

  display.clearDisplay();

  pinMode(GRN, OUTPUT);

   pinMode(ORG, OUTPUT);

   Serial.begin(9600);

   SPI.begin();

   mfrc522.PCD_Init();

   delay(4);

   //mfrc522.PCD_DumpVersionToSerial();

  //Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));

   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

    //Serial.println("SSD1306 allocation failed");

    display.clearDisplay();

    for(;;);

  }

}

void loop() {

   // réinitialiser le cycle s'il n'y a pas de carte sur le lecteur

   if ( ! mfrc522.PICC_IsNewCardPresent()) {

      display.clearDisplay();

      return;

   }

   if ( ! mfrc522.PICC_ReadCardSerial()) {

      display.clearDisplay();

      return;

     

   }

   //Ecrire la clé UID sur le moniteur série

   //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

   // recuperation de l'UID et concaténation de sa valeur en hex dans un string

  String myKey=String(mfrc522.uid.uidByte[0],HEX) + " " + String(mfrc522.uid.uidByte[1],HEX) + " " + String(mfrc522.uid.uidByte[2],HEX) + " " + String(mfrc522.uid.uidByte[3],HEX);


  //Booléen qui définit si la carte est valide (1) ou non (0)

  bool accessOk = 0;


// Si chaque valeur de la clé UID de la carte correspond à une clé UID valide, alors accessOk = 1 (On définit que la carte est valide)

for(int y = 0; y < (sizeof(keyOk)/sizeof(String)) ; y++){

  if(keyOk[y] == myKey){

    accessOk = 1;

  }

}

//Si la carte est valide, alors on affiche le plan et le texte

if(accessOk == 1){

   delay(500);

   digitalWrite(GRN, HIGH);

  digitalWrite(ORG, LOW);

  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(0, 2);

  // Display static text

  //Ecrire "Bonne carte!" aux coordonnées 0,2 de l'écran

  display.println("Bonne carte!");

  //Affiche un rectangle qui représente la table au centre de la pièce

  display.drawRect(50, 20, 50, 30, WHITE);

  //Affiche les lignes aux bords de l'écran qui représentent les murs

  display.drawLine(0, 0, 127, 0, WHITE);

  //Le décalage en X entre les deux prochaines lignes laisse un espace vide qui représente la porte

  display.drawLine(0, 0, 0, 38, WHITE);

  display.drawLine(0, 58, 0, 63, WHITE);

  //Affiche les lignes aux bords de l'écran qui représentent les murs

  display.drawLine(127, 0, 127, 63, WHITE);

  display.drawLine(0, 63, 127, 63, WHITE);

  /*Affiche progressivement le trajet à suivre dans la pièce.

  Des tirets représentent le chemin à suivre et une croix représente ce que l'on cherche*/

  display.drawLine(0, 48, 5, 48, WHITE); //Affiche un tiret, c'est à dire une ligne courte

  display.display();// Affiche sur l'écran tous les élements, en ajoutant ceux qu'on a définit depuis le dernier "display.display();"

  delay(500); //Applique un délais de 500 ms avant le prochain affichage.


// On recommence ces 3 lignes en changeant les coordonnées pour chaque tiret

  display.drawLine(10, 48, 15, 48, WHITE);//Affiche un nouveau tiret, c'est à dire une ligne courte

  display.display();//Affiche la même chose qu'au dernier "display.display(); avec le nouveau tiret en plus"

  delay(500);

  display.display();

  display.drawLine(20, 48, 25, 48, WHITE);

  display.display();

  delay(500);

  display.drawLine(30, 48, 35, 48, WHITE);

  display.display();

  delay(500);

  display.drawLine(40, 48, 40, 53, WHITE);

  display.display();

  delay(500);

  display.drawLine(45, 58, 50, 58, WHITE);

  display.display();

  delay(500);

  display.drawLine(55, 58, 60, 58, WHITE);

  display.display();

  delay(500);

  display.drawLine(65, 58, 70, 58, WHITE);

  display.display();

  delay(500);

  display.drawLine(75, 58, 80, 58, WHITE);

  display.display();

  delay(500);

  display.drawLine(85, 58, 90, 58, WHITE);

  display.display();

  delay(500);

  display.drawLine(95, 58, 100, 58, WHITE);

  display.display();

  delay(500);

// Ici on affiche 2 tirets qui se croisent afin de faire une croix

  display.drawLine(105, 53, 115, 63, WHITE);

  display.drawLine(115, 53, 105, 63, WHITE);

  display.display();

}

//Si la carte n'est pas valide, alors on affiche seulement "Mauvaise carte" aux coordonnées 0,2 de l'écran et on n'affiche pas le plan

  else{

    digitalWrite(GRN, LOW);

  digitalWrite(ORG, HIGH);

   display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(0, 2);

  // Display static text

  display.println("Mauvaise carte!");

  display.display();

  }

   

}

Étape 4 - Brancher

Brancher l’Arduino sur un port USB de l’ordinateur.

Étape 5 - Cliquer

Cliquer sur l’image représentant une sorte de v, puis sur l’image représentant une flèche (le programme sera mis dans l’Arduino.

Étape 6 - Résultat

Attendre la fin du transfert.

Comment ça marche ?

Observations : que voit-on ?

Par défaut, l’écran n’affiche rien et les 2 leds sont éteintes. Si l’on passe un mauvais badge/carte, le message "Mauvaise carte!" s’affiche sur l’écran OLED mais pas la carte. De plus, la led orange s’allume.

Si on passe le bon badge/carte, le message "Bonne carte!" s’affiche ainsi que la carte. De plus, la led verte s’allume. L’affichage de cette carte n’est pas instantané mais suit une suite d’instructions entrecoupées de pauses.


Le code UID de la bonne carte/ou du bon badge est inscrit dans le code et peut être modifié.

Mise en garde : qu'est-ce qui pourrait faire rater l'expérience ?

Une erreur de branchement.


Certains composants électroniques Arduino nécessitent d’être soudés à des fils afin de fonctionner.


Se tromper dans les codages.




Applications : dans la vie de tous les jours

Les lecteurs RFID et cartes et badges magnétiques sont utilisés pour plusieurs usages. On peut citer par exemple certaines portes qui nécessitent un badge pour rentrer (dans des immeubles par exemple).


Dernière modification 6/11/2024 par user:Pierre Touchard.

Commentaires

Draft