Gérer lun lave linge en co-propriété

Salut le sept, j'ai juste 2 min avant de partir et au boulot mais ca semble fonctionner nickel, le paasword fonctionne.

je regarde au master ce soir. Merci !!

Ca fonctionne, lorsque je passe le badge locataire 2 il lance le "void master". donc du coup pour mettre mes 10 badges master je dois créer 10 utilisateurs genre :

 Utilisateur[1].nom = "master1";
  Utilisateur[1].uID = 0x17F1C8B5;
  Utilisateur[1].droits = 0b00000011;
 Utilisateur[2].nom = "master2";
  Utilisateur[2].uID = 045534313;
  Utilisateur[2].droits = 0xb00000011; 
 Utilisateur[3].nom = "master3";
  Utilisateur[3].uID = 0x54352jh;
  Utilisateur[3].droits = 0b00000011; 
....

C'est bien ca ? Dans l'idée j'ai 10 badges Master et j'aimerai faire 25 badges locataires c'est jouable vous pensez ?

Au lieu de faire un modulo 2if (Utilisateur[tagok].droits % 2 == 0) user(tagok);qui est lent, ce que vous voulez regarder c’est si le bit 1 est vrai ou pas. if (Utilisateur[tagok].droits & 0b00000010) ...

Il est pratique aussi de définir des constantes pour faciliter la lecture du code

const byte carteActive = 0b00000001;
const byte carteAdmin = 0b00000010;
...

Utilisateur[1].droits = carteActive | carteAdmin; // carte activée et droits admins

et si on fait cela on peut utiliser les masques aussi pour les tests if (Utilisateur[tagok].droits & carteAdmin) ...

En effet c'est plus parlant. :) Et oui, un ESP32 aura assez de mémoire pour plusieurs centaines de badges je pense...

Hello,

On dit toujours y a pas de question con du coup j'envoie la mienne :( :

lorsque je passe mon badge master il me met

Card UID: 17 F1 C8 B5
Badge non reconnu

alors que normalement je crois l'avoir mis ici :

  Utilisateur[8].nom = "master 8";
  Utilisateur[8].uID = 0x17F1C8B5;
  Utilisateur[8].droits = 0xb00000011;

C'est qu'il ne compare pas bien ou c'est une histoire d'écriture a votre avis ?

Bjour J'arrive tard mais une question me taraude. Pourquoi utiliser un RFID plutôt qu'un simple code? C'est beaucoup d'ennuis en moins (dialogue entre la base et la carte, rechargement...). Bon, c'est moins rigolo... Mais ca t'évite aussi de reprogrammer une carte neuve chaque fois qu'un locataire perd la sienne ou déménage. Le rechargement se fait simplement en entrant TON code, puis celui de l'utilisateur. Par exemple...

EDIT:

l’affichage se fait par

  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);
  }

donc on imprime les octets dans l’ordre en mémoire

le test se fait comme cela

    if (*(uint32_t *)mfrc522.uid.uidByte == Utilisateur[i].uID) {

donc on convertit les 4 octets tels qu’ils sont rangés en uint32_t

l’architecture étant little endian, quand vous ditesUtilisateur[8].uID = 0x17F1C8B5;les octets sont rangés en mémoire comme cela: B5 C8 F1 17

donc c’est pour cela que la comparaison ne fonctionne pas.

soit vous changez   Utilisateur[8].uID = 0xB5C8F117; // écrit à l'enverssoit vous changez la façon dont la comparaison s’effectue, en la faisant octet par octet

Ah oui ca fonctionne maintenant bravo ! et une fois de plus : Merci.

kammo: Bjour J'arrive tard mais une question me taraude. Pourquoi utiliser un RFID plutôt qu'un simple code? C'est beaucoup d'ennuis en moins (dialogue entre la base et la carte, rechargement...). Bon, c'est moins rigolo... Mais ca t'évite aussi de reprogrammer une carte neuve chaque fois qu'un locataire perd la sienne ou déménage. Le rechargement se fait simplement en entrant TON code, puis celui de l'utilisateur. Par exemple...

oui effectivement en retard de 467 messages ;D ;D . Ils utilisent leurs badges pour ouvrir la porte de la résidence également ;)

