Arduino et Port Serie

Salut les amis,

dans le cadre d’un projet je suis en train de faire arduino et rfid, le but est de commander un servo moteur, une et un buzzer une fois que carte est lue, cette carte lue doit etre enregistrer dans une base de données

pendant les essai tout va bien voici le code

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal.h>
int data;
 
#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_PIN          10         // Configurable, see typical pin layout above
#define LED_VERT         4          // Configurable, see typical pin layout above
#define LED_ROUGE        5         // Configurable, see typical pin layout above
#define BUZZER           2          // Configurable, see typical pin layout above
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance
Servo myServo;//define // define serov name
 
void setup()
{
 
  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor (0,0);
  lcd.print("SCANNER LA CARTE");
    Serial.begin(9600);     // Initialize serial communications with the PC 
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init();     // Init MFRC522
  myServo.attach(3); // servo pin
  myServo.write(0);//servo start position
  pinMode(LED_VERT,OUTPUT);
  pinMode(LED_ROUGE,OUTPUT);
  pinMode(BUZZER,OUTPUT);
  noTone(BUZZER);
 Serial.println("Approcher votre Carte pour le scan");
 Serial.println();
}
 
void loop()
{
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
        return;
    }
    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }
  // SHOW ID SERIAL
  //Serial.println("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));
    content.toUpperCase();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("SCANNER LA CARTE");
    lcd.setCursor(0,1);
    lcd.print(content);
  }
  Serial.println();
  Serial.println("Message : ");
 
    
  if(content.substring(1)=="5B 7B 96 0B")
  {
    Serial.println(content.substring(1));
   
    delay(500);
    digitalWrite(LED_VERT,HIGH);
     
    tone(BUZZER,1500);
    delay(300);
    noTone(BUZZER);
    myServo.write(180);
    delay(5000);
    myServo.write(0);
    digitalWrite(LED_VERT,LOW);
  }
  else
  {
      Serial.println("Acces Refuse");
      digitalWrite(LED_ROUGE,HIGH);
      tone(BUZZER,5000);
      delay(1000);
      digitalWrite(LED_ROUGE,LOW);
      noTone(BUZZER);
       
  }
}

j’aimerai ajouter cette instruction pour la lecture via le port serie:

data = Serial.read();

if (Serial.available())
{
data = Serial.read();
if (data == ‘A’)
{
Serial.print(“OK”);
} else {
digitalWrite(13, LOW);
}
}

pour avoir un code qui ressemble à ça :

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal.h>
int data;
 
#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_PIN          10         // Configurable, see typical pin layout above
#define LED_VERT         4          // Configurable, see typical pin layout above
#define LED_ROUGE        5         // Configurable, see typical pin layout above
#define BUZZER           2          // Configurable, see typical pin layout above
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance
Servo myServo;//define // define serov name
 
void setup()
{
 
  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor (0,0);
  lcd.print("SCANNER LA CARTE");
    Serial.begin(9600);     // Initialize serial communications with the PC 
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init();     // Init MFRC522
  myServo.attach(3); // servo pin
  myServo.write(0);//servo start position
  pinMode(LED_VERT,OUTPUT);
  pinMode(LED_ROUGE,OUTPUT);
  pinMode(BUZZER,OUTPUT);
  noTone(BUZZER);
 Serial.println("Approcher votre Carte pour le scan");
 Serial.println();
}
 
void loop()
{
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
        return;
    }
    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }
  // SHOW ID SERIAL
  //Serial.println("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));
    content.toUpperCase();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("SCANNER LA CARTE");
    lcd.setCursor(0,1);
    lcd.print(content);
  }
  Serial.println();
  Serial.println("Message : ");
 
   data = Serial.read();
         
  if (Serial.available())
  {
   if(data == 'A')
    {
    Serial.println(content.substring(1));
   
    delay(500);
    digitalWrite(LED_VERT,HIGH);
     
    tone(BUZZER,1500);
    delay(300);
    noTone(BUZZER);
    myServo.write(180);
    delay(5000);
    myServo.write(0);
    digitalWrite(LED_VERT,LOW);
  }
  else
  {
      Serial.println("Acces Refuse");
      digitalWrite(LED_ROUGE,HIGH);
      tone(BUZZER,5000);
      delay(1000);
      digitalWrite(LED_ROUGE,LOW);
      noTone(BUZZER);
       
  }
 }
}

En compilant aucun probleme mais juste si j’essai d’envoyer un caractere via le moniteur serie, rien ne se produit sur les differentes led et le buzzer ne produit aucun sont. si quelqu’un peut avoir une idée pour m’aidé.

Merci d’avance

Bonjour,

