Signaler

Nous ne comprenons pas où est notre erreur [Résolu]

Posez votre question japan56430 3Messages postés lundi 6 février 2017Date d'inscription 8 février 2017 Dernière intervention - Dernière réponse le 8 févr. 2017 à 18:16 par japan56430
Bonjour,
Nous sommes actuellement en terminales S.SI, nous avons un projet à réaliser mais nous ne comprenons pas où nous avons fait une erreur dans notre programmation sur le logiciel Arduino. Nous sommes conscient que ce projet doit être fait par nos connaissances mais si vous aviez l’amabilité de nous aider ne serait-ce qu'un tout petit ce serait génial! Nous vous mettons le programme ci- dessous:
 /*
  Exemple d'utilisation du lecteur Rfid de parallax
  Application: Systéme d'ouverture de porte avec gâche électrique


*/

/* Include pour le port série software */
#include <SoftwareSerial.h>

/* Définition des broches */
#define PIN_ENABLE 2
#define PIN_RX 3
#define PIN_TX 4 // Non utilisé 
#define PIN_GACHE 13
#define PIN_Button 5

/*variable pour mémoriser l'état du bouton*/
int ButtonState = 0

/* Constantes Parallax [/contents/1028-rfid-radio-frequency-identification RFID] */
#define CODE_LEN 10 // Taille d'un ID rfid 
#define START_BYTE 0x0A // Byte de start 
#define STOP_BYTE 0x0D // Byte de stop 

/* Définition des constantes d'usage */
#define UNLOCK_TIME 2 // en secondes 
#define RETRY_DELAY 2 // en secondes 

/* Macro de gestion hardware */
#define enableRfid() digitalWrite(PIN_ENABLE, LOW)
#define disableRfid() digitalWrite(PIN_ENABLE, HIGH)
#define flushRfid() while(rfid.available() > 0) rfid.read()

#define enableGache() digitalWrite(PIN_GACHE, HIGH)
#define disableGache() digitalWrite(PIN_GACHE, LOW)
#define unlock() enableGache(); delay(UNLOCK_TIME * 1000); disableGache()

/* Base de donnée des ID de tag valide */
char* tagId[] = {
  "0000C153EC", // tag 1
  "0000CAAAAA", // tag 2
  "0001111A1A", // tag 3
};

/* Base de donnée des nom de tag valide */
char* tagNom[] = {
  "Eleve 1", // tag 1
  "Eleve 2", // tag 2
  "Eleve 3", // tag 3
};

/* Nombre de tag dans la bdd */
const byte nbTag = 3;

/* Buffer contenant le tag en cours de lecture */
char tag[CODE_LEN];

/* Déclaration d'une instance de SoftwareSerial pour communiquer avec le lecteur rfid */
SoftwareSerial rfid(PIN_RX, PIN_TX);

/* Fonction setup() */
void setup() {

/* Initialisation du port série hardware */
  Serial.begin(9600);

/* Initialisation du port série software */
  rfid.begin(2400);

/* Mise en OUTPUT de la broche ENABLE du lecteur RFID */
  pinMode(PIN_ENABLE, OUTPUT);
  disableRfid();

/* Mise en OUTPUT de la broche câblé sur la gachette électrique */
  pinMode(PIN_GACHE, OUTPUT);
  disableGache();
}

/* Fonction loop() */
void loop() {

ButtonState = digitalRead(BUTTONPIN)
                /* Récupération d'un ID valide ou non (fonction bloquante) */
                getRfidTag();
  /* index: résultat de la fonction isCodeValid() */
  int index;
  /* Si le tag est présent dans la bdd */
  if ((index = isCodeValid()) >= 0) {

/* Affichage du msg d'accès, et du nom de la personne */
    Serial.println("Acces autorise");
    Serial.println(tagNom[index]);
    unlock();
  }
  else {
    /* Sinon affichage  */
    Serial.println("Acces non autorise");

/* Attente avant de pouvoir repasser une carte */
    delay(RETRY_DELAY * 1000);
  }

/* Vide le buffer série du lecteur rfid (évite de lire des données parasites) */
  flushRfid();

/* boutton in pour laisser la porte dévérouiller */
  if (ButtonState == HIGH) {
    //ouvre la porte
    Serial.println(tagNom[index]);
    unlock();
  }

/*
    Fonction lisant un ID rfid depuis le port série software, et ne rendant la main qu'une fois un code rfid correctement recu


*/
void getRfidTag() {
    /* Activation du lecteur RFID */
    enableRfid();

waitTag: /* Etiquette de rappel */

do {
      /* Attente d'au moins un octet sur le port série */
      while (rfid.available() < 1);

/* Attente du byte de start */
    }
    while (rfid.read() != START_BYTE);

/* i: variable d'itération */
    byte i;

/* Lecture du tag */
    for (i = 0; i < CODE_LEN; i++) {

/* Attente d'au moins un octet sur le port série */
      while (rfid.available() < 1);

/* Si jamais une erreur de lecture ce produit, et que le lecteur rfid retourne STOP_BYTE */
      if ((tag[i] = rfid.read()) == STOP_BYTE)
        /* On quitte la boucle */
        break;
    }

/* Si i est différent de CODE_LEN c'est qu'il y a eu une erreur de lecture */
    if (i != CODE_LEN)
      /* On reprend donc depuis le début */
      goto waitTag;

/* Attente d'au moins un octet sur le port série */
    while (rfid.available() < 1);

/* Si l'octet suivant n'est pas le byte de stop c'est qu'il y a un probléme de syncro */
    if (rfid.read() != STOP_BYTE)
      /* On reprend donc depuis le début */
      goto waitTag;

/* Désactivation du lecteur rfid */
    disableRfid();
  }

/*
    Retourne l'indice du tableau tagNom correspondant au tag rfid si celui ci est présent dans le tableau tagId, sinon -1


*/
int isCodeValid() {
    /* Passe en revu chaque tag en bdd */
    for (byte i = 0; i < nbTag; i++)
      /* Si un tag correspond */
      if (memcmp(tag, tagId[i], CODE_LEN) == 0)
        /* on retourne son indice */
        return i;
    /* Si aucun tag ne correspond, on retourne -1 */
    return -1;
  }

Voili Voilou...

Pour information notre projet consiste à ouvrir une porte à l'aide d'une carte RFID ( en expliquant grossièrement nous dirions^^). De plus, si l'utilisateur veut laisser sa porte ouverte, il pourra appuyer sur un bouton qui laissera celle-ci dvérouiller. Merci d'avance!

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 
Utile
+0
plus moins
Bonjour,

C'est bien d'avoir mis le code, mais c'est quoi exactement le problème ???
Problème de compilation, message d'erreur, ne fait pas ce qui est attendu?

Si vous voulez un coup de main pour un problème, il faut nous dire quel est ce problème
japan56430 3Messages postés lundi 6 février 2017Date d'inscription 8 février 2017 Dernière intervention - 7 févr. 2017 à 18:15
expected ',' or ';' before 'char', nous ne comprenons pas ce que cela signifie, mais oui c'est bien dans la compilation qu'il y a problème.
Un ami pense que cela vient de la programmation au niveau du "buttonstate" et tout ce que si s'en suit c'est à dire, ici:

-> /*variable pour mémoriser l'état du bouton*/
int ButtonState = 0 (l.19)

et ici:

/* boutton in pour laisser la porte dévérouiller */
if (ButtonState == HIGH) {
//ouvre la porte
Serial.println(tagNom[index]);
unlock();
} (l108 à11)

mais nous n'en sommes pas sur, et même si cela était le cas, quel serait le problème? les messages sont-ils mal positionnés? mal programmés?

De plus lorsque nous bougeons la place de "int ButtonState = 0" le message d'erreur de compilation reste approximativement le même à une condition c'est la fonction juste après "before" qui change. C'est à dire qu'imaginons, nous le mettons juste devant:

/* boutton in pour laisser la porte dévérouiller */
if (ButtonState == HIGH) {

alors le message se changera en expected ',' or ';' before 'ButtonState'. Ce n'est qu'un exemple mais c'est pour cela que nous pensions plus à un problème de postionnement des messages dans le programme.

Merci pour votre aide
Répondre
Nessdarth 36Messages postés vendredi 16 décembre 2016Date d'inscription 28 février 2017 Dernière intervention - 8 févr. 2017 à 00:27
il y a une simple erreur d'inattention:
int ButtonState = 0


il manque le ; à la fin de cette ligne d'où le souci avec le char*... qui se trouve plus loin
Répondre
japan56430 3Messages postés lundi 6 février 2017Date d'inscription 8 février 2017 Dernière intervention - 8 févr. 2017 à 18:16
ah oui....c,est vrai...
nous vous remercions pour votre aide, bien que nous aurions pu l'éviter...
même si nous avons quelques autres petit soucis au niveau du programme, nous allons cherché un peu plus loin et essayé de comprendre ces erreurs. Si toutefois nous ne réussissions pas, nous vous demanderons peut-être un petit coup de pouce une seconde fois. Merci!
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !