Lecteur RFID

Bonjour a tous

J’ai le projet de conçevoir un boitier lecteur rfid permettant de transmettre une information sur un ancien automate industrielle.

Ce boitier est composé d’une carte arduino uno rev3
un lecteur rfid Lecteur RFID Grove 125 kHz 113020002 - Communication | GO TRONIC
Un ecran Oled VMA438: ÉCRAN OLED 0.96" AVEC I2C POUR ARDUINO® – Velleman – Wholesaler and developer of electronics
Un relais statique permettant d’envoyer un nombre d’impulsion en fonction du badge rfid se présentant.

Si un badge valide se présente devant l’antenne et qu’il est valide ,je commute un certain nombre de fois ma sortie pour piloter mon relais statique avec une boucle FOR et j’affiche sur l’écran la valeur de ma variable (si le badge programmé comme étant le produit 11 se présente, j’exécute 11 impulsions sur ma sortie et j’écris ma variable afficheur a une valeur de 11)

J’ai donc écris ce programme qui fonctionne

#include <avr/wdt.h>
//Config lecteur rfid
#include <SoftwareSerial.h>
SoftwareSerial SoftSerial(8, 3);
unsigned char buffer[64];       // buffer array for data receive over serial port
String intest="";                //input string
char buffchar;
int count = 0;                    // counter for buffer array
int led = 13;

//Config Afficheur
#include <Adafruit_GFX.h>  // Include core graphics library for the display
#include <Adafruit_SSD1306.h>  // Include Adafruit_SSD1306 library to drive the display
Adafruit_SSD1306 display(128, 64);  // Create display
#include <Fonts/FreeMonoBold12pt7b.h>  // Add a custom font
#include <Fonts/FreeMono9pt7b.h>  // Add a custom font
#include <Fonts/FreeMonoBold24pt7b.h>

//Gestion
int Palette = 0;
uint8_t tour = 0;
int impuls = 6;
#define CLIGNOTEMENT 10  

void setup()
{
  //Setup lecteur rfid
  SoftSerial.begin(9600);     // the SoftSerial baud rate
  Serial.begin(9600);         // the Serial port of Arduino baud rate.
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);

  //Setup Afficheur OLED
  delay(100);  // This delay is needed to let the display to initialize

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // Initialize display with the I2C address of 0x3C
 
  display.clearDisplay();  // Clear the buffer

  display.setTextColor(WHITE);  // Set color of the text

  display.setRotation(0);  // Set orientation. Goes from 0, 1, 2 or 3

  display.setTextWrap(false);  // By default, long lines of text are set to automatically “wrap” back to the leftmost column.
                               // To override this behavior (so text will run off the right side of the display - useful for
                               // scrolling marquee effects), use setTextWrap(false). The normal wrapping behavior is restored
                               // with setTextWrap(true).

  display.dim(0);  //Set brightness (0 is maximun and 1 is a little dim)
  
//Watchdog
 wdt_enable(WDTO_8S);
}

void loop()
{
 
  
RFIDread();
if (intest.equals("020002BB269D"))
{
  int Palette = 1;
  Serial.println(Palette);
  
  display.clearDisplay();  // Clear the display so we can refresh
  display.setFont(&FreeMonoBold12pt7b);  // Set a custom font
  display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
  display.setCursor(20, 15);  // (x,y)
  display.println("Palette");  // Text or value to print
  display.setFont(&FreeMonoBold24pt7b);  // Set a custom font
  display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
  display.setCursor(35, 60);  // (x,y)
  display.println(Palette);  // Text or value to print
  display.display();  // Print everything we set previously

  for(uint8_t i = 0; i<=Palette; i++) //On entre les valeurs (Initialisation, Condition, Incrémentation)
{
  digitalWrite(impuls,HIGH); 
  delay(CLIGNOTEMENT);
  Serial.println("impulsion");
  digitalWrite(impuls,LOW); 
  delay(CLIGNOTEMENT);
  Serial.println(Palette);
}
  
  Serial.println(intest);
  intest = "";
}

if (intest.equals("020001766B1E"))
{
   int Palette = 2;
  Serial.println(Palette);
  
  display.clearDisplay();  // Clear the display so we can refresh
  display.setFont(&FreeMonoBold12pt7b);  // Set a custom font
  display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
  display.setCursor(20, 15);  // (x,y)
  display.println("Palette");  // Text or value to print
  display.setFont(&FreeMonoBold24pt7b);  // Set a custom font
  display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
  display.setCursor(35, 60);  // (x,y)
  display.println(Palette);  // Text or value to print
  display.display();  // Print everything we set previously

  for(uint8_t i = 0; i<=Palette; i++) //On entre les valeurs (Initialisation, Condition, Incrémentation)
{
  digitalWrite(impuls,HIGH); 
  delay(CLIGNOTEMENT);
  Serial.println("impulsion");
  digitalWrite(impuls,LOW); 
  delay(CLIGNOTEMENT);
  Serial.println(Palette);
}
  
  Serial.println(intest);
  intest = "";
}

else if (intest.endsWith(""))
{
  display.clearDisplay();  // Clear the display so we can refresh
  display.setFont(&FreeMonoBold12pt7b);  // Set a custom font
  display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
  display.setCursor(20, 15);  // (x,y)
  display.println("Palette");  // Text or value to print
  display.setFont(&FreeMonoBold24pt7b);  // Set a custom font
  display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
  display.setCursor(25, 60);  // (x,y)
  display.println("NOK");  // Text or value to print
  display.display();  // Print everything we set previously
 
  digitalWrite(led, HIGH);
  delay(100);

  
  Serial.println(intest);
  intest="";
  
}
 wdt_reset(); 
}

