créer Tableau de valeur qui varie

Oh pardon, à force d'avoir la tête dans le projet, j'en ai oublié mes bonnes manières... :confused:

Le projet : Monnayeur RFID pour machine à laver pour une collocation de 11 chambres

Accessoires : Arduino Nano, RFID, Afficheur simple 7 segments couplé à un multiplex 74hc595 , Buzzer, Relais, LED RGB, Module RTC horloge et un bouton pour play.

Utilisations : Limiter l'accès à la machine à laver par le biais d'un badge pour chaqu'un des locataires. Dont 5 crédits par badge ; soit une utilisation de 5 fois/mois/chambre.

La personne remplit la machine avec son linge sale, choisit le programme voulu et pour lancer la machine à laver, il faut que :....

Fonction de la Loop :
- Cas le plus favorable : le locataire scan son badge. Il est reconnu dans la base de donnée : LED_Verte(), Buzzer OK, le nombre de crédit lié au badge est affiché sur le 7 segment. Il lui reste des crédits il peut alors appuyer sur le bouton qui va lui décompter 1 crédit et enclencher le relais qui va à son tour lancer le programme de la machine à laver. FIN DE LOOP

- Cas défavorable :le locataire scan son badge. Il est reconnu dans la base de donnée : LED_Verte(), Buzzer OK, le nombre de crédit lié au badge est affiché sur le 7 segment. Il ne lui reste aucun crédits : LED_Rouge(), Buzzer ERREUR. Il ne peut pas appuyer sur le bouton. FIN DE LOOP

- Cas le plus défavorable : le locataire ou l'admin scan son badge. Il n'est pas reconnu dans la base de donnée : LED_Rouge(), Buzzer ERREUR. FIN DE LOOP

- Fonction Master 1 : L'admin scan son badge. LED_Bleu(), Buzzer Admin. Il ne fait aucune action pendant 5 sec. LED_Rouge(), Buzzer ERREUR. LED_Verte() Relais actif. FIN programMode

- Fonction Master 2 : L'admin scan son badge. LED_Bleu(), Buzzer Admin. Il appui plusieurs fois sur le bouton play pour sélectionner un numéro qui s'affiche sur le 7 segment. (Le chiffre correspond à une chambre, il fait 5 appuis : Chambre 5). Il a 5 sec pour placer un badge sur le lecteur RFID. Le badge sélectionné correspond déjà au badge de la chambre 5 : les crédits du badge sont réinitialisés à 5 crédits. FIN programMode

- Fonction Master 3 : L'admin scan son badge. LED_Bleu(), Buzzer Admin. Il appui plusieurs fois sur le bouton play pour sélectionner un numéro qui s'affiche sur le 7 segment. (Le chiffre correspond à une chambre, il fait 5 appuis : Chambre 5). Il a 5 sec pour placer un badge sur le lecteur RFID. Le badge sélectionné ne correspond pas au badge de la chambre 5 : l'UID du nouveau badge scanné est remplacé par l'ancien UID de la chambre 5. Les anciens crédits sont concervés pour être attribué au nouveau badge. FIN programMode

- Mode Reset crédits Auto : Tous les 1er du mois, une boucle vérifie la date et l'heure pour réinitialiser tous les crédits de toutes les chambres afin de les remettre à 5 crédits.

Toutes les données sont stockées dans l'EEPROM et actualisées au fur et à mesure des actions. :slight_smile:

void loop() {
  date_heure();
  do {
    successRead = getID();  // définit successRead à 1 lorsque nous lisons dans le lecteur, sinon 0

    if (serNumLu == Badge[0].sernum) tagok = 255;  // carte master reconnue
    else for (int i = 1 ; i < nbUser ; i++) {
        if (serNumLu == Badge[i].sernum) {
          tagok = 1;  // badge reconnue dans le tableau
          break;
        }
      }
  }

  while (!successRead);   //le programme n'ira pas plus loin si vous n'obtenez pas une lecture réussie
  if (tagok == 1 ) {
    badge_ok();
  }
  if (tagok == 255) {
    if (programMode) {
      programMode_OFF();
    } else {
      programMode_ON();
      badge_master();
    }
  } else if (tagok == 0 ) badge_erreur();

  delay(2000);
  clean_7seg();     // on éteint le 7 segment
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  CARTE MASTER  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII//
void badge_master() {
  digitalWrite(LED_B, HIGH);
  tone(BUZZER, 1200, 100);  //Allume Led bleu+Buzzer
  // select d'un chiffre correspondant à une chambre par l'appui successif du bouton_play
  // (ex: N°3, après 3 appui sur bouton_play)
  byte roomNumber = 0;
  Serial.println("Appuyez sur le bouton pour selectionner la chambre");
  const unsigned long tempo = 4500ul; // temporisation : fin d'appui bouton
  unsigned long wait = millis();
  while (millis() - wait < tempo) {
    if (digitalRead(bouton_play) == HIGH) {
      delay (300);  // debounce
      ++ roomNumber;
      if (roomNumber > nbUser + 1) roomNumber = 1;
      Serial.print ("Chambre numéro :");
      Serial.println(roomNumber);
      // Affiche le numéro de la chambre sur le 7 segment
      byte chiffre = digit[roomNumber];
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, LSBFIRST, chiffre);
      digitalWrite(latchPin, HIGH);
      wait = millis();
    }
  }
  if (roomNumber == 0) {
    Serial.println ("Aucune chambre selectionnee !");
    LED_Rouge();
    programMode_OFF();
    LED_Verte();
    relais_actif();
    return;
  }

  // scan nouveau badge inconnu
  if (! rfid.PICC_IsNewCardPresent());
  if (! rfid.PICC_ReadCardSerial());
  serNumLu = *((uint32_t *)rfid.uid.uidByte);
  rfid.PICC_HaltA(); // Arrête de lire

  // compare UID badge, si identique alors reset credit
  if (Badge[roomNumber].sernum == serNumLu) {
    successWrite_credit();
    Serial.println("Badge connu");
    Serial.print("UID Badge ["); Serial.print(Badge[roomNumber].sernum); Serial.println("] ");
    Badge[roomNumber].credit = 5;
    Serial.println("Credits Réinitialisé...");
    Serial.print("Crédits= "); Serial.println(Badge[roomNumber].credit);
    write_eeprom(roomNumber);   // Modification des données sur l'EEPROM
    read_eeprom(roomNumber);    // Vérification du changement
    programMode_OFF();
    return;
  } else {
    //  enregistre le UID du nouveau badge
    // dans l'EEPROM à la place de celui de la chambre sélectionnée
    Badge[roomNumber].sernum = serNumLu;
    successWrite_UID();
    //Affiche le serNumLu sur le moniteur série (UID Badge [........])
    Serial.println("Lecture du nouveau Badge...");
    Serial.print("UID Badge ["); Serial.print(Badge[roomNumber].sernum); Serial.println("] ");
    write_eeprom(roomNumber);   // Modification des données sur l'EEPROM
    read_eeprom(roomNumber);    // Vérification du changement
    programMode_OFF();
    return;
  }
}
//////////////////////////////////// VERIFIE DATE POUR RESET CREDITS /////////////////////////////////
void date_heure() {
  static unsigned long chrono = millis();
  if (millis() - chrono < 1000ul) return;
  chrono = millis();
  //Affiche date et heure lors du badge sur le moniteur série
  dt = clock.getDateTime();

  //Exemple --> Date : 2/5/2020 16H 15min 31Sec
  Serial.print("Date : ");
  Serial.print(dt.day);    Serial.print("/");
  Serial.print(dt.month);  Serial.print("/");
  Serial.print(dt.year);   Serial.print(" ");
  Serial.print(dt.hour);   Serial.print("H");
  Serial.print(dt.minute); Serial.print("min ");
  Serial.print(dt.second); Serial.println("Sec");

  if ((dt.day == 2) && (dt.hour == 17) && (dt.minute == 33) && (dt.second == 0)) {
    for (int i = 1 ; i < nbUser ; i++) {
      Badge[i].credit = 2;
      Serial.println(Badge[i].nom);
      Serial.print("Crédits= "); Serial.println(Badge[i].credit);
      write_eeprom(i);   // Modification des données sur l'EEPROM
      read_eeprom(i);    // Vérification du changement
    }
    delay (1000);
    return;
  }
}