Notificateur connecté NFC-RFID (version 2)

par Fabien ·20/01/2023 · 2 vues
Notificateur connecté NFC-RFID (version 2)
Communautés : 🏭 Mobilab 66
Matériaux : PLA

Cet interrupteur connecté vous permettra de notifier les autres utilisateurs que votre FabLab est ouvert ou fermé grâce à une carte ou un badge NFC.

Matériel :

* Un ESP8266 (NodeMCU ou Wemos Mini D1)

* Une carte NFC

* Une platine NFC de type MRC-522

* Un anneau de Leds de type NéoPixel

Étapes du projet

  1. Étape 1

    Le boitier

    Un simple boitier rond, fendu sur le dessus pour laisser rentrer la carte NFC. Le disque se met devant et la platine NFC en appui derrière la fente pour permettre de détecter le passage de la carte.

    On remarque trois trous dans l'arrière du boitier pour fixer au mur et deux sur les côtés pour rendre les deux parties solidaires.


  2. Étape 2

    Le montage électronique

    Par rapport à la version 1 du boitier, il faut câbler le lecteur RFID. Attention, il y a deux versions qui se ressemblent beaucoup mais l'une est de mauvaise qualité et ne lit pas toutes les cartes RFID. Cela vient de la qualité de l'antenne dessus et des condensateurs dessus. Une méthode pour les reconnaître, l'écriture du nom des condensateurs et résistances sur la carte. Si les noms sont tous vers l'intérieur, du côté de contrôleur, vous êtes en possession d'une version de mauvaise qualité.

    RC522 - VCC --> 3,3V ESP8266

    RC522 - RST --> D1  ESP8266 (GPIO 5)

    RC522 - GND --> ESP8266

    RC522 - MISO --> D2 ESP8266 (GPIO 4)

    RC522 - MOSI --> D4 ESP8266 (GPIO 2)

    RC522 - SCK --> D3 ESP8266 (GPIO 0)

    RC522 - SDA (ou CS) --> D5 ESP8266 (GPIO 14)

    NEOPIXEL 5V --> 3,3V ESP8266

    NEOPIXEL GND --> G ESP8266

    NEOPIXEL DI (IN) --> D6 ESP8266 (GPIO)

    (Les couleurs représentent les fils sur le schéma de câblage)

  3. Étape 3

    Le code Python

    import mfrc522
    from os import uname import network, machine, time import urequests as requests import neopixel import network, machine, time  url_users='https://pastebin.com/raw/<CodeDuPastebin>' url_ntfy='http://ntfy.sh/<SujetAbonné>' url_ntfy_new='<http://ntfy.sh/<SujetNouvellesCartes>'
    #Nbre de led Neopixels 
    nbr_leds=16 
    #OnBoard led pour v茅rifier si l'esp se connecte 
    led = machine.Pin(2, machine.Pin.OUT) 
    #NeoPixel sur pin D6: 
    ring = neopixel.NeoPixel(machine.Pin(12), nbr\_leds) 
    couleurs=[(255, 102, 0), (255, 0, 102),(153, 51, 255),(0, 0, 255),(63, 255, 63)] #Petite animation de lancement 
    for c in couleurs:
           for k in range(nbr\_leds):
               ring[k] = c
               ring.write()
               time.sleep(0.1)
    sta_if=network.WLAN(network.STA\_IF) 
    if not sta_if.isconnected(): 
        sta_if.active(True) 
        sta_if.connect('SSID_DU_WIFI','MotDePasseDuWifi') 
        while not sta\_if.isconnected():
           pass 
    print(sta_if.ifconfig()) 
    users={} 
    try: 
      res = requests.get(url_users) 
      for user in (res.text).split('\n'): 
        users[user.split(':')[0]]=user.replace('\r','').split(':')[1] 
      print(users) 
    except: 
      c=(128,63,0) 
      for k in range(nbr\_leds): 
        ring[k] = c
        ring.write()
        time.sleep(0.1) 
      pass  
    #Sous la forme : sck, mosi, miso, rst, cs  #CS est noté SDA sur la plupart des cartes 
    rdr = mfrc522.MFRC522(0, 2, 4, 5, 14) 
    rdr.antenna_on() 
    state=0 
    user_in='' 
    try: 
      while True: 
        (stat, tag\_type) = rdr.request(rdr.REQIDL) 
        if stat == rdr.OK: 
          (stat, raw\_uid) = rdr.anticoll() 
          if stat == rdr.OK:         u="0x%02x%02x%02x%02x%02x" % (raw\_uid[0], raw\_uid[1], raw\_uid[2], raw\_uid[3], raw\_uid[4])         try:            #Si l’utilisateur existe il est pris en compte           utilisateur=users[u]         except:            #Si l’utilisateur n’existe pas il est appelé “Quelqu’un”           utilisateur="Quelqu'un"           post\_data=(u).encode('utf-8')           #Comme c’est un nouvel utilisateur son numéro de carte est envoyé sur le salon dédié pour être envoyé sur            res = [requests.post](http://requests.post)(url\_ntfy\_new, data = post\_data)         if state==1 and utilisateur==user\_in:           state=0           user\_in=''           post\_data=("🔴 "+utilisateur+" vient de fermer le FabLab").encode('utf-8')           couleur=(255,0,0) #Rouge         elif state==1 and utilisateur!=user\_in:           state=1           user\_in=utilisateur           post\_data=("🟢 "+utilisateur+" vient de prendre la responsabilité du FabLab").encode('utf-8')            #Petite anim pour montrer que le changement de responsabilité a été pris en compte           couleur=(0,255,0) #Vert           for i in range(2):             for k in range(nbr\_leds-1):               ring[k] = couleur               if couleur==(0,255,0):                 couleur=(255,0,0)               else:                 couleur=(0,255,0)               ring.write()               time.sleep(0.1)           couleur=(0,255,0) #Vert         else:           state=1           user\_in=utilisateur           couleur=(0,255,0) #Vert           post\_data=("🟢 "+utilisateur+" vient d'ouvrir le FabLab").encode('utf-8')         res = [requests.post](http://requests.post)(url\_ntfy, data = post\_data)         for i in range(2):           for k in range(nbr\_leds):             ring[k] = couleur             ring.write()             time.sleep(0.1) except KeyboardInterrupt:   print("Bye") |
    
  4. Étape 4

    Héberger les cartes reconnues

    Chaque carte possède un numéro de série, nous pourrions les inscrire en "dur" dans le code python pour valider les présences :

    1. 0x90e0d5588d:Jean-Paul
    2. 0x93574a36c8:Jawad
    3. 0x7ac3df1a78:Lilou
    4. 0x92deb30df2:Tom

    Le souci c'est que toute nouvelle personne vous devriez reprendre le code python, la rajouter et renvoyer votre code Python dans votre microcontrôleur.

    Pour cela j'ai opté pour un stockage des numéros et noms en ligne. J'ai essayé plusieurs service d'hébergement (google drive, anotepad...) mais j'ai été confronté à des soucis avec la librairie urequest qui ne pouvait charger les pages pour des raisons de certificats non compatibles. En revanche Pastebin.com lui peut être consulté par l'ESP au format brut (raw).

    Rendez-vous sur le site, inscrivez-vous pour pouvoir revenir ajouter des comptes au fur et à mesure.  

    Passez votre pastebin en Unlisted et donnez lui un nom pour le reconnaitre.

    Une fois cliqué sur "Create" vous allez être redirigé vers la page de votre pastebin. Le lien est de la forme : https://pastebin.com/M9eGvFxS . Pour obtenir la version "brute", c'est-à-dire le texte seulement, transformez le lien en rajoutant raw : https://pastebin.com/raw/M9eGvFxS  Vous avez votre constante url_users à mettre dans votre code python.

  5. Étape 5

    L'application web ou mobile

    Vous avez deux possibilités : l'application mobile ou l'application internet.

    Vous avez choisi deux noms de fils à suivre dans votre programme Python :

    url_ntfy='http://ntfy.sh/<SujetAbonné>'
    url_ntfy_new='http://ntfy.sh/<SujetNouvellesCartes>'

    Le premier url_ntfy vous permettra de suivre qui a badgé mais si c'est une carte inconnue, le programme écrira "Quelqu'un". A ce moment là, vous recevrez un message sur le second fil url_ntfy_new avec le numéro de la carte qui a badgé, il vous permettra alors de mettre à jour votre fichier pastebin.

    L'application mobile : 

    Rendez-vous sur le store de votre téléphone et installé l'application ntsy.sh.

    Au lancement vous trouverez un signe "+" permettant de rajouter un fil à suivre, rentrez celui que vous avez déclaré dans votre programme Python.

    N'oubliez pas d'activer les notifications en haut.

    La web app (ou application internet):

    Vous pouvez directement vous rendre sur la page https://ntfy.sh/app choisir "S'abonner à un sujet" en bas à gauche de la page et saisir le fil que vous avez intégré dans votre script Python.

  6. Étape 6

    Résultat final


  7. Étape 7

    Evolutions possibles

    Le prochain objectif est juste un boitier permettant de comptabiliser le nombre total de personnes passant dans le lieu, le temps moyen passé, ... avec un affichage sur un écran.

Commentaires (0)

Aucun commentaire pour le moment.

Connectez-vous pour laisser un commentaire.

Collaborateurs

F
Fabien chef