le code pourrait marcher pour la résidence aussi cela dit :)

Bonjour à tous,

La situation se précise je vais lancer la phase de test avec le lave linge de madame :D :D.

Juste quelques menus problèmes et amélioration si possible avec votre aide :

Lorsque j'implémente une carte de 5 crédits par exemple, est il possible d'envoyer juste un petit message sur ma page htm comme quoi c'est fait ? Genre "crédits ajoutés" mais pas besoin de frous frous juste ecrit sans style en haut de la page htm par exemple...

ma ligne de code est :

  server.on("/plus5", HTTP_GET, [] (AsyncWebServerRequest * request) {
    int studioNumber = request->arg("Id").toInt();
    Utilisateur[studioNumber].credit += 5; Serial.printf("/plus5 : studio");
    pageStudio(studioNumber); 
    request->send(SPIFFS, "/studio.htm");
  });

EDIT J'ai ajouté

 request->send(400, "text / plain", "les credits sont biens ajoutes a la carte");

ca fait le boulot mais j'aimerais qu'il ne me lance pas une nouvelle page car je ne peux plus revenir en arrière ... ??

autre amélioration, lorsque je passe ma carte, il lance un cycle de lavage et écrit :

"il vous reste .. crédits"

avec la ligne de code suivante :

 lcd.print("il vous reste");
    lcd.setCursor(0, 2);
    lcd.print(Utilisateur[numero].credit);
    ++Utilisateur[numero].nbUtils ;                //ligne de commande pour ajouter 1 au nombre d 'utilsations
    --Utilisateur[numero].credit;                  //ligne de commande pour soustraire 1 au nombre de crédits
    lcd.setCursor(0, 3);
    lcd.print("credit(s)");

et il possible de décrémenter 1 credit sur le résultat qui s'affiche a l'écran LCD car nous allons rechercher la valeure qu il y a dans le tableau mais avant la décrémentation donc le locataire crois qu'il lui reste a crédit de plus ..

je sais pas si c'est clair mon histoire :slightly_frowning_face:

EDIT ok il fallait juste mettre -1 :

  lcd.print(Utilisateur[numero].credit-1);

Beaucoup plus difficile :

Est il possible lorsque je fait un changement de badge, le badge en question ne me lance pas un cycle de lavage …

la ligne de code est

// Changer un Badge
  server.on("/cdc", HTTP_GET, [] (AsyncWebServerRequest * request) {
    int studioNumber = request->arg("Id").toInt();
    Serial.println(studioNumber );
    // Attente du passage du badge (affiche des . pour indiquer)
    while ( ! mfrc522.PICC_IsNewCardPresent()) {
      Serial.print(".");
      yield();
    }
    // Lecture du badge (affiche des + pendant la lecture)
    while ( ! mfrc522.PICC_ReadCardSerial()) {
      Serial.print("+");
      yield();
    }
    Serial.print("Card UID:");

    for (byte i = 0; i < 4; i++) {
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      Utilisateur[studioNumber].uID = *(uint32_t *)mfrc522.uid.uidByte;
    }
    pageStudio(studioNumber);
    request->send(SPIFFS, "/studio.htm");
  });

mais je pense qu’il lance le lavage a cause du loop

void loop() {
  // put your main code here, to run repeatedly:
  lcd.backlight();
  // 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();
  tagok = 255;
  for  (byte i = 0; i < nbUtilisateurs; i++) {
    if (*(uint32_t *)mfrc522.uid.uidByte == Utilisateur[i].uID) {
      Serial.println("Carte reconnue");
      tagok = i;
      break;  // pas la peine d'aller plus loin
    }
  }
  switch (tagok) {
    case 0:
      master();
      // instructions master
      break;
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
    case 10:
      // instructions user connu
       if (Utilisateur[tagok].droits % 2 == 0) user(tagok);
      else master();
      break;
    case 255:
      inconnu();
      // badge inconnu
      break;
    default:
      autre();
      // instructions si autre numéro
  }
  mfrc522.PICC_HaltA(); // Stop reading
}

Tu veux faire payer ta femme pour se servir de la machine à laver ? ? ? Tu vas au devant de problèmes si tu veux mon avis... :)

Beaucoup de questions aujourd'hui...

Pour la question sur les crédits ajoutés, je ne sais pas faire sans créer une nouvelle page. Mais ça peut peut-être se faire... Moi je ne sais pas.

Pour le nombre de crédits, il suffit de déplacer la ligne --... avant le LCD print

Pour la dernière question je n'ai pas compris, il faudrait voir dans le code, mais je suis sur mon smartphone donc c'est pas idéal...

Pour la question sur les crédits ajoutés, je ne sais pas faire sans créer une nouvelle page. Mais ça peut peut-être se faire... Moi je ne sais pas.

il faudrait que la page embarque une zone pilotée par AJAX et toutes les x secondes une requête serait envoyée pour demander s’il y a un message utilisateur à afficher et un bout de javascript met à jour le DOM pour que ça s’affiche pendant un temps. Les navigateurs supportent aussi la notion de notification de nos jours mais c’est plus compliqué.

Autant faire une page qui affiche le succès de l'ajout de crédits et offre la possibilité de revenir au menu principal via un bouton.

Ou bien, au bout d'une temporisation, tu envoies la page du menu principal.

Explique mieux ta question du message 472. 'cdc' veut dire 'changement de carte' ? Qu'est-ce que c'est censé faire ?

EDIT : ok en lisant le code, je comprends mieux. Tu veux que l'occupant d'un studio puisse changer de badge. La fonction 'cdc' est appelée en cliquant sur un bouton de la page 'studio' et sert à lire un nouveau badge et remplacer l'ancien Id par celui qui est lu sur le badge.

Tu dis que après la lecture, ça lance un lavage ? Il faut suivre le déroulement du code et comprendre pourquoi. Je pense qu'il faut que ta fonction cdc attende que le badge ne soit plus présent sur le lecteur avant d'envoyer la page web du studio.

Aussi, elle devrait afficher un message sur le LCD pour demander à l'utilisateur de passer son nouveau badge sur le lecteur, puis de l'enlever lorsqu'il est lu.

Oui c’est sûr que c’est plus simple. Dans ce cas il faut que l’opérateur fasse une action pour demander cette page. Pourquoi pas mais j’avais compris que @yohann74 envisageait que ce soit automatique en surimpression de la page en cours.

@J-M-L oui je pensais a une surimpression effectivement car je pensais que la manipulation était simple, maintenant ce n'est pas grave je vais faire une page avec un retour sur la page d'accueil je pense que c'est dans mes cordes ;) .

@Lesept oui c'est ca a l'heure actuelle le bouton changement de carte est présent sur chaque page studio, et elle permet de changer l'ID de la carte en gardant le reste des données du tableau.

Donc dans la procédure je vais sur la page studio, je click le bouton changement de carte et j'ai quelques secondes pour passer la nouvelle carte.

A lheure actuelle cette procédure me lance un cycle de lavage.

Je pense que le problème est lié au fait que la fonction CDC n' annihile pas la fonction basique de notre programme qui est de lancer un lavage au passage d'un badge ... maintenant pour corriger ca ... ???

Pour la validation des +5 j'ai juste fait ,en fin de fonction, un revoie vers la page index comme ca le changement de page me confirme l implémentation. Ca c'est fait.

Tu devrais ajouter un moyen de valider le lancement du lavage. En effet si le badge est passé par erreur, ça lance un cycle de lavage pour rien et on est obligé d'attendre pour pouvoir faire quelque chose. Il vaudrait mieux confirmer avec un bouton physique sur le boîtier. Ça règlerait ton problème et rendrait le système plus sûr.

Sinon, il faut ajouter dans ton code en variable globale un booléen qui sera à false normalement mais passera à true lors du changement de badge. Dans la loop tu ne lances le lavage que si ce booléen est à false. S'il est à true, pense à le remettre à false immédiatement après.