void RFIDread()
{
    if (SoftSerial.available())              
  {
    while(SoftSerial.available())               // reading data into char array
    {
      buffchar = SoftSerial.read();      // writing data into array
      //Serial.println(int(buffchar));
      intest += buffchar;
      if (int(buffchar)= 3)break;
      //count++;
//      if(buffchar=' ')break;

    }
}
}

void clearBufferArray()                 // function to clear buffer array
{
  // clear all index of array with command NULL
  for (int i=0; i<count; i++)
  {
    buffer[i]=NULL;
  } 
intest = "";  
}

si je copie colle 15 fois le bout de programme suivant (le nombre de badge a identifier)

if (intest.equals("code badge"))
{
  int Palette = 1;
  Serial.println(Palette);
  
  display.clearDisplay();  // Clear the display so we can refresh
  display.setFont(&FreeMonoBold12pt7b);  // Set a custom font
  display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
  display.setCursor(20, 15);  // (x,y)
  display.println("Palette");  // Text or value to print
  display.setFont(&FreeMonoBold24pt7b);  // Set a custom font
  display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
  display.setCursor(35, 60);  // (x,y)
  display.println(Palette);  // Text or value to print
  display.display();  // Print everything we set previously

  for(uint8_t i = 0; i<=Palette; i++) //On entre les valeurs (Initialisation, Condition, Incrémentation)
{
  digitalWrite(impuls,HIGH); 
  delay(CLIGNOTEMENT);
  Serial.println("impulsion");
  digitalWrite(impuls,LOW); 
  delay(CLIGNOTEMENT);
  Serial.println(Palette);
}
  
  Serial.println(intest);
  intest = "";
}

Mon problème est que, ma variable “Palette” qui est la variable a afficher sur l’écran reste a 0, alors que les impulsions s’effectue bien.

Auriez vous une idée concernant mon problème?

Merci d’avance de votre expertise

Cordialement

Peut etre un soucis de variable global :

dans les fonctions si vous modifier le

 int Palette = 1;

en

 Palette = 1;

Dis-moi mon loulou :

Question ici à 16H48

Réponse à 17H17 : moi-même

Le même topic ICI à 18H40

Réponse à 19H : J4l13n (exactement la même réponse)

Tu vas nous en pondre combien des topics comme celui-là ?

Si tu ne sais pas ce qu'est un forum on peut faire un tuto :smiling_imp:

Tout d’abord bonjour et merci d'avoir pris le temps de me répondre.

J'ai effectivement modifié selon vos conseils et tout est rentré dans l'ordre donc merci beaucoup.

Concernant mon doublon ,je ne voyais plus mon 1er sujet , j'ai donc pensé qu'il avait été supprimé pour nos respect des quelques règles....(problème de vision probablement)

Je m'en excuse, par contre je pense aussi que certains commentaires n'ont pas leurs place au sein d'un forum, mais on pourrait en faire un tuto également :smiling_imp:

Bonjour

Je reviens vers vous car il s’avère que mon problème n’est pas solutionné.

j’ai pu identifié la source du soucis, qui est en fait les “ID” des badges.

Dans le code vous pouvez voir “bad” sur certains emplacement de code badge, il s’agit des codes qui dés lors que je les écris semble faire planter le lecteur RFID

voici quelques numéros de badge provocant un plantage.

palette 6: 62003B782001
palette 8: 62003BA9B646
palette 11: 02000258A6FE

RFID.txt (11.8 KB)

Afin d'apporter de l'eau au moulin, je constate qu' en écrivant un numéro ID d'un badge et en supprimant un autre cela fonctionne (exemple: palette 1 j'efface son ID badge, et j’écris l'ID badge de la palette n°6).

Il ne s'agit donc pas d'un problème de code ID mais plutôt d'une limitation en quantité de code ID
en l’occurrence 11...

Pour clore le sujet, le problème venait simplement de l'espace de stockage mémoire qui était a 94% a cause de la bibliothèque Adafruit (afficheur OLED).

J'ai donc utilisé et recodé avec la bibliothèque sparkfun.

A bientôt