Rfid RDM6300

Buona sera ragazzi;
Ho un piccolo problemino in quanto non riesco a trovare l'errore in questo banalissimo sketch:

// Serial Library
#include <SoftwareSerial.h>

SoftwareSerial RfidData =  SoftwareSerial(255,2); // Com to Scanner TX's tied together

void setup(){
  Serial.begin(9600);
  RfidData.begin(9600);
}
void loop(){
  Serial.println(RfidData.read());
}

Lo sketch dovrebbe semplicemente stampare su serial monitor il tag letto dalla chiave rfid ma mi stampa solo -1. Come mai?

Innanzitutto non vedo dichiarati i pin hardware della seriale, ma facciamo finta che da qualche parte li hai messi.

Nella dichiarazione di inizializzazione della seriale c'è scritto: SoftwareSerial RfidData = SoftwareSerial(255,2)

Ora se è vero come è vero che i parametri di SoftwareSerial() sono i due pin fisici di Arduino, mi domando quale tipo di Arduino abbia 255 pin!!

// Serial Library
#include <SoftwareSerial.h>
int rxPin=2;
int txPin=3;
SoftwareSerial RfidData =  SoftwareSerial(rxPin,txPin); // Com to Scanner TX's tied together

void setup(){
  Serial.begin(9600);
  RfidData.begin(9600);
}
void loop(){
  Serial.println(RfidData.read());
}

Diventerebbe così?

anche correggendo come riportato nel post sopra il codice continua a stamparmi -1!

Mancano dei pezzi!

Prova così:

#include <SoftwareSerial.h>

//creo una nuova porta seriale via software
SoftwareSerial RfidData =  SoftwareSerial(2, 3);
 
void setup()  {
//definisco il pin2(RX) come ingresso
pinMode(2, INPUT);
//definisco il pin3(TX) come uscita
pinMode(3, OUTPUT);
//setto la velocita delle seriali  (software e hardware)
RfidData.begin(9600);
Serial.begin(9600);
}
 
void loop() {

Serial.println(RfidData.read());
delay(500);
}

E aggiungi un Delay a fine ciclo!

Così mi stampa dei numeri ma quello che io vorrei ottenere è il tag rfid? Tutto questo mi servirebbe perchè se avvicino la chiave giusta si accende un led verde altrimenti un led rosso e scatta un lampeggiante

Quei numeri sono il TAG dell'RFID!!!

Cosa ti aspettavi? Che uscisse fuori un Signor TAG? :roll_eyes:

No ma non mi aspetto dei numeri casuali che cambiano in continuazione

pres961:
No ma non mi aspetto dei numeri casuali che cambiano in continuazione

E perchè non l'hai scritto?

Per avere risposte precise dare informazioni precise.

Posta una schermata di questi numeri.

-1
-1
-1
2
48
51
48
48
51
48
65
50
55
56
69
57

Questi sono i numeri

int tag= "030030A278E9";
int pinConvalida=8;
int pinNegato=9;
int confronto;

void setup()
{
  pinMode(pinConvalida,OUTPUT);
  pinMode(pinNegato,OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {
    while(Serial.available())
    confronto = Serial.read();
    if(confronto==tag){
      Serial.write("Tag valido");
      digitalWrite(pinNegato,HIGH);
      digitalWrite(pinConvalida,HIGH);
    }
    else{
      if(confronto!=tag){
        Serial.write("Tag non valido"){
          digitalWrite(PinConvalida,LOW);
          digitalWrite(pinNegato,HIGH);
      
  }
}

Sono arrivato a leggere il tag ma ora mi da errore nel codice che ho scritto sopra...

Aggiornamento ho corretto il codice come segue:

String tag= "030030A278E9";
int pinConvalida=8;
int pinNegato=9;
String confronto;
char avanti = 'c';

void setup()
{
  pinMode(pinConvalida,OUTPUT);
  pinMode(pinNegato,OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {
    while(Serial.read()==avanti)
    confronto = (String)Serial.read();
    Serial.println(confronto);
    if(confronto==tag){
      Serial.write("Tag valido");
      digitalWrite(pinNegato,HIGH);
      digitalWrite(pinConvalida,HIGH);
    }
    else{
      if(confronto!=tag){
          Serial.write("Tag non valido");

          digitalWrite(pinConvalida,LOW);
          digitalWrite(pinNegato,HIGH);
      
  }
}
  }
}

ma purtroppo ora dice sempre tag non valido poichè non riceve nessuna stringa dalla lettura. Come mai?

pres961 ... spero che tu, con lo statement :

confronto = Serial.read();

non ti aspetti che venga letto il TAG completo !!!! :astonished: :astonished: :astonished:

STUDIATEVELI I REFERENCES !!! Su questo forum sarà stato ripetuto fino alla nausea che la Serial.read() legge UN SINGOLO carattere e che ti devi gestire TU il loop di lettura di tutti i caratteri !!!

Peggio che mai fare il cast che hai fatto nella modifica successiva ... la Serial.read() ritorna UN char e basta !!!

Guglielmo

pres961:

-1

-1
-1
2
48
51
48
48
51
48
65
50
55
56
69
57



Questi sono i numeri

Certo, -1 e -1 erano perché non aspettavi la Serial.available() e, se non c'è nulla, la Serial.read() ritorna -1
2, 48,51,48,48,51,48,65,50,55,56,69,57 altro non sono che i caratteri ricevuti, UNO alla volta, stampati in valore decimale, il cui equivalente ASCII è : STX 0 3 0 0 3 0 A 2 7 8 E 9

Guglielmo

P.S. : STX rappresenta 'Start of Text' (0x02) ed è un codice ASCII di controllo flusso dati

Cioè non ho ben capito dovrei fare un ciclo che legge carattere per carattere?

pres961:
Cioè non ho ben capito dovrei fare un ciclo che legge carattere per carattere?

Si, esatto.
Poi tu dai questo comando: confronto = (String)Serial.read(); ovvero la String confronto è solo 1 carattere, quello ricevuto, non tutta la stringa ricevuta e la confronti con String tag.
Il confronto tra tag e confronto va bene, ma lo puoi fare solo dopo aver ricevuto un tot di caratteri.

confronto = confronto +  (char) Serial.read();

Questo mette dentro e "accumula" nella String i vari caratteri
Ma questo non puoi farlo all'infinito!!! E devi mettere dentro solo i valori validi.

Non riesco a capire il codice come dovrebbe essere? Ho guardato nel reference e parla di un readBytesUntil()

Bé ... se vuoi imparare qualche cosa SI, devi leggere carattere a carattere e gestire la cosa, se ne è parlato mille volte sul forum ed è una bella esperienza che ti servirà anche in futuro, se invece vuoi la "pappa fatta" ...

... puoi o usare la readBytes() oppure usare la readBytesUntil() ... guardatele e vedi quella che si adatta a cio che tu sai debba arrivarti.

Guglielmo

String tag= "030030A278E9";
int pinConvalida=8;
int pinNegato=9;
String confronto;
char avanti = 'c';

void setup()
{
  pinMode(pinConvalida,OUTPUT);
  pinMode(pinNegato,OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {
    while(Serial.available())
      for(int i=0; i<13 ;i++){
        confronto = confronto +  (char) Serial.read();
      }
    Serial.println(confronto);
    if(confronto==tag){
      Serial.write("Tag valido");
      digitalWrite(pinNegato,HIGH);
      digitalWrite(pinConvalida,HIGH);
    }
    else{
      if(confronto!=tag){
          Serial.write("Tag non valido");

          digitalWrite(pinConvalida,LOW);
          digitalWrite(pinNegato,HIGH);
      
  }
}
  }
}

Non funziona così :frowning:

Naturalmente NO ... in C non puoi mica sommare un char ad un altro ... devi gestire un array di char ...
... t'ho detto, fai un po' di ricerche, se ne è parlato molte volte !!!

Comunque ... necessita un tuo SERIO studio del C credo ... altrimenti non so cosa riuscirai a fare ... :wink:

Guglielmo