Go Down

Topic: Gérer lun lave linge en co-propriété  (Read 13578 times) previous topic - next topic

lesept

Voici une possibilité :
Code: [Select]
  serNumLu = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned

  tagok = 255;
  for  (byte i = 0; i < 10; i++) if (serNumLu == badge[i]) tagok = i; // carte reconnue dans la liste
  switch (tagok) {
    case 0:
      master();
      // instructions master
      break;
    case 1:
      // instructions user 1
      break;
    case 2:
      // instructions user 2
      break;
    case 3:
      // instructions user 3
      break;
    case 255:
       inconnu();
      // // badge inconnu
      break;
    default:
      // instructions si autre numéro
  }


Une autre façon, plus simple :
Code: [Select]
  serNumLu = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned

  tagok = 255;
  for  (byte i = 0; i < 10; i++) if (serNumLu == badge[i]) tagok = i; // carte reconnue dans la liste
  switch (tagok) {
    case 0:
      master();
      // instructions master
      break;
    case 1-10:
      user(tagok);
      // instructions user connu
      break;
    case 255:
      inconnu();
      // // badge inconnu
      break;
    default:
      // instructions si autre numéro (genre message "badge non reconnu" sur l'écran)
  }

Et tu écris des fonctions pour chaque cas (master, user, inconnu).
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

lesept

#16
Jan 18, 2020, 05:15 pm Last Edit: Jan 19, 2020, 11:16 pm by lesept
Voyant tes autres questions, je te propose une version de ton code, qui devrait répondre à tes questions, et peut-être en poser d'autres :
Code: [Select]
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

#define SS_PIN 10    //Arduino Uno
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.
MFRC522::MIFARE_Key key;

unsigned long serNumLu = 0;
unsigned long  badge[10]; //déclaration de tableau de 10 badges
struct Params {
  char nom[20];
  bool existe;
  int nbUtils;
  int credit;
};
struct Params Utilisateur[10];

int buzzer = 8;
int led_rouge = 14;
int led_verte = 15;

int tagok = 255;

void setup() {
  pinMode(led_rouge, OUTPUT);
  pinMode(led_verte, OUTPUT);
  pinMode(buzzer, OUTPUT);
  lcd.begin(16, 2); //ini le lcd
  SPI.begin();        // Init SPI bus
  Serial.begin(9600);
  mfrc522.PCD_Init();   // Init MFRC522 card

  initUsers();
  lcd.print("Dispositif");
  lcd.setCursor(0, 1);
  lcd.print("d'identification");
  delay(3000);
  lcd.clear();
}

void loop() {
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())    return;

  Serial.print("Card UID:");    //Dump UID
  for (byte i = 0; i < 4; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println();
  serNumLu = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned

  tagok = 255;
  for  (byte i = 0; i < 10; i++) if (serNumLu == badge[i]) tagok = i; // carte reconnue dans la liste
  switch (tagok) {
    case 0:
      master();
      // instructions master
      break;
    case 1-10:
      user(tagok);
      // instructions user connu
      break;
    case 255:
      inconnu();
      // badge inconnu
      break;
    default:
      autre();
      // instructions si autre numéro
  }
}

void master () {
  Serial.print("Badge master");
  lcd.setCursor(0, 0);
  lcd.print("ACCES AUTORISE");
  lcd.setCursor(0, 1);
  lcd.print("SALUT master");
  digitalWrite(led_verte, HIGH);
  tone(buzzer, 1200, 100);
  delay(300);
  tone(buzzer, 1200, 100);
  delay(2000);
  digitalWrite(led_verte, LOW);
}

void user (int numero) {
  Serial.print("Badge utilisateur ");
  Serial.println(numero);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("ACCES AUTORISE");
  lcd.setCursor(0, 1);
  lcd.print(Utilisateur[numero].nom);
  ++Utilisateur[numero].nbUtils ;
  Serial.print (Utilisateur[numero].nbUtils);
  Serial.println (" utilisations");
}

void inconnu () {
  Serial.print("Badge non reconnu");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("ACCES REFUSE");
}

void autre () {
  Serial.print("Erreur lecture badge");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("ERREUR LECTURE");
}

void initUsers() {
  //ini le tableau des badges
  badge[0] = 3643054959;  //badge master
  badge[1] = 55; //badge 1
  badge[2] = 44;//badge 2
  badge [3] = 88; //badge 3
  badge [4] = 33; //badge 4
  badge [5] = 44; //badge 5
  badge [6] = 55; //badge 6
  badge [7] = 44; //badge 7
  badge [8] = 44; //badge 8
  badge [9] = 44; //badge 9

  // Master
  Utilisateur[0].nom = "Master";
  Utilisateur[0].existe = true;
  Utilisateur[0].nbUtils = 0;
  Utilisateur[0].credit = 10000;

  // Utilisateur 1
  Utilisateur[1].nom = "Regis";
  Utilisateur[1].existe = true;
  Utilisateur[1].nbUtils = 3;
  Utilisateur[1].credit = 10;

 // Pierre
  Utilisateur[2].nom = "Pierre";
  Utilisateur[2].existe = true;
  Utilisateur[2].nbUtils = 4;
  Utilisateur[2].credit = 8;

  // Bernadette
  Utilisateur[3].nom = "Bernadette";
  Utilisateur[3].existe = false; // Elle a quitté l'immeuble
  Utilisateur[3].nbUtils = 12;
  Utilisateur[3].credit = 3;

}
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74

#17
Jan 18, 2020, 05:48 pm Last Edit: Jan 18, 2020, 06:04 pm by yohann74

Wahooo c'est juste énorme !!

c'est tout ce dont tu m'avais parlé mais tout en place !!! J'avais commencé a regarder les 'struct' 'param' 'char' 'bool' ... c'est super intéressant mais avant que j'arrive a faire un code comme le tiens les étudiants serait proches de la retraite même avec les nouvelles réformes  :D  :)   ;)


au passage il me met plusieurs log d'erreur entre const char et char tu vois ce que ca peux être??

error: incompatible types in assignment of 'const char [11]' to 'char [20]'

 Merci encore !!

Edit : J'ai enlevé le [20] et ca à l'air de marcher

lesept

Oui, en effet je maîtrise mal les tableaux de char... Manque de bonne source d'information sur le sujet.

Si ça marche comme ça, continue...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74



Par contre j'ai renseigné mes badges à ce niveau là ....

Code: [Select]
  //ini le tableau des badges
  badge[0] = 3643054959;  //badge master
  badge[1] = 55; //badge 1


mais il ne les reconnait pas.  tu aurais une idée ou peut être qu'il faut que je les renseigne ailleurs ...  ::)

lesept

Non je n'ai pas de lecteur RFID et je ne sais pas à quoi ressemblent les numéros lus. Il faut que tu regardes s'il n'y a pas un exemple de la bibliothèque qui te permet de connaître les numéros et les afficher sur la console.

Sinon tu fais un petit code qui lit le numéro de chaque badge que tu passes devant le lecteur et l'affiche sur la console
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74

#21
Jan 19, 2020, 06:31 pm Last Edit: Jan 19, 2020, 06:35 pm by yohann74
Peut être que quelqu'un sur le forum aurait une idée ...

En fait, avec le moniteur, je vois très bien les numéros des tags et je peux effectivement les lire entièrement avec dump info (un exemple de la librairie RC522).

 Dans le code je précise hex pour héxadécimal ou dec pour décimal

Code: [Select]
Serial.print("Card UID:");    //Dump UID
  for (byte i = 0; i < 4; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], [b]HEX[/b]);


ce qui me donne pour mon badge

18:19:56.767 -> Badge non reconnuCard UID: 39 167 36 217

ou

18:26:02.746 -> Badge non reconnuCard UID: 27 A7 24 D9

Donc j'ai l'info de ce qu'il lit, mais que je renseigne l'un ou l'autre dans le code ,il ne me reconnait pas ?? Peut être qui ne compare pas bien le serNumLu avec le badge[0] ... si ?
Ce qui me fait penser ça c'est que le code que j'utilise dans le message #7 fonctionne avec mon numéro de tag en décimal

lesept

Ton numéro de badge et codé sur un tableau de 4 octets. Tu ne peux pas comparer un tableau avec un nombre.

Mais tu peux faire une transformation. Ton nombre est un uint32_t si j'ai bonne mémoire. Donc lorsque tu lis ton code de badge tu prends ces 4 octets et tu en fais un nombre sur 32 bits.

Par exemple
Code: [Select]
uint32_t badgeLu = mfrc522.uid.uidByte[3] << 24 + mfrc522.uid.uidByte[2] << 16 + mfrc522.uid.uidByte[1] << 8 + mfrc522.uid.uidByte[0];
Ça te donne une valeur.

Il faut la comparer avec le même genre de valeur que tu obtiens pour chaque badge avec ton code précédent, en lui appliquant cette ligne et affichant le résultat.

Est-ce clair ?

Il y a d'autres possibilités comme stocker les tableaux de chaque badge et comparer case par case avec le tableau du badge lu...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74


C'est chaud! J'ai beau y avoir passé un paquet d'heure j'ai reçu mon starter kit qu'il y a 10 jours et je découvre le C ... :)  .

Je crois comprendre l'idée mais pour la mettre en pratique ça me parait pas évident. Je n'arrive pour le moment pas a récupérer la valeur de ton code mais je peux y bosser, par contre pour le comparer aux valeurs de chaque badge c'est chaud.

Sur le code du message 7 j'avais cette formule qui, il me semble, créait un tableau avec les valeurs de chaque tag   

Code: [Select]
unsigned long sernum[11] = {0, 3643054959,0, 1159921925, 3278950471, 0, 0, 0, 0,0, 3643057959};

Est ce qu'il ne serait pas plus "simple d'utiliser cette méthode ? Peut être ne pourrons nous plus créer un compte par personne comme tu as fait et toutes les autres options ....

lesept

Cette méthode, c'est juste un moyen de mettre des valeurs dans un tableau. C'est équivalent à renseigner chaque valeur sur une ligne à part.

Ce qui est important c'est d'avoir les bonnes choses pour la comparaison. Mais comme je n'ai pas de lecteur, je ne peux pas tester pour t'aider.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74


Tu en as déja beaucoup fait, je vais bosser et faire des essais, Merci encore !!

lesept

#26
Jan 19, 2020, 11:23 pm Last Edit: Jan 19, 2020, 11:24 pm by lesept
Tu peux t'inspirer de ce qui est indiqué ici. Si tu as des problèmes, je peux t'aider...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74


Hello,

je continue les tests et j'ai remarqué, mais peut être que c'est normal que dans ta partie de code

Code: [Select]
serNumLu = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned

  tagok = 0;
  for  (byte i = 0; i < 10; i++) if (serNumLu == badge[i]) tagok = i; // carte reconnue dans la liste
  switch (tagok) {
    case 0:
      master();
      // instructions master
      break;
    case 1-10:
      user(tagok);
      // instructions user connu
      break;
    case 255:
      inconnu();
      // badge inconnu
      break;
    default:
      autre();
      // instructions si autre numéro
  }
}

void master () {
  Serial.print("Badge master");
  lcd.setCursor(0, 0);
  lcd.print("ACCES AUTORISE");
  lcd.setCursor(0, 1);
  lcd.print("SALUT master");
  digitalWrite(led_verte, HIGH);
  tone(buzzer, 1200, 100);
  delay(300);
  tone(buzzer, 1200, 100);
  delay(2000);
  digitalWrite(led_verte, LOW);
}

void user (int numero) {
  Serial.print("Badge utilisateur ");
  Serial.println(numero);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("ACCES AUTORISE");
  lcd.setCursor(0, 1);
  lcd.print(Utilisateur[numero].nom);
  ++Utilisateur[numero].nbUtils ;
  Serial.print (Utilisateur[numero].nbUtils);
  Serial.println (" utilisations");
}

void inconnu () {
  Serial.print("Badge non reconnu");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("ACCES REFUSE");
}


Lorsque je mets tagok = 0 tous mes badges fonctionnent en tant que Master et quand je mets tagok = 255 il me marque accès refusé... c'est normal  :smiley-slim: ?


lesept

Tu as raison c'est une erreur. Il faut mettre
Code: [Select]
tagok = 255;
avant la boucle for, comme je l'avais fait avant.

J'explique. Tu initialises à 255, puis tu compares avec les codes mémorisés. S'il y en a un qui correspond, on prend son numéro. Si aucun ne correspond, on reste à 255.

Mais pour que ça marche il faut que la comparaison soit correcte. C'est ce qui manque à ton programme, je pense.
Je regarderai demain, à tête reposée (là je suis sur mon smartphone, pas facile de coder).

Je pense qu'il faudrait ajouter un truc genre
Code: [Select]
while (mfrc522.PICC_IsNewCardPresent()) ;
à la fin de la loop pour bloquer le code tant que le badge est devant le lecteur. A vérifier...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74

J'ai testé mais pas mieux entre temps j'ai changé dans :


 
Code: [Select]
  tagok = 255;
  for  (byte i = 0; i < 10; i++) if (serNumLu == badge[i) tagok =[b] i [/b];


le i de tagok par un 0 non ?? En même temps ca marche pas mieux.

Go Up