Mon code compile mais il subsiste une problème

Bonjour,

ayant pour projet la réalisation d'une place de parking pour personnes handicapées, moi et mon camarade, nous nous sommes lancés sur le montage d'une maquette et sur Arduino. J'ai récolté des bouts de codes ici et là et nous sommes prêts du but :). Une badge RFID permet de descendre un obstacle au stationnement, un photoresisteur s'occupe de laisser cette barriere baissée tant que la voiture est dessus. Le probleme est que lorsque la voiture est partie, la barriere ne se remet pas en place, pourtant mon code compile donc il y a bien un probleme dans mon code. Pourriez-vous me dire ou je me trompe ? Merci Bcp !

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

#define SS_PIN 10    
#define RST_PIN 9     
#define LED_Verte 5 //define green LED pin
#define LED_Rouge 4 //define red LED
#define BUZZER 2 //buzzer pin, 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
Servo myServo; //define servo name

int photoresistor = 0;              /*On crée une variable basée sur la luminosité ambiante donnée par le serial monitor*/
int threshold = 100;

void setup()
{
  Serial.begin(9600);   // Initiate a serial communication
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  myServo.attach(3); //servo pin   
  myServo.write(0); //servo start position
  pinMode(LED_Verte, OUTPUT);
  pinMode(LED_Rouge, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  noTone(BUZZER);
  Serial.println("Put your card to the reader...");
  Serial.println();

}
void loop()
{
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  //Show UID on serial monitor
  Serial.print("UID tag :");
  String content = "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "8D 20 06 85") //change here the UID of the card/cards that you want to give access
  {
    Serial.println("Authorized access");
    Serial.println();
    delay(500);
    digitalWrite(LED_Verte, HIGH);
    tone(BUZZER, 500);
    delay(300);
    noTone(BUZZER);
    myServo.write(90);
    delay(2000);
    myServo.write(0);
    digitalWrite(LED_Verte, LOW);


    photoresistor = analogRead(A0);   //On lit la lumière ambiante à l'aide du photorésisteur connecté à la PIN A0
    Serial.println(photoresistor);    //On peut lire cette valeur via le serial monitor


    if (photoresistor < threshold) {   //Si le photorésisteur lit une valeur en dessous du seuil alors la barrière reste ouverte
      myServo.write(90);         // servo ouvert

      delay(1000);                       //On attend 500 millisecondes avant d'effectuer un nouveau loop (et de lire la valeur suivante)

      if (photoresistor > threshold) {   //Si le photorésisteur lit une valeur en dessus du seuil alors la barrière se ferme apres (1000)
        myServo.write(0);         // servo fermé

        delay(1000);

         }
         }
         }
         

        else   {

          Serial.println(" Access denied");
          digitalWrite(LED_Rouge, HIGH);
          delay(500);
          tone(BUZZER, 300);
          delay(300);
          noTone(BUZZER);
          digitalWrite(LED_Rouge, LOW);
          delay(1000);
        }
      }

Tu devrais utiliser l'auto-indentation dans l'IDE Arduino (CTRL - T) qui permet de mieux voir les blocs entre accolades.
Il est possible que l'erreur soit là :

 if (photoresistor < threshold) {   //Si le photorésisteur lit une valeur en dessous du seuil alors la barrière reste ouverte
      myServo.write(90);         // servo ouvert

      delay(1000);                       //On attend 500 millisecondes avant d'effectuer un nouveau loop (et de lire la valeur suivante)

      if (photoresistor > threshold) {   //Si le photorésisteur lit une valeur en dessus du seuil alors la barrière se ferme apres (1000)
        myServo.write(0);         // servo fermé

        delay(1000);

         }
         }
         }

Les accolades sont mal placées :

 if (photoresistor < threshold) {   //Si le photorésisteur lit une valeur en dessous du seuil alors la barrière reste ouverte
      myServo.write(90);         // servo ouvert

      delay(1000);                       //On attend 500 millisecondes avant d'effectuer un nouveau loop (et de lire la valeur suivante)
       }   // <----
      if (photoresistor > threshold) {   //Si le photorésisteur lit une valeur en dessus du seuil alors la barrière se ferme apres (1000)
        myServo.write(0);         // servo fermé

        delay(1000);

         }
         }

Mais pas sûr...

Erreur facilement évitable en prenant l'habitude de garder son code source bien indenté... Un Control-T (ou Pomme-T) ne coûte rien.

Merci bcp pour vos reponses j'essaie ca tout de suite ! je suis un peu novice, veuillez m'en excuser mais j'adore déjà !

Bonsoir, malgré vos recommandations, mon acolyte me dit que la barriere ne se referme toujours pas lorsque la voiture est n'est plus sur le photoresisteur... n'ayant pas la maquette sous les yeux (chez mon camarade) je me demande desormais si ce n'est pas dans son montage que ca coince.... :frowning:

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

#define SS_PIN 10
#define RST_PIN 9
#define LED_Verte 5 //define green LED pin
#define LED_Rouge 4 //define red LED
#define BUZZER 2 //buzzer pin, 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
Servo myServo; //define servo name

int photoresistor = 0;              /*On crée une variable basée sur la luminosité ambiante donnée par le serial monitor*/
int threshold = 100;

void setup()
{
  Serial.begin(9600);   // Initiate a serial communication
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  myServo.attach(3); //servo pin
  myServo.write(0); //servo start position
  pinMode(LED_Verte, OUTPUT);
  pinMode(LED_Rouge, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  noTone(BUZZER);
  Serial.println("Put your card to the reader...");
  Serial.println();

}
void loop()
{
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  //Show UID on serial monitor
  Serial.print("UID tag :");
  String content = "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "8D 20 06 85") //change here the UID of the card/cards that you want to give access
  {
    Serial.println("Authorized access");
    Serial.println();
    delay(500);
    digitalWrite(LED_Verte, HIGH);
    tone(BUZZER, 500);
    delay(300);
    noTone(BUZZER);
    myServo.write(90);
    delay(2000);
    myServo.write(0);
    digitalWrite(LED_Verte, LOW);


    photoresistor = analogRead(A0);   //On lit la lumière ambiante à l'aide du photorésisteur connecté à la PIN A0
    Serial.println(photoresistor);    //On peut lire cette valeur via le serial monitor


    if (photoresistor < threshold) {   //Si le photorésisteur lit une valeur en dessous du seuil alors la barrière reste ouverte
      myServo.write(90);         // servo ouvert

      delay(1000);                       //On attend 500 millisecondes avant d'effectuer un nouveau loop (et de lire la valeur suivante)
    }   // <----
    if (photoresistor > threshold) {   //Si le photorésisteur lit une valeur en dessus du seuil alors la barrière se ferme apres (1000)
      myServo.write(0);         // servo fermé

      delay(1000);

    }
  }


  else   {

    Serial.println(" Access denied");
    digitalWrite(LED_Rouge, HIGH);
    delay(500);
    tone(BUZZER, 300);
    delay(300);
    noTone(BUZZER);
    digitalWrite(LED_Rouge, LOW);
    delay(1000);
  }
}

Les if de l'ouverture et de la fermeture du servo sont dans le if de la reconnaissance de la carte d'accès.
Donc si le badge n'est pas devant le lecteur, le servo ne se ferme pas. Et si le badge est devant le lecteur et qu'au bout de la seconde allouée à l'ouverture la photorésistance ne signale pas de lumière, le servo ne se ferme pas non plus.

Ton code est mal formulé, il faut plutôt le voir comme une machine d'états. Cherche le tuto de J-M-L dans la section des tutos du forum, si tu ne sais pas ce que c'est. Au pire; tu peux faire sans ça, car ce n'est pas très compliqué -mais lis le quand même, ça peut te donner des idées)...

Il te faut un état pour le servo : ouvert ou fermé. Ensuite, selon la présence du lecteur ou la réponse de la photorésistance, tu agis en conséquence.

Bonjour et merci pour ta reponse,

en fait j'étais parti à la base sur un projet sans Badge Rfid et avec un capteur de distance ultrason. Mon code marchait tres bien a ce moment, la barriere se refermait bien une fois la voiture partie. Dès lors qu'il a fallu ajouter le lecteur de badge RFID, j'ai dû mal m'y prendre. Je vais lire le lien que tu m'as donné en espérant comprendre ou j'ai mal placé mes If.

/* Import de la librairie pour le capteur ultrason HCSR04
  et pour le servomoteur */
#include <HCSR04.h>
#include <Servo.h>


/* On créé un objet capteur ultrason (UltraSonicDistanceSensor)
   que l'on initialise sur les pins D2 pour TRIG et D3 pour ECHO*/
UltraSonicDistanceSensor capteur_distance(2, 3);

/* Creation d'un objet Servo pour contrôler le servomoteur */
Servo mon_servo;


int photoresistor = 0;              /*On crée une variable basée sur la luminosité ambiante donnée par le serial monitor*/
int threshold = 100;                /*Si le photorésistor recoit une donnée inférieure au threshold alors la lumière s'allume*/


/*  la fonction setup() permet de mettre en place l'environnement */
void setup () {


  /* - On initialise une connection série pour pouvoir afficher les
    valeurs dans le moniteur ou le traceur (menu Outils).
       - On indique que notre servomoteur est relié à la Pin 8
       - On positionne notre servomoteur à l'horizontale (180°)   */
  Serial.begin(9600);
  mon_servo.attach(8);
  mon_servo.write(180);

  /*On déclare les Pins concernées par les instructions */
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);

}

/* la fonction loop() boucle à l'infini,
  lit la valeur du capteur et actionne le moteur */
void loop () {

  int distance = capteur_distance.measureDistanceCm();
  /* on lit la distance en cm mesurée par le capteur grâce
    à la fonction measureDistanceCm de l'objet capteur_distance précédemment créé */

  /* on teste si la valeur est comprise entre 1 cm et 15 cm */
  if ( distance > 1 && distance < 30 ) {
    /* Si elle est comprise entre 1 cm et 15 cm
      on l'envoi à la connexion série pour l'afficher dans le moniteur ou le traceur */
    Serial.println(distance);
    /* On demande un angle de 90° au servo moteur ce qui doit ouvrir la barrière */
    mon_servo.write(90);
    /* et on attend 1000 millisecondes = 1 secondes avant de continuer */
    delay(1000);

    if ( distance >= 20 ) /*Si le véhicule est à une distance >= à 20, alors la LED 9 clignote*/
      digitalWrite(9, HIGH); //led allumé
    delay (100);
    digitalWrite(9, LOW); //led éteinte
    delay (100); //atente 1 seconde

    if ( distance >= 15 ) /*Si le véhicule est à une distance >= à 15, alors la LED 10 clignote*/
      digitalWrite(10, HIGH); //led allumé
    delay (100);
    digitalWrite(10, LOW); //led éteinte
    delay (100); //atente 1 seconde

    if ( distance >= 10 ) /*Si le véhicule est à une distance >= à 10, alors la LED 11 clignote*/
      digitalWrite(11, HIGH); //led allumé
    delay (100);
    digitalWrite(11, LOW); //led éteinte
    delay (100); //atente 1 seconde

    if ( distance <= 5 ) /*Si le véhicule est à une distance >= à 5, alors la LED 12 clignote*/
      digitalWrite(12, HIGH); //led allumé
    delay (100);
    digitalWrite(12, LOW); //led éteinte
    delay (100); //atente 1 seconde



    photoresistor = analogRead(A0);   //On lit la lumière ambiante à l'aide du photorésisteur connecté à la PIN A0
    Serial.println(photoresistor);    //On peut lire cette valeur via le serial monitor


    if (photoresistor < threshold) {   //Si le photorésisteur lit une valeur en dessous du seuil alors la LED rouge "Place occupée" s'allume
      digitalWrite(4, HIGH);         // LED allumée
    } else {                         // Sinon :
      digitalWrite(4, LOW);          // LED éteinte
    }

    delay(500);                       //On attend 500 millisecondes avant d'effectuer un nouveau loop (et de lire la valeur suivante)
  }

  else {
    // Sinon (c'est à dire si la distance du véhicule par rapport au capter de distance n'est pas comprise entre 1cm et 15 cm)
    //  Alors on ferme la barrière en positionnant le servomoteur à 180°
    mon_servo.write(180);

    // On attend 500 millisecondes avant d'effectuer un loop et de lire la valeur suivante */
    delay(500);


    //Puise la barrière est fermée, la place de parking est libre donc la LED "Place libre" clignote
    digitalWrite(6, HIGH); //led allumé
    delay (3000);
    digitalWrite(6, LOW); //led éteinte
    delay (500); //atente 1 seconde

  }
}

Si tu veux faire un code non bloquant, un peu structuré, il faut séparer les fonctions et coder en utilisant des variables pour stocker les états de ton système.

Les fonctions sont (si j'ai bien compris) :

  • Attente (d'un badge ou du début ou fin du mouvement du servo)
  • Lecture badge
  • Lecture photorésistance
  • Ouvrir ou fermer le servo

Les états peuvent être :

  • Badge : présent, absent, correct, incorrect
  • Servo : inactif, en ouverture, en fermeture, ouvert, fermé

En fonction de ces états, il faut lancer des actions. Par exemple :

  • Si le badge est incorrect, ne rien faire (attendre)
  • Si le badge est correct et si le servo est fermé : lancer l'ouverture
  • Si le servo est en cours d'ouverture : attendre (la fin de l'ouverture ou l'arrivée d'un évènement)
  • etc.

Donc tu dois lister toutes les possibilités et décider des actions qui doivent être faites dans chaque cas. Ce n'est pas forcément une liste, ça peut être fait comme un arbre, une matrice, je te laisse choisir ce que tu préfères...

Une chose : pour ouvrir ou fermer le servo, ce que tu fais est bloquant. Imagine que la durée de mouvement soit de 10 minutes, le code est bloqué et ne fait rien pendant tout ce temps. Pour ne pas être bloquant, il faut lancer un chrono au début du mouvement, et à chaque fois que ce chrono dépasse un certain seuil (pour régler la vitesse) tu changes la position du servo. Il doit y avoir une commande qui permet d'incrémenter ou décrémenter d'un pas la position du servo. Tu peux même utiliser une variable 'sens' qui vaut 1 ou -1 selon le sens...

Bonjour

en suivant tes conseils, voici le code que ca donne. Malheureusement bien que la barriere reste ouverte lorsque le photoresisteur est couvert, elle ne se referme toujours pas quand il est decouvert :confused:...

Je vais finir par trouver

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

#define SS_PIN 10
#define RST_PIN 9
#define LED_Verte 5 //define green LED pin
#define LED_Rouge 4 //define red LED
#define BUZZER 2 //buzzer pin, 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
Servo myServo; //define servo name

int photoresistor = 0;              /*On crée une variable basée sur la luminosité ambiante donnée par le serial monitor*/
int threshold = 750;

void setup()
{
  Serial.begin(9600);   // Initiate a serial communication
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  myServo.attach(3); //servo pin
  myServo.write(0); //servo start position
  pinMode(LED_Verte, OUTPUT);
  pinMode(LED_Rouge, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  noTone(BUZZER);
  Serial.println("Put your card to the reader...");
  Serial.println();



}
void loop()
{
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  //Show UID on serial monitor
  Serial.print("UID tag :");
  String content = "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "8D 20 06 85") //change here the UID of the card/cards that you want to give access
  {
    Serial.println("Authorized access");
    Serial.println();
    delay(500);
    digitalWrite(LED_Verte, HIGH);
    tone(BUZZER, 500);
    delay(300);
    noTone(BUZZER);
    myServo.write(90);
    delay(2000);
    myServo.write(0);
    digitalWrite(LED_Verte, LOW);


  }
  else {

    Serial.println(" Access denied");
    Serial.println();
    delay(500);
    digitalWrite(LED_Rouge, HIGH);
    delay(500);
    tone(BUZZER, 300);
    delay(300);
    noTone(BUZZER);
    myServo.write(0);
    delay(2000);
    myServo.write(90);
    digitalWrite(LED_Rouge, LOW);
  }

  photoresistor = analogRead(A0);
  Serial.println(photoresistor);

  if (photoresistor > threshold) {   //Si le photorésisteur lit une valeur en dessus du seuil alors la barrière se ferme apres (1000)

    myServo.write(0);         // servo fermé

    delay(1000);

  } else  {

    myServo.write(90);         // servo ouvert

    delay(1000);
  }
}

Tu ne crois pas que si tu avais fait un petit organigramme du déroulement attendu de ton programme tu y verrais plus clair au lieu de bricoler pour essayer de le faire fonctionner en ajoutant des conditions par-ci par-là.

Actuellement, la gestion de la cellule photoélectrique est placée en dehors de la gestion de l'ouverture. Si je présente une carte qui n'est pas celle prévue (8D 20 06 85) la barrière s'ouvre quand même, simplement en masquant la cellule.