Go Down

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

yohann74

Bonjour a tous, J'ai quelques questions sur mon 2 ème projet.

Mon idée est de mettre un Arduino sur un lave linge/sèche linge pour en limiter la fréquence d'utilisation; je m'explique :

Mes parents ont mis un lave linge et un sèche linge à disposition de plusieurs locataires d'une même maison. Je voudrais réguler l'accès à ce lave linge via une carte RFID et un ARduino.

Donc, au passage de la carte RFID du locataire un relais se met en route pendant 2hrs par exemple (temps d'un cycle ou 2)...
je pense que cela est possible via un relais 5v/220V et une commande de type Delay vous me confirmez ??  :smiley-roll-sweat: ??

L'autre idée est de "créditer" la carte de 10 passages par exemple, et a chaque passage celle ci se déduit...
Ca c'est possible à votre avis ?? Si oui, auriez des infos,des pistes, des tuto ou je pourrais aller gratter un peu parce que pour le moment je vois pas du tout comment faire ????

lesept

#1
Jan 12, 2020, 11:59 am Last Edit: Jan 12, 2020, 12:00 pm by lesept
C'est possible bien sûr.
Il faut d'abord que tu apprennes à te servir du lecteur RFID, cherche des tutos sur le sujet, ou une bibliothèque et teste les exemples.

Ensuite tu peux créer une struct qui contient diverses informations pour chaque utilisateur. Son numéro de badge, son nom, le nombre d'utilisations de la machine, etc.
Puis chaque fois qu'un utilisateur se présente avec son badge, tu mets la struct à jour (genre augmenter le nombre d'utilisations) et tu agis en conséquence : si le nombre maximum est dépassé, tu affiches un message sur un LCD, sinon tu mets le relais sur on et tu lances un chrono qui le fermera au bout de deux heures.

Il faut interdire l'accès à d'autres utilisateurs pendant ce temps.
Prévois des leds (rouge, verte) pour indiquer l'état de fonctionnement et des boutons pour interagir avec ton système.

Il faut que tu prévoies un mode admin pour ton badge, afin de voir le crédit de chaque utilisateur ou des statistiques d'utilisation, et de lui ajouter du crédit lorsque c'est nécessaire.

Il faut aussi sauver les données utilisateurs dans l'EEPROM pour gérer une éventuelle panne de courant qui remettrait tout à zéro.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Artouste

Bonjour a tous, J'ai quelques questions sur mon 2 ème projet.

Mon idée est de mettre un Arduino sur un lave linge/sèche linge pour en limiter la fréquence d'utilisation; je m'explique :

Mes parents ont mis un lave linge et un sèche linge à disposition de plusieurs locataires d'une même maison. Je voudrais réguler l'accès à ce lave linge via une carte RFID et un ARduino.

Donc, au passage de la carte RFID du locataire un relais se met en route pendant 2hrs par exemple (temps d'un cycle ou 2)...
je pense que cela est possible via un relais 5v/220V et une commande de type Delay vous me confirmez ??  :smiley-roll-sweat: ??

L'autre idée est de "créditer" la carte de 10 passages par exemple, et a chaque passage celle ci se déduit...
Ca c'est possible à votre avis ?? Si oui, auriez des infos,des pistes, des tuto ou je pourrais aller gratter un peu parce que pour le moment je vois pas du tout comment faire ????
bonjour
Tu a une belle base de travail avec ta "résidence etudiant" de 10 locataires :smiley-mr-green:



le panel est un suffisamment  important pour penser modulaire et pas trop pour ne pas rentrer dans de la reflexion de grande masse.


pour ce point particulier "lave linge"  avec une base MFRC22  : 1 seul lecteur/encodeur  ~10 tag

çà reste jouable assez facilement  en mode "prépayé"  décrémentation  du credit à chaque présntation.


Ha oui ! un point  particulier à pendre en compte : selon les études poursuivies par  tes étudiants (ou leurs relations 8)

tes systèmes risquent d'être trés rapidement "hacké"  :smiley-evil:

yohann74

@lesept : merci beaucoup pour ta réponse c'est top je crois que tu as bien fait le tour de la question et des problèmes potentiels c'est op !!

Par contre j'ai pas fini de passer des nuits blanches avec ce projet moi :smiley-grin:  :smiley-grin: . Parce que je pars de loin quand même...

Pour le badge,les leds et l'écran LCD j'ai reussi à refaire le montage à la maison en suivant les tuto et ca marche même si j ai pas tout compris.

Je vais bûcher, certainement en essayant de trouver une struct de base la plus proche de mon projet et de mon matériel;  mais je me permettrai de revenir vers vous pour les problèmes rencontrés . Merci en tout cas.

@artouste je vois que certains font le rapprochement de posts je me suis fait pisté :D  :D  :smiley-razz:  ;) 
J'ai commandé un lecteur WIEGAN je ne sais pas si je peux augmenter les tags mais de toutes facon tous ne seront pas intéressé par la laverie certains ramènent leur linge à maman le week end ;)

Pour les pirates une bonne vieille caméra de surveillance dans un coin de la laverie devrait m'aider   

lesept

Pour un programme comme celui ci, je te conseille de le diviser en petites fonctions simples, faisant un minimum de choses et donc faciles à valider une par une. Puis tu construis le squelette du code dans la loop en appelant les fonctions une par une. Ça tournera probablement autour de la lecture de la pin du lecteur RFID et du suivi du chrono.
On t'aidera, pas de souci!
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J4l13n

#5
Jan 12, 2020, 10:33 pm Last Edit: Jan 13, 2020, 12:34 am by J4l13n
Il faudra prendre des relais (sur)dimensionné à la puissance/intensité des appareils, sachant qu'ils ne doivent sûrement pas répondre à la directive des machines.

@+

Jambe

Attention à l'aspect légal de la caméra

yohann74

@J4l13n : je pense agir sur un contacteur de puissance ca me permettra de pas avoir un relais 20A ou 36A à gérer depuis mon Arduino.

@lesept : Merci de tes conseils, je t'ai lu sur quelques post qui ont étés instructifs

@tout le monde  :)

Ca y est j'ai commencé a griffonner un code pour mon lave linge il fonctionne(sauf la décrémentation) mais avant de persévérer j'aimerai avoir votre avis si je continue la dessus ou il me faut une autre base ... (ca reste de la compil de code trouvés à droite à gauche  ::)  :) 

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 sernum[11] = {0, 3643054959,0, 1159921925, 3278950471, 0, 0, 0, 0,0, 3643057959}; //poste 0 N° carte lue, poste 1 à 9 pour UID carte a tester, poste 10 carte master

int buzzer = 8;
int led_rouge = 14;
int led_verte = 15;
int compteur_1; // Crédit de la carte 1

byte tagok = 0;

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
  mfrc522.PCD_Init();        // Init MFRC522 card
lcd.print("Dispositif");
  lcd.setCursor(0, 1);
  lcd.print("d'identification");
  delay(3000);
  lcd.clear();
  compteur_1=10;
}

void loop() {

//ecriture accueil
 lcd.print("Scannez votre");
  lcd.setCursor(0, 1);
  lcd.print("carte ou badge..");

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

  sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned

  Serial.print(" ");
  Serial.print(sernum[0]);
  Serial.print(" ");
  Serial.print(sernum[0], HEX);
  Serial.print(" ");
  tagok = 0;
  for  (byte i = 1; i < 10; i++) {
    if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste

  }
  if (sernum[0] == sernum[10]) tagok = 255; // carte master reconnue

  if (tagok == 0) { // faire si carte inconnue
    Serial.print("TAG INCONNU");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("ACCES REFUSE");
    digitalWrite(led_rouge, HIGH);
    tone(buzzer, 200, 750);
    delay(2000);
    digitalWrite(led_rouge, LOW);
    lcd.clear();
  }
  if (tagok >0) //faire si carte reconnue
  {
  lcd.clear();
   
    if (sernum[0] == sernum[1])
    Serial.print("Badge de YO" ); //Quand on présente badge 1
    lcd.setCursor(0, 0);
    lcd.print("ACCES AUTORISE");
    lcd.setCursor(0, 1);
    lcd.print("SALUT Yohann");
    digitalWrite(led_verte, HIGH);
    tone(buzzer, 1200, 100);
    delay(300);
    tone(buzzer, 1200, 100);
    delay(2000);
    digitalWrite(led_verte, LOW);
    lcd.clear();
    delay(1000);
    compteur_1=-1;
    lcd.print("compteur_1");
    lcd.setCursor(0, 1);
    lcd.print("crédit:");
   
    if (sernum[0] == sernum[2]) Serial.print("Badge locataire intel...    " ); //Quand on présente badge 2
    if (sernum[0] == sernum[3]) Serial.print(" " ); //Quand on présente badge 3
    if (sernum[0] == sernum[4]) Serial.print("    " ); //Quand on présente badge 4
    if (sernum[0] == sernum[5]) Serial.print("   " ); //Quand on présente badge 5
    if (sernum[0] == sernum[6]) Serial.print("    " ); //Quand on présente badge 6
    if (sernum[0] == sernum[7]) Serial.print(" " ); //Quand on présente badge 7
    if (sernum[0] == sernum[8]) Serial.print("" ); //Quand on présente badge 8
    if (sernum[0] == sernum[9]) Serial.print("" ); //Quand on présente badge 9
    if (sernum[0] == sernum[10]) Serial.print("Badge MASTER" );
    delay(50);
   
  }

  if (tagok == 255) //faire si carte master reconnue
  {

    Serial.print("CARTE MASTER RECONNUE");

  }


Serial.println();

mfrc522.PICC_HaltA(); // Halt PICC

}

lesept

#8
Jan 14, 2020, 03:26 pm Last Edit: Jan 14, 2020, 03:27 pm by lesept
C'est un bon début, bravo !
Je te conseille de séparer le tag lu de ton tableau de tags utilisateurs. Tu remplaces sernum[0] par une autre variable serNumLu par exemple. Ensuite, tu mets le numéro de tag MASTER en début de tableau (en position 0) et les autres à la suite.
Ça ne change pas grand chose, mais c'est plus logique dans la lecture du code.

Ensuite, utilise des if { } else if { } else if { } else { } plutôt qu'une batterie de if. De même ça me semble plus lisible. Enfin, utilise une boucle for pour chercher le numéro du tag lu dans ton tableau de numéros.

Code: [Select]
tagok = 255;
 for  (byte i = 0; i < 10; i++) if (serNumLu  == sernum[i]) tagok = i; // carte reconnue dans la liste

Tu stockes directement le numéro du tag reconnu : si c'est 0 (MASTER) tu fais les actions associées au master (écris une fonction pour ça), sinon le reste (une autre fonction) :

Code: [Select]
if (tagok == 255) Inconnu();
else if (tagok == 0) Master();
else pasMaster (tagok);


Tu peux créer une struct pour stocker les divers paramètres de chaque utilisateur : nom, existe ou non (cas d'un utilisateur qui est parti), nombre d'utilisations, crédit restant, etc.
Code: [Select]
struct Params{
    char nom[20];
    bool existe;
    int nbUtils;
    int credit
};
struct Params Utilisateur[10];

Tu peux accéder au crédit de l'utilisateur numéro 3 avec Utilisateur[3].credit
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Artouste

@J4l13n : je pense agir sur un contacteur de puissance ca me permettra de pas avoir un relais 20A ou 36A à gérer depuis mon Arduino.

@lesept : Merci de tes conseils, je t'ai lu sur quelques post qui ont étés instructifs

@tout le monde  :)

Ca y est j'ai commencé a griffonner un code pour mon lave linge il fonctionne(sauf la décrémentation) mais avant de persévérer j'aimerai avoir votre avis si je continue la dessus ou il me faut une autre base ... (ca reste de la compil de code trouvés à droite à gauche  ::)  :)  
Bonjour
c'est un bon début  pour te faire la "main"
prend en compte les bonnes remarques précédentes de lesep
Garde à l'esprit qu'un tag/badge (mifare) comme ceux généralement fournis avec le le MFRC522
peuvent aussi "assez" facilement  embarquer/restituer des infos "un...  petit peu protégées" :smiley-mr-green:

dans certaines zones mémoires


C'est plus à çà que je pensais lorsque je parlais de "crédit" embarqué et décrémenté lors d'une présentation


l'info de crédit dispo est embarqué/mis à jour  sur le badge/tag lui même  et pas en dehors



mais chaque chose en son temps 8)




yohann74

#10
Jan 14, 2020, 07:28 pm Last Edit: Jan 14, 2020, 08:41 pm by yohann74
Merci pour vos encouragement et vois conseils.

Par contre je suis en boucle (c'est le cas de la dire) sur le passage de serNum[0] à serNumLu.

est ce qu'il y a une subtilité avec le rappel de consigne unsigned long ou c'est ailleur mon problème ??
unsigned long deviendrai

Code: [Select]
serNumLu = *((unsigned long *)mfrc522.uid.uidByte);

J'ai laissé  long sernum[11] car c'est la consigne qui permet de "désigner" les tags non ?? :
Code: [Select]
unsigned long sernum[11] = {0, 3643054959,0, 1159921925, 3278950471, 0, 0, 0, 0,0, 3643057...];
??

lesept

Ne te pose pas trop de questions. Tu déclares un
unsigned long serNumLu = 0;
Et tu remplaces dans ton code toutes les occurrences de sernum[0] par serNumLu

Dans la déclaration du tableau, tu mets en première position, position 0,le numéro de badge du Master.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74


Bon.... M'en sors pas :-[ .

J'ai relu 15 fois vos messages et bouquiné pas mal de code mais je bloque.

J'ai essayé comme m'a dit @lesept de déclarer un unsigned long sernumlu = 0 et remplacé les sernum 0 partout mais pas moyen de le faire passer (plusieurs tentatives). Du coup j'ai essayé de traduire chaque ligne pour mieux comprendre et les passer petit à petit .

pour résumé j'ai mis  un unsigned long serNumLu = 0; j'ai déclaré un tableau de badges.(dumoins je crois)  .... j'ai essayé tous les codes que vous m'avez donné mais j'y arrive pas 

je n'arrive pas a intégrer le else non plus pour les badges de 1 a 9 il me dit qu il faut un if avec il ne veux pas prendre le premier if...

un petit coup de main ??

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;
int badge[10],i=0;  //déclaration de tableau de 10 badges,i variable pour aller chercher dans le tableau

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

byte 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
 
  lcd.print("Dispositif");
  lcd.setCursor(0, 1);
  lcd.print("d'identification");
  delay(3000);
  lcd.clear();
  //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
}
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);
      }

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


   if (tagok == 255); //Badge inconnu
 
   else if (tagok  == 0); //badge 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);
    lcd.clear();}

}




lesept

#13
Jan 17, 2020, 10:04 pm Last Edit: Jan 18, 2020, 04:22 pm by lesept
Remplace ceci
Code: [Select]
int badge[10],i=0; 
Par cela
Code: [Select]
unsigned long badge [10];

Laisse tomber le i...

Fais une indentation à automatique avec CTRL T dans l'IDE. C'est plus facile à lire.

Si tu as des erreurs de compilation, poste l'ensemble des messages. Sinon explique ce que "il" te dit (c'est qui "il"?)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

yohann74



Salut @lesept, merci de continuer à m aider dans mon projet. Effectivement ca fait plus propre avec indentation automatique

J'imagine que déclarer le tableau avec unsigned long est par rapport à la taille du tag en hexadécimal non ?

heuuuu par contre je t'ai un peu perdu pour le "il te dit" tu parles des messages d'erreur ?

alors le code passe et j'arrive à le téléverser dans l'état mais il accepte tous tags que je lui présente ...

je pense que le problème vient de là :


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


  if (tagok == 255); //Badge inconnu

  else if (tagok  == 0); //badge master
  if (tagok); //autres badges



l'idée est de récupérer le numéro de tags que l'on passe et de dire :
si tagok est 0 : c'est master
et si tagok est 255 c'est inconnu
quant aux autres c'est ok (en faisant une autre action)

du coup

d'une je me demande comment je vais pouvoir déplémenter un compte si je ne différencie pas les badges de 1 à 9 ?

de 2 je ne comprend pas pourquoi il m'accepte tous les badges quand je téléverse... quelque chose m'echappe avec le tag ok ??

peut être parceque je n ai pas de ligne qui dise que tagok == 0 est le badge[0] .. non ??

Go Up