La lecture est mal placée.

  data = Serial.read();
        
 if (Serial.available())
 {

Il faut faire la lecture après le test

 if (Serial.available())
 {
    data = Serial.read();

Ok j'essaie

Salut Kamili,
je viens d’essayer mais sans suite, la lecture serie ne se fait pas voici le code :

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal.h>
int data;
 
#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_PIN          10         // Configurable, see typical pin layout above
#define LED_VERT         4          // Configurable, see typical pin layout above
#define LED_ROUGE        5         // Configurable, see typical pin layout above
#define BUZZER           2          // Configurable, see typical pin layout above
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance
Servo myServo;//define // define serov name
 
void setup()
{
 
  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor (0,0);
  lcd.print("SCANNER LA CARTE");
    Serial.begin(9600);     // Initialize serial communications with the PC 
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init();     // Init MFRC522
  myServo.attach(3); // servo pin
  myServo.write(0);//servo start position
  pinMode(LED_VERT,OUTPUT);
  pinMode(LED_ROUGE,OUTPUT);
  pinMode(BUZZER,OUTPUT);
  noTone(BUZZER);
 Serial.println("Approcher votre Carte pour le scan");
 Serial.println();
}
 
void loop()
{
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
        return;
    }
    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }
  // SHOW ID SERIAL
  //Serial.println("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));
    content.toUpperCase();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("SCANNER LA CARTE");
    lcd.setCursor(0,1);
    lcd.print(content);
  }
  Serial.println();
  Serial.println("Message : ");
 
  
       
  if (Serial.available())
  {
   data = Serial.read();
   Serial.print(data);
   
   if(data == 'A')
    {
    Serial.println(content.substring(1));
   
    delay(500);
    digitalWrite(LED_VERT,HIGH);
     
    tone(BUZZER,1500);
    delay(300);
    noTone(BUZZER);
    myServo.write(180);
    delay(5000);
    myServo.write(0);
    digitalWrite(LED_VERT,LOW);
  }
  else
  {
      Serial.println("Acces Refuse");
      digitalWrite(LED_ROUGE,HIGH);
      tone(BUZZER,5000);
      delay(1000);
      digitalWrite(LED_ROUGE,LOW);
      noTone(BUZZER);
       
  }
 }
}

si je peux avoir une solution

Tu appuis sur la touche "Entrée" après avoir tapé la lettre ?

Bonjour kams

Votre programme comporte plusieurs serial.print().
Ils affichent ce que vous attendez?

Sinon le serial.begin() est-il à la même vitesse que le moniteur série ?

Cordialement,
bidouilleelec

Bonjour,

Tu ne testes la réception que lorsque tu viens juste de lire une carte (c’est à dire que tu as quelques microsecondes pour envoyer ton caractère).

Il faut que tu mémorises le fait que tu viens de lire une carte jusqu’au moment ou tu traites le caractère reçu.

void loop()
{
  static String content;
  static bool newCard=false;
  
  // Look for new cards
  if (mfrc522.PICC_IsNewCardPresent())
  {
    // Select one of the cards
    if (mfrc522.PICC_ReadCardSerial()) {
      // SHOW ID SERIAL
      //Serial.println("UID tag : ");
      byte letter;
      content="";
      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));
        content.toUpperCase();
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SCANNER LA CARTE");
        lcd.setCursor(0, 1);
        lcd.print(content);
      }
      Serial.println();
      Serial.println("Message : ");

      newCard=true;  // on a une nouvelle carte à traiter
    }
  }


  if (newCard && Serial.available())
  {
    data = Serial.read();
    Serial.print(data);

    if (data == 'A')
    {
      Serial.println(content.substring(1));

      delay(500);
      digitalWrite(LED_VERT, HIGH);

      tone(BUZZER, 1500);
      delay(300);
      noTone(BUZZER);
      myServo.write(180);
      delay(5000);
      myServo.write(0);
      digitalWrite(LED_VERT, LOW);
    }
    else
    {
      Serial.println("Acces Refuse");
      digitalWrite(LED_ROUGE, HIGH);
      tone(BUZZER, 5000);
      delay(1000);
      digitalWrite(LED_ROUGE, LOW);
      noTone(BUZZER);

    }
    newCard=false;          // carte traitée
  }
}

Bonjour,

    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
        return;
    }
    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

Ce qui m'étonne, ce sont les "return".
Dis-je une bêtise?

Cordialement,
bidouilleelec

Merci Kamill,
ça fonction mais faut scanner trois à 4 fois la carte pour que cela fonctionne,
une fois la carte scanner je fais une verification dans une base de données en utilisant c#, si cette carte existe C# envoi le caractère ‘A’ via la commande SerialPort1.Write(“A”);
il me faut scanner trois ou quatre fois la meme carte pour que ça passe

bidouilleelec:
Bonjour,

    // Look for new cards

if ( ! mfrc522.PICC_IsNewCardPresent())
    {
        return;
    }
    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }




Ce qui m'étonne, ce sont les "*return*".
Dis-je une bêtise?

Cordialement,
bidouilleelec

Les returns permettent de sortir de la loop, mais comme elle se relance aussi sec, c'est comme si on revenait au début de la loop.

Tu es sur que ton programme C# n’envoie qu’un caractère?

Dans le doute il faut peut être modifier pour lire le caractère chaque fois qu’il est reçu et le traiter uniquement si une carte est lue.

void loop()
{
  static String content;
  static bool newCard = false;

  // Look for new cards
  if (mfrc522.PICC_IsNewCardPresent())
  {
    // Select one of the cards
    if (mfrc522.PICC_ReadCardSerial()) {
      // SHOW ID SERIAL
      //Serial.println("UID tag : ");
      byte letter;
      content = "";
      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));
        content.toUpperCase();
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SCANNER LA CARTE");
        lcd.setCursor(0, 1);
        lcd.print(content);
      }
      Serial.println();
      Serial.println("Message : ");

      newCard = true;
    }
  }


  if (Serial.available())
  {
    data = Serial.read();
    Serial.print(data);
    if (newCard)
    {
      if (data == 'A')
      {
        Serial.println(content.substring(1));

        delay(500);
        digitalWrite(LED_VERT, HIGH);

        tone(BUZZER, 1500);
        delay(300);
        noTone(BUZZER);
        myServo.write(180);
        delay(5000);
        myServo.write(0);
        digitalWrite(LED_VERT, LOW);
      }
      else
      {
        Serial.println("Acces Refuse");
        digitalWrite(LED_ROUGE, HIGH);
        tone(BUZZER, 5000);
        delay(1000);
        digitalWrite(LED_ROUGE, LOW);
        noTone(BUZZER);

      }
      newCard = false;        // carte traitée
    }
  }
}