IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Mettre les N° UID en EEPROM


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut Mettre les N° UID en EEPROM
    Bonjour à Tous

    Mon projet est le suivant :
    Une serrure électronique avec

    Arduino UNO + RFID RC522 + Clavier souple 4x4

    Le programme actuel fonctionne mais j'ai du programmer les N° UID autorisés de type ( FF.FF.FF.FF )
    L'idée serait donc de pouvoir sauvegarder ces N° ( après validation ) dans l'EEPROM de l'Arduino
    Mais je ne sais comment m'y prendre
    tableau , structure bref j'ai donc besoin votre aide

    merci par avance

  2. #2
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir cobra38

    Les mettre en tableau s'il n'y a que l'UID à sauver. Si d'autres valeurs attenantes à l'UID, dans une structure en tableau, sauver le tableau ou la structure avec un EEPROM.put et restaurer les données avec un EEPROM.get
    EEPROM.put fait un EEPROM.update ce qui "économise" l'EEPROM

    Cordialement
    jpbbricole

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Merci d'avoir répondu jpbbricole

    ok pour le tableau mais doit-on faire la sauvegarde dans ce tableau, octet par octet ou l'ensemble de la chaine ?

    Cordialement

  4. #4
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir cobra38
    Citation Envoyé par cobra38 Voir le message
    ok pour le tableau mais doit-on faire la sauvegarde dans ce tableau, octet par octet ou l'ensemble de la chaine ?
    Put et Get "s'occupent de tout"
    Une petite recherche chez Google.

    Cordialement
    jpbbricole

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Bonsoir ( et Joyeuses Fêtes),

    J'ai attentivement lu tout ce que je pouvais comprendre et tenté quelques essais
    avec EEPROM.put () et EEPROM.get()
    mais j'ai besoin de votre aide car j'ai constaté par ex la chose suivante :

    N° UID en DEC lu sur une carte : tag ="135 120 254 36"

    soit donc EEPROM.put (1000,tag)
    et
    EEPROM.get(1000,tag)

    En lisant l'EEPROM j'aurai normalement du avoir mes valeurs enregistrées à partir de l'adresse 1000
    mais au lieu de çà, je retrouve des valeurs incohérentes peut-être des adresses de pointeurs
    j'ai donc tente de modifier et mis :

    EEPROM.put (1000,sizeof(tag))
    mais sans résultat

    une petite piste me serait alors salutaire

    merci par avance
    Cordialement

  6. #6
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour cobra38 et bonnes fêtes également.

    Citation Envoyé par cobra38 Voir le message
    EEPROM.put (1000,tag)

    EEPROM.get(1000,tag)
    Attention, un UNO c'est 1024 "cases" EEPROM maximum!

    Voici 2 exemples, pour écrire et pour lire.

    Ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <EEPROM.h>
     
    const int tagNbr = 5;                  // Nombre de TAG
    String tagTableau[tagNbr];             // Tableau des TAG
    int eepromAdresseTag = 0;              // Adresse de depart en EEPROM
     
    void setup()
    {
    	Serial.begin(115200);
     
    	tagTableau[0] = "135 120 254 01";
    	tagTableau[1] = "135 120 254 02";
    	tagTableau[2] = "135 120 254 03";
    	tagTableau[3] = "135 120 254 04";
    	tagTableau[4] = "135 120 254 05";
     
    	EEPROM.put(eepromAdresseTag, tagTableau);
    }
     
    void loop()
    {
     
     
    }
    Lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <EEPROM.h>
     
    const int tagNbr = 5;                  // Nombre de TAG
    String tagTableau[tagNbr];             // Tableau des TAG
    int eepromAdresseTag = 0;              // Adresse de depart en EEPROM
     
    void setup()
    {
    	Serial.begin(115200);
     
    	EEPROM.get(eepromAdresseTag, tagTableau);
     
    	for (int i=0; i < tagNbr; i ++)
    	{
    		Serial.println("TAG #" + String(i+1) + " = " + tagTableau[i]);
    	}
    }
     
    void loop()
    {
     
    }
    Cordialement
    jpbbricole

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    La classe String est sans doute superflue.

    Vous pouvez déclarer votre tableau de UID connus sous forme de tableau de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const char tableau[][15] {
      "135 120 254 44",
      "135 120 254 43",
      "135 120 254 42",
      "135 120 254 41",
      "135 120 254 40"
    };
    Et on le stocke en EEPROM par un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const uint16_t adresseDebut = 0;
    EEPROM.put(adresseDebut, tableau);
    Si on veut remplir dynamiquement un UID on peut utiliser strcpy() ou strncpy(), par exemple en case 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(tableau[0], “135 246 221 22); // s’assurer de ne pas avoir plus de 14 caractères !!!

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    merci Jay M et jpbbricole
    pour vos precieuses infos

    j'aurai juste une question à laquelle je ne trouve pas de réponse

    on dimensionne
    const int tagSize = 15; // Taille d'un TAG
    soit une longueur de 15 caractères
    or les N° UID font au max : "255 255 255 255" soit 15 avec les espaces
    le test que j'ai effectué à partir du tableau suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      tagEnregistrer("255 255 255 255", 0);
      tagEnregistrer("255 255 255 255", 1);
      tagEnregistrer("255 255 255 255", 2);
      tagEnregistrer("255 255 255 255", 3);
      tagEnregistrer("255 255 255 255", 4);
    me donne après enregistrement la liste suivante pour un tag = "135 120 254 36"

    Liste des TAG (5)
    TAG #0 = 135 120 254 3
    TAG #1 = 255 255 255 25
    TAG #2 = 255 255 255 25
    TAG #3 = 255 255 255 25
    TAG #4 = 255 255 255 25

    soit un décalage pourtant avec tagSize = 15

    ne serait-il pas plus simple de passer en HEX soit :
    tagSize = 12

    cordialement
    pascal

  9. #9
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Pascal

    Ne cherche pas le coupable trop loin!!! , j'avais bêtement copié et collé l'exemple de l'article #5
    Tu as raison, un UID 255 255 255 255 ce qui fait 15 caractères donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int tagSize = 16;                // 15+1 pour la terminaison de la variable, un octet à 0
    A+
    Cordialement
    jpbbricole

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Bonjour jpbbricole

    le coupable c'est bien moi , j'aurai du vérifier
    car pour l'instant je sui repassé en HEX mais j'ai le même problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    MDP ADMIN
    Scanner une Nouvelle Carte
    Carte detectée
    UID de tag : BA 69 97 15
    N° Carte à enregistrer :  BA 69 97 15
    TAG  BA 69 97 15 INCONNU
     
    Liste des TAG (5)
    TAG #0 =  BA 69 97 1
    TAG #1 = FF FF FF FF
    TAG #2 = FF FF FF FF
    TAG #3 = FF FF FF FF
    TAG #4 = FF FF FF FF
    j'avoue ne pas comprendre du tout le pb ....
    ( pour info j'ai mis : tagSize = 12 )

    Cordialement
    pascal

  11. #11
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Pascal

    cette valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int tagSize = 16;                // Taille d'un TAG16
    n'est pas critique, même en diminuant la taille des TAG, tu peux laisser 16, comme ça tu est assez "large", au pire tu gaspilles quelques octets.
    J'ai vérifié, en ayant un tagSize à 16 et un TAG à 11, il n'y a pas de caractère(s) "parasite(s)", en fin de variable à la lecture en EEPROM.
    Pour tester j'ai légèrement modifié void tagList()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //------------------------------------- Lister les TAG
    void tagListe()                                            
    {
    	Serial.println("\nListe des TAG (" + String(tagNbr) + ")");
    	for (int i = 0; i < tagNbr; i++)
    	{
    		Serial.println("TAG #" + String(i) + " = " + tagTableau[i] + "/");
    	}
    	Serial.println("");
    }
    A+
    Cordialement
    jpbbricole

  12. #12
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    il semble que vos tags aient 4 octets (que dit rfid.uid.size)

    Pourquoi ne pas prendre juste ces 4 octets pour les mettre en EEPROM et éviter toute la gymnastique des Strings ? 4 octets ça tient en plus dans un uint32_t (unsigned long) donc pour comparer deux codes il suffit de comparer les deux unsigned long entre eux.

    Pourquoi importer ce fichier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <deprecated.h> // inclut dasn la Bibliotheque MFRC522

  13. #13
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Citation Envoyé par Jay M Voir le message
    il semble que vos tags aient 4 octets (que dit rfid.uid.size)

    Pourquoi ne pas prendre juste ces 4 octets pour les mettre en EEPROM et éviter toute la gymnastique des Strings ? 4 octets ça tient en plus dans un uint32_t (unsigned long) donc pour comparer deux codes il suffit de comparer les deux unsigned long entre eux.

    Pourquoi importer ce fichier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <deprecated.h> // inclut dasn la Bibliotheque MFRC522
    Bonsoir Jay M

    il le met d'office lors l'importation de MFRC522 , mais je ne connais pas son utilité ...

    Cordialement
    Pascal

  14. #14
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Re...

    Pour valider la comparaison
    J'ai mis :

    if (tag ==tagTableau[0]) ... en lieu et place de : if (tag.substring(1) ==tagTableau[0]) et çà semble marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Scanner une Nouvelle Carte
    Carte detectée
    UID de tag :BA 69 97 15
    N° Carte à enregistrer : BA 69 97 15
    TAG BA 69 97 15 INCONNU
     
    Liste des TAG (5)
    TAG #0 = BA 69 97 15
    TAG #1 = FF FF FF FF
    TAG #2 = FF FF FF FF
    TAG #3 = FF FF FF FF
    TAG #4 = FF FF FF FF
    la carte est donc enregistrée puis reconnue ...

    L'ennui c'est que je n'arrive pas à sortir du mode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (adminMode == 1) ...
    le programme boucle en permanence sur le mode ADMIN et reconnait toutes les cartes
    comme des nouvelles et les enregistrent en lieu et place ....


    pascal

  15. #15
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir Pascal

    Boon, ça devient, pour moi toujours plus difficile, je ne peut pas reproduire l'entier de ton programme
    Mais, une chose que j'ai pu voire, il manque un break dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
      switch (keypad.getState()) {
        case PRESSED:
          Serial.print("Pressed: ");
          Serial.println(eKey);
          tone (buzzer,200,100);
          pwMode = 1;
          pwPos = pwPos + 1;
          if (pwPos == 1) {
            lcd.clear();
          }
          lcd.setCursor (0, 0);
          lcd.print(F("Validez avec '*'"));
          if (pwPos < 5) {
            lcd.setCursor (5 + pwPos, 1);
            lcd.print(F("*"));
          }
           break;
     
          switch (eKey) {
            case '*': checkPassword(); break;
            //case '#':
            //  Serial.print("    ");
            //  password1.reset();
            //  break;
            default:
            password1.append(eKey);
            password2.append(eKey);
     
          }
    A la fin de case PRESSED:
    Intéressant à lire.

    A+
    Cordialement
    jpbbricole

  16. #16
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Bonsoir Pascal

    Boon, ça devient, pour moi toujours plus difficile, je ne peut pas reproduire l'entier de ton programme
    Mais, une chose que j'ai pu voire, il manque un break dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
      switch (keypad.getState()) {
        case PRESSED:
          Serial.print("Pressed: ");
          Serial.println(eKey);
          tone (buzzer,200,100);
          pwMode = 1;
          pwPos = pwPos + 1;
          if (pwPos == 1) {
            lcd.clear();
          }
          lcd.setCursor (0, 0);
          lcd.print(F("Validez avec '*'"));
          if (pwPos < 5) {
            lcd.setCursor (5 + pwPos, 1);
            lcd.print(F("*"));
          }
           break;
     
          switch (eKey) {
            case '*': checkPassword(); break;
            //case '#':
            //  Serial.print("    ");
            //  password1.reset();
            //  break;
            default:
            password1.append(eKey);
            password2.append(eKey);
     
          }
    A la fin de case PRESSED:
    Intéressant à lire.

    A+
    Cordialement
    jpbbricole

    mille pardons
    je te remercie pour ta patience
    mais je débute sous Arduino et je n'ai souvent que le résultat du problème
    mais pas la cause d'autant qu'il n'y a pas debug
    on constate que çà ne fonctionne pas mais sans en avoir la raison...
    je vais donc passer à la seconde étape de mon prg , celle qui consiste à valider la carte enregistrée
    puis valider l'accès

    merci pour tout pour l'aide
    si tu es d'accord je propose de clore le sujet
    qui consistait à mettre un N° UID dans EEPROM
    ce qui est fait donc

    Bien cordialement
    pascal

  17. #17
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    Bonsoir Jay M
    il le met d'office lors l'importation de MFRC522 , mais je ne connais pas son utilité ...
    Bonsoir Pascal, regardez l'exemple ReadNUID.ino vous verrez qu'ils n'ont que ces 2 include
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <SPI.h>
    #include <MFRC522.h>
    Vous avez une appli 'complète' AccessControl.ino que vous pouvez étudier et qui ressemble un peu à ce que vous voulez faire.

  18. #18
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Bonsoir Pascal, regardez l'exemple ReadNUID.ino vous verrez qu'ils n'ont que ces 2 include
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <SPI.h>
    #include <MFRC522.h>
    Vous avez une appli 'complète' AccessControl.ino que vous pouvez étudier et qui ressemble un peu à ce que vous voulez faire.
    Merci Jay M

    Je pense que tu as raison
    je vais supprimer les 2 include inutiles

    Cordialement
    Pascal

  19. #19
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir Pascal

    Alors, à une prochaine!

    Bonne soirée.
    Cordialement
    jpbbricole

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 19/11/2005, 18h56
  2. mettre les termes d'un string dans une struct
    Par grand's dans le forum SL & STL
    Réponses: 17
    Dernier message: 29/11/2004, 17h43
  3. mettre les formulaires aux mêmes dimensions
    Par xycoco dans le forum IHM
    Réponses: 6
    Dernier message: 09/10/2004, 09h32
  4. Mettre les <input> en disabled
    Par Oberown dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 05/10/2004, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo