Carte Rfid avec Servo moteur pour créer un coffre

Bonjour,

Je dois réaliser un projet pour un cours avec de l'arduino.

L'idée c'est de créer un coffre avec lecture de carte Rfid avec un écran qui affiche si c'est ouvert ou fermé et un servo moteur qui s'ouvre et se ferme comme une serrure.

De plus, j'y ai ajouté 3 led (1 bleue fixe, 1 verte quand c'est ouvert et 1 rouge quand l'accès est refusé)
et un Buzzer.

Tout marche parfaitement sauf une chose, les rotations du servo, je voudrai que quand je montre la carte le servo tourne (dévérouillage) et quand je remontre la carte il se ferme (comme une serrure simple) mais impossible quand je veux "fermer" ma serrure le servo moteur fait un aller retour rapidement

En espérant que mes explications soient claires..

Voici mon code je pense qu'il y a que très peu de modifications à faire mais je ne trouve pas la solution...

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>

#define greenLed 3
#define redLed  4
#define servoPin  7
#define buzzerPIN 6
//#define buzzerPIN A0  //Branchement analogique

LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(10,9);
Servo sg90;
String tagUID = "50 C7 03 9A";
bool lock = false;

void setup() {
  pinMode(buzzerPIN, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  
  sg90.attach(servoPin); 
  sg90.write(0); 
  
  lcd.init(); 
  lcd.backlight();
  SPI.begin();
  mfrc522.PCD_Init();
  lcd.clear();
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("RFID porte fermee");
  lcd.setCursor(0, 1);
  lcd.print("montrer la cle ");
  
  
  if (!mfrc522.PICC_IsNewCardPresent()) //ATTENTE CARTE RFID
  {
    return -1;
  } 
  if ( ! mfrc522.PICC_ReadCardSerial()) //LECTURE CARTE RFID
  {
    return -1;
  }

  //CONVERTION DU UID DE LA CARTE EN STRING
  String tag = "";
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); //si byte < 0x10 alors uidByte[i] =" 0" sinon = " " 
    tag.concat(String(mfrc522.uid.uidByte[i], HEX)); //convertion en HEXADECIMAL
  }
  tag.toUpperCase();

  //COMPARAISON DU UID DE LA CARTE AVEC CELLUI DE REFFERENCE
  if (tag.substring(1) == tagUID) // If UID of tag is matched.
  {
    lock = !lock;
	 
	if(lock)
		sg90.write(0); //VERROUILLAGE
	else
	{
		lcd.clear();
		lcd.setCursor(0, 0);
		lcd.print("acces autorise");
		lcd.setCursor(0, 1);
		lcd.print("Porte Ouverte");
		
		digitalWrite(greenLed, HIGH);
		tone(buzzerPIN,33,500);
		delay(500);
		tone(buzzerPIN,33,500);
		sg90.write(90); //DEVERROUILLAGE
		delay(1000);
		digitalWrite(greenLed, LOW);
		lcd.clear();
		lcd.print("acces autorise");
	}
  }
  else
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Mauvaise cle");
    lcd.setCursor(0, 1);
    lcd.print("Acces refuse");
    
    digitalWrite(redLed, HIGH);
    tone(buzzerPIN,244,500); 
    delay(500);
    tone(buzzerPIN,244,500);
    digitalWrite(redLed, LOW);
    lcd.clear();
  }
}

version12.ino (2.13 KB)

votre loop commence par

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("RFID porte fermee");
  lcd.setCursor(0, 1);
  lcd.print("montrer la cle ");

ne devriez vous pas tenir compte de votre variable lock...

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Bonjour,

N'étant pas très fort je ne comprends pas trop votre réponse.. Si vous saviez un peu me guider sur comment changer mon code..

suivez mon tuto sur les machines à état... c'est pas plus compliqué qu'un bouton qui sert à allumer ou éteindre une LED ce que vous voulez faire..

Je l'ai lu mais je ne vois pas comment placer un switch et un break dans mon code..

Comme ceci?

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>

#define greenLed 3
#define redLed  4
#define servoPin  7
#define buzzerPIN 6
//#define buzzerPIN A0  //Branchement analogique

LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(10,9);
Servo sg90;
String tagUID = "50 C7 03 9A";
int sg90.write (0) =servoouvert;
int sg90.write (90) =servoferme;
void setup() {
  pinMode(buzzerPIN, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  
  sg90.attach(servoPin); 
  sg90.write(0); 
  lcd.init(); 
  lcd.backlight();
  SPI.begin();
  mfrc522.PCD_Init();
  lcd.clear();
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("RFID porte fermee");
  lcd.setCursor(0, 1);
  lcd.print("montrer la cle ");
  
  
  if (!mfrc522.PICC_IsNewCardPresent()) //ATTENTE CARTE RFID
  {
    return -1;
  } 
  if ( ! mfrc522.PICC_ReadCardSerial()) //LECTURE CARTE RFID
  {
    return -1;
  }

  //CONVERTION DU UID DE LA CARTE EN STRING
  String tag = "";
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); //si byte < 0x10 alors uidByte[i] =" 0" sinon = " " 
    tag.concat(String(mfrc522.uid.uidByte[i], HEX)); //convertion en HEXADECIMAL
  }
  tag.toUpperCase();

enum {servoouvert, servoferme, mauvaisepin} etat;
while (tag.substring(1) == tagUID);
switch (etat)
{
  
  case servoouvert: 
  lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("acces autorise");
    lcd.setCursor(0, 1);
    lcd.print("Porte Ouverte");
    
    digitalWrite(greenLed, HIGH);
    tone(buzzerPIN,33,500);
    delay(500);
    tone(buzzerPIN,33,500);
    sg90.write(90); //DEVERROUILLAGE
    delay(1000);
    digitalWrite(greenLed, LOW);
    lcd.clear();
    lcd.print("acces autorise");
   break;
  
case servoferme:

    sg90.write(0); //VERROUILLAGE
  break;
  
  case mauvaisepin:
  if (tag.substring(1) != tagUID)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Mauvaise cle");
    lcd.setCursor(0, 1);
    lcd.print("Acces refuse");
    
    digitalWrite(redLed, HIGH);
    tone(buzzerPIN,244,500); 
    delay(500);
    tone(buzzerPIN,244,500);
    digitalWrite(redLed, LOW);
    lcd.clear();
  break;
}
}
}

tant que la loop() commencera en vous disant que c'est fermé, c'est que vous avez un soucis...

vous avez 2 états Ouvert ou Fermé et vous avez un évènement, la présentation de la carte...

Je suis vraiment désolé mais je ne comprends pas ce que vous me dites..

Donc là avec le code suivant j'arrive à l'ouvrir mais pas à le refermer il me manque juste ça..

Qu'ai-je à modifier exactement dans la case servoferme pour qu'il se ferme ?

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>

#define greenLed 3
#define redLed  4
#define servoPin  7
#define buzzerPIN 6
//#define buzzerPIN A0  //Branchement analogique

LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(10,9);
Servo sg90;
String tagUID = "50 C7 03 9A";

void setup() {
  pinMode(buzzerPIN, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  
  sg90.attach(servoPin); 
  sg90.write(0); 
  lcd.init(); 
  lcd.backlight();
  SPI.begin();
  mfrc522.PCD_Init();
  lcd.clear();
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("RFID porte fermee");
  lcd.setCursor(0, 1);
  lcd.print("montrer la cle ");
  
  
  if (!mfrc522.PICC_IsNewCardPresent()) //ATTENTE CARTE RFID
  {
    return -1;
  } 
  if ( ! mfrc522.PICC_ReadCardSerial()) //LECTURE CARTE RFID
  {
    return -1;
  }

  //CONVERTION DU UID DE LA CARTE EN STRING
  String tag = "";
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); //si byte < 0x10 alors uidByte[i] =" 0" sinon = " " 
    tag.concat(String(mfrc522.uid.uidByte[i], HEX)); //convertion en HEXADECIMAL
  }
  tag.toUpperCase();

enum {servoouvert, servoferme, mauvaisepin} etat;

switch (etat)
{
  
  case servoouvert: 
if (tag.substring(1) == tagUID)
{
  lcd.clear();
  
    lcd.setCursor(0, 0);
    lcd.print("acces autorise");
    lcd.setCursor(0, 1);
    lcd.print("Porte Ouverte");
    
    digitalWrite(greenLed, HIGH);
    tone(buzzerPIN,33,500);
    delay(500);
    tone(buzzerPIN,33,500);
    sg90.write(90); //DEVERROUILLAGE
    delay(1000);
    digitalWrite(greenLed, LOW);
    lcd.clear();
    lcd.print("acces autorise");
   break;
}
case servoferme:
if (tag.substring(1) == tagUID)
{
    sg90.write(0); //VERROUILLAGE
  break;
}
  case mauvaisepin:
  if (tag.substring(1) != tagUID)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Mauvaise cle");
    lcd.setCursor(0, 1);
    lcd.print("Acces refuse");
    
    digitalWrite(redLed, HIGH);
    tone(buzzerPIN,244,500); //tone(pin,frequence,duree); sert à faire une note avec le buzzer pendant une certaine duree
    delay(500);
    tone(buzzerPIN,244,500);
    digitalWrite(redLed, LOW);
    lcd.clear();
  break;
}
}
}

la structure du code de la boucle doit être

si la bonne carte et présentée alors
   si le coffre est ouvert alors
       le fermer
   sinon 
       l'ouvrir

Comment puis-je rentrer fermer quand le coffre est ouvert?

if (sg90.write == 0) ?

Je ne sais pas comment rentrer cette info..

dans votre premier code vous aviez une variablebool lock = false; qui changeait d'état    lock = !lock;au moment opportun... c'était une bonne idée...

J'essaye mais rien n'y fait..

Possible pour vous de le modifier et me le renvoyer ? Je ne sais plus quoi faire.. C'est juste le verrouillage qui est problématique sinon tout le reste fonctionne

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>

#define greenLed 3
#define redLed  4
#define servoPin  7
#define buzzerPIN 6
//#define buzzerPIN A0  //Branchement analogique
bool lock=false;
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(10,9);
Servo sg90;
String tagUID = "50 C7 03 9A";

void setup() {
  pinMode(buzzerPIN, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  
  sg90.attach(servoPin); 
  sg90.write(0); 
  lcd.init(); 
  lcd.backlight();
  SPI.begin();
  mfrc522.PCD_Init();
  lcd.clear();
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("RFID porte fermee");
  lcd.setCursor(0, 1);
  lcd.print("montrer la cle ");
  
  
  if (!mfrc522.PICC_IsNewCardPresent()) //ATTENTE CARTE RFID
  {
    return -1;
  } 
  if ( ! mfrc522.PICC_ReadCardSerial()) //LECTURE CARTE RFID
  {
    return -1;
  }

  //CONVERTION DU UID DE LA CARTE EN STRING
  String tag = "";
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); //si byte < 0x10 alors uidByte[i] =" 0" sinon = " " 
    tag.concat(String(mfrc522.uid.uidByte[i], HEX)); //convertion en HEXADECIMAL
  }
  tag.toUpperCase();

enum {servoouvert, servoferme, mauvaisepin} etat;

switch (etat)
{
  
  case servoouvert: 
if (tag.substring(1) == tagUID)
{

  
  lcd.clear();
  
    lcd.setCursor(0, 0);
    lcd.print("acces autorise");
    lcd.setCursor(0, 1);
    lcd.print("Porte Ouverte");
    
    digitalWrite(greenLed, HIGH);
    tone(buzzerPIN,33,500);
    delay(500);
    tone(buzzerPIN,33,500);
   sg90.write (90);//DEVERROUILLAGE
    delay(1000);
    digitalWrite(greenLed, LOW);
    lcd.clear();
    lcd.print("acces autorise");
   break;

case servoferme:
lock=!lock;
if (lock)
{
    sg90.write(0); //VERROUILLAGE
  break;
}
}
  case mauvaisepin:
  if (tag.substring(1) != tagUID)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Mauvaise cle");
    lcd.setCursor(0, 1);
    lcd.print("Acces refuse");
    
    digitalWrite(redLed, HIGH);
    tone(buzzerPIN,244,500); //tone(pin,frequence,duree); sert à faire une note avec le buzzer pendant une certaine duree
    delay(500);
    tone(buzzerPIN,244,500);
    digitalWrite(redLed, LOW);
    lcd.clear();
  break;

}
}}