dati "imbottigliati" tra ESP32 e RDM6300

Ciao amici, buone feste a tutti ...

sto passando questi giorni di ferie giocando un po con l'ESP32 nella sua versione piu economica, la WROOM 32D a cui ho collegato un display 16x2 ed un lettore di RFID.

i problemi che ho incontrato sono proprio sul lettore, modello RDM6300 ho visto che il programma richiede solo una semplice lettura allora va tutto bene, se pero 'sono presenti delay maggiori di 1/2 secondo o altre funzioni che occupano del tempo, ad esempio una scritta sul diplay 16x2 allora i dati degli rfid letti dall'antenna è come se si ingorgassero ed arrivassero al'ESP32 successivamente anche se il tag rfid non è piu vicino all'antenna ..

questo problema è già stato riscontrato? io non ho trovato nulla a proposito, forse esiste una soluzione che mi sfugge ...

confido nei vostri consigli.

Per 2-metil-3,4-metilendiossiamestamina

Ma è lo stesso problema del dicembre scorso?

Perché poi non ci hai mai fatto sapere com'è andata a finire

Comunque, senza schema e codice c'è poco da dire

PS

Buone feste anche a te

wow! non credevo che qualcuno si ricordasse del mio post di un anno fa... :smiley:
non vi ho piu aggiornato perche non c'avevo piu messo mano, per me l'elettronica è un passatempo che posso coltivare solo in pochi giorni all'anno.

comunque il vecchio problema l'ho risolto, l'altra volta cercavo di memorizzare il valore degli rfid in una variabile per poi poterli gestire, riguardando il codice mi sono accordo di un errore di scrittura che commettevo e risolto quello ho risolto tutto.

adesso invece mi sono accorto che se nel programma è presente una parte di codice che occupa del tempo, è come se i valori dell'rfid arrivassero all'ESP32 in modo ridondante anche se l'rfid non si trova piu vicino all'antenna.

vi posto codice e schema che sicuramente riuscira a spiegare il problema meglio di quanto non ho fatto io.

Con un nickname come il tuo?

Che ha almeno 4 isomeri dei quali almeno tre con problemi legali?

Certo che mi ricordo

hahahah eh bhe... pero' non è da tutti avere competenze sia di chimica che di elettronica...
ho cercato di togliere il piu possibile per lasciare solo il codice utile, questo è il programma funzionante

#include <rdm6300.h>
#define RDM6300_RX_PIN 3
#define READ_LED_PIN 18
#define GREEN_LED_PIN 19

Rdm6300 rdm6300;

int tag = 0;

void setup()
{
  Serial.begin(115200);

  pinMode(READ_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  digitalWrite(READ_LED_PIN, LOW);
  digitalWrite(GREEN_LED_PIN, LOW);

  rdm6300.begin(RDM6300_RX_PIN);

  Serial.println(" Avvicina il tag all'antenna");
}

void loop()
{
  digitalWrite(READ_LED_PIN, LOW);
  tag = 0;

  if (rdm6300.update())
  {
    tag = rdm6300.get_tag_id(), DEC;
    Serial.println(tag);
    digitalWrite(READ_LED_PIN, HIGH);

    if (tag == 515023)
    {
      Serial.println("RFID Riconosciuto");
      digitalWrite(GREEN_LED_PIN, HIGH);
      delay(50);
      digitalWrite(GREEN_LED_PIN, LOW);
    }
  }
 
  delay(50);
}

mentre questo da problemi...

#include <rdm6300.h>
#define RDM6300_RX_PIN 3
#define READ_LED_PIN 18
#define GREEN_LED_PIN 19

Rdm6300 rdm6300;

int tag = 0;

void setup()
{
  Serial.begin(115200);

  pinMode(READ_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  digitalWrite(READ_LED_PIN, LOW);
  digitalWrite(GREEN_LED_PIN, LOW);

  rdm6300.begin(RDM6300_RX_PIN);

  Serial.println(" Avvicina il tag all'antenna");
}

void loop()
{
  digitalWrite(READ_LED_PIN, LOW);
  tag = 0;

  if (rdm6300.update())
  {
    tag = rdm6300.get_tag_id(), DEC;
    Serial.println(tag);
    digitalWrite(READ_LED_PIN, HIGH);

    if (tag == 515023)
    {
      Serial.println("RFID Riconosciuto");
      digitalWrite(GREEN_LED_PIN, HIGH);
      delay(5000);
      digitalWrite(GREEN_LED_PIN, LOW);
    }
  }
 
  delay(50);
}

vi risparmio di fare il gioco delle differenze, la differenza sta nel delay utilizzato per far stare il led verde acceso in caso di rfid valido, impostando un tempo di 5 secondi è come se non riuscisse a smaltire le istruzioni da fare e finiti i 5 secondi che il led si spegne riparte a stampare sul monitor seriale "RFID Riconosciuto" il codice e si riaccende il led per altri 5 secondi e cosi via almeno tre o quattro volte.

provo ad allegare anche un immagine del circuito anche se non so quanto si riesca a vedere

>MDMA: :smiley: Un paio di cosette ...

1. Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso. :slight_smile: Gli utenti da device "mobile" (piccoli schermi) ringrazieranno per la cortesia ;). (... per questa volta, ho eliminato io i quote dai post sopra :wink:)

2. dai una letta QUI, così evitiamo un baco del forum :wink: (... anche per questo, questa volta ho provveduto io)

Grazie !

Guglielmo

Abbastanza semplice

In realtà, non avendo lo hardware, e nemmeno un PC, dato che sono alla casa sul lago...

Tranquilli, in regola con le norme covid, ho una casa in montagna e una al lago, tutte e due a Varese...

Pensa quelli di Genova... possono avere una casa in montagna e una al mare, e nemmeno nello stesso comune, nella stessa "via"...

Dicevo, non avendo lo hardware non sono sicuro, ma posso fare delle ragionevolmente corrette ipotesi

Ipotizzando che il lettore trasmetta di continuo il codice del tag riconosciuto
O almeno lo trasmetta con cadenza ravvicinata

E che la libreria riceva in un buffer e che si basi su un interrupt

Tu durante il delay non interrompi la ricezione

Interrompi semplicemente l'interpretazione di quello che hai ricevuto

Che dopo il delay ri-cominci a interpretare

Soluzioni:
2 alternative tra di loro

1: quando ricevi un tag, prima di controllare che sia valido controlli che "non" sia uguale all'ultimo ricevuto

Oppure

2: al termine della pausa leggi il o i tag in memoria, ma "non" li elabori, ti limiti a leggerli e ignorarli, così facendo svuoti il buffer di ricezione

E aggiungo

Il programma che hai postato non va, ma credo che sia perché lo hai 'sfoltito' per pubblicarlo

Inoltre non vedo traccia delle modifiche che ti consigliai l'anno passato

Hai sfoltito anche quelle?

mi dispiace correggerti Standardoil ma i programmi che ho postato sono entrambi funzionanti, il primo senza problemi ed il secondo con i problemi che ho descritto ma prima di postarli li ho provati proprio per evitare di aggiungere problemi a problemi.
l’unica cosa che mi sono dimenticato di dire è che ho aggiunto anche all’interno dell’IDE ho aggiunto la scheda DOIT ESP32 DEVKIT V1 e tra le librerie la libreria rdm6300.h

se non ricordo male tu mi suggeristi di salvare i valori degli nfc in un array che successivamente avrei potuto confrontare con il valore letto giusto?

il programma verrebbe quindi modificato cosi:

#include <rdm6300.h>
#define RDM6300_RX_PIN 3
#define READ_LED_PIN 18
#define GREEN_LED_PIN 19

Rdm6300 rdm6300;
int tag [3] = {515023, 707001, 238495};

void setup()
{
  Serial.begin(115200);
  pinMode(READ_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  digitalWrite(READ_LED_PIN, LOW);
  digitalWrite(GREEN_LED_PIN, LOW);
  rdm6300.begin(RDM6300_RX_PIN);
  Serial.println(" Avvicina il tag all'antenna");
}

void loop()
{
  digitalWrite(READ_LED_PIN, LOW);
  int x = 0;

  if (rdm6300.update())
  {
    x = rdm6300.get_tag_id(), DEC;
    Serial.println(x);
    digitalWrite(READ_LED_PIN, HIGH);

    for (int i = 0; i < 3; i++)
    {
      if (x == tag[i])
      {
        Serial.println("RFID Riconosciuto");
        digitalWrite(GREEN_LED_PIN, HIGH);
        delay(50);
        digitalWrite(GREEN_LED_PIN, LOW);
      }
    }
    
  }
 
  delay(50);
}

cosa intendi per rileggere tutti i tag in memoria a fine pausa, dopo la pausa di 5 secondi rifaccio un ciclo for dell’array tag?
ho provato ad aggiungere questa parte di codice dopo la pausa ma non è servito a nulla…

[...]
        delay(5000);
        digitalWrite(GREEN_LED_PIN, LOW);
        for (int i = 0; i < 3; i++)
        {
          Serial.println(tag[i]);
        }

[...]

Se qualcosa deve temporizzare indipendentemente dal resto della logica (cioè lasciare il resto della logica libero di girare alla massima velocità), per forza di cose non si possono inserire delay.

Quando/dove serve si abilita una variabile di comando, e da un'altra parte del programma si usa questa variabile per accendere/spegnere quello che serve contando il tempo con millis.

se variabile comando 1
    salvo tempo
    accendo
    variabile comando=0

se timeout
    spengo

Per il resto sono perplesso, la riga:

tag = rdm6300.get_tag_id(), DEC;

del codice attuale fa qualcosa di totalmente diverso (e sbagliato) dalla riga:

Serial.println(rdm6300.get_tag_id(), DEC);

del post di un anno fa, quindi come è possibile che tu legga il tag giusto? :astonished:

Claudio_FF:
Per il resto sono perplesso, la riga:

tag = rdm6300.get_tag_id(), DEC;

... eh non c'è nulla da fare Claudio, è pieno di gente che NON sa come funziona, ed usa in questo modo errato, l'operatore "comma" ... li, in quella espressione, in pratica, 'tag' è SEMPRE uguale a 10 che è il valore di DEC a 'rdm6300.get_tag_id()' e quel DEC non serve a nulla se non ... a confondere le idee ... :confused:

Guglielmo

Il mio post numero 7 serviva ad indicare proprio quello

Ma sono stato bacchettato, perché il programma funziona...

Quindi non mi esprimo.....
Almeno fino a che non sarò tornato alla casa 'a monte'

Claudio_FF:
Per il resto sono perplesso, la riga:

tag = rdm6300.get_tag_id(), DEC;

del codice attuale fa qualcosa di totalmente diverso (e sbagliato) dalla riga:

Serial.println(rdm6300.get_tag_id(), DEC);

del post di un anno fa, quindi come è possibile che tu legga il tag giusto? :astonished:

hai fatto una domanda interessante, pero' funziona... forse è un po come la storia del bombo che non puo volare ma lui non lo sa e vola....

Standardoil:
Ma sono stato bacchettato, perché il programma funziona...
Quindi non mi esprimo.....

mi dispiace che tu te la sia presa, non volevo ne essere maleducato e irriverente.. è solo che non posso dire che il programma non va se non è cosi.


EDIT:
ho allegato le due schermate separate perche nel ridimensionamento erano diventate illegibili...

Senza-titolo-2.jpg

Senza-titolo-4.jpg

Senza-titolo-2.jpg

Senza-titolo-4.jpg

Ma io non mi sono offeso

Per nulla

Mi preoccupavo solo di segnalare in dato di fatto: che avevo indicato problemi(inesistenti) prima

Che tu abbia ragione e il programma vada ci credo

Tu non hai idea di cosa hai scritto, anche perché non lo hai scritto, ma ne hai cancellato le parti mancanti

Quel ",4" che hai messo dopo l'assegnazione alla variabile 'x'...

A prima vista sembra un errore grave

In realtà probabilmente è sì un errore, ma non grave

E il programma può andare

Ma devo prima tornare a casa e vedere su hardware reale

>C11H15NO2: ... inutile che dici che "il programma funziona" ...

... SE veramente funziona è allora perché ci sono dentro istruzioni inutili che, messe o tolte, non cambiano nulla, dato che, alcune righe, sono EVIDENTEMENTE sbagliate (attento, NON la sintassi, quella è corretta ed il compilatore compila, ma sono sbagliate nella logica!).

Poi ... contento tu ... ::slight_smile:

Guglielmo

C11H15NO2:
come la storia del bombo che non puo volare ma lui non lo sa e vola....

Invece per la storia del bombo...

Il bombo "può" volare... infatti vola

Che l'aerodinamica non spieghi il volo del bombo è una goliardata espressa da Igor
Non quello nostro qui nel forum
Nemmeno Aigor del film
Ma quello degli elicotteri: Sikorsky, una sera a cena dopo forse aver bevuto un po' troppo.

Igor sapeva benissimo che l'aerodinamica spiega il volo del bombo

Era solo necessario rinunciare alla semplificazione della non compressibilità dell'aria

Come ha fatto lui per far volare i suoi elicotteri

Altri ricordi, altri clienti persi....

Miiii
Oramai abbiamo più clienti persi che costruttori....

Fine dei pensieri negativi

Guglielmo, immagino che la tua affermazione sia sarcastica, ovvio che non sono contento di avere un codice per le mani che non funziona come dovrebbe, ma sono anche realista e non mi sogno minimamente di mettermi a studiare manuali di programmazione per una cosa che mi occupa una settimana di tempo all'anno e che mai diventerà il lavoro della mia vita, è come se quando vado a comprare l'olio da mettere nell'auto il commesso invece di chiedermi che auto è e vendermi quello giusto iniziasse a chiedermi i principi della termodinamica e dei fluidi... non mi sogno di progettare un nuovo motore, mi interessa solo cambiare olio e filtro...
cosi come qui non mi interessa diventare un programmatore ma solo passare i pochi giorni delle ferie che ho copiando ed incollando codici in qua ed in la finche le cose funzionano e se non funzioneranno mai pazienza... o butto via tutto o do 50 euro a qualcuno che mi compili le tre righe di codice corretto.
vogliate scusare questo mio sfogo personale ma sembra che ogni volta che uno chiede qualcosa su un forum la risposta sia sempre prenditi una laurea e 3 master... ma se uno aveva voglia/tempo/possibilità di studiare le cose nemmeno ve le chiedeva.

Ma che ti costa togliere quel DEC e la virgola; ti costa una compilazione in più se è troppo continua così.
Resta il fatto che che ", DEC" deve essere rimosso, punto.

Per il delay hai capito che introduce un comportamento non desiderato e per tale motivo esiste la funzione millis().

Ciao.

Maurotec, non mi costa nulla.. semplicemente non avevo capito che il problema fosse quello.. il dec l'avevo messo perche la variabile l'avevo indicata come numero intero e pensavo servisse il dec a convertire il valore del'rfid come numero decimale. per quanto riguarda la funzione millis sto cercando di documentarmi... appena riesco ad implementarla vi terro' aggiornati.
grazie a tutti.

Maurotec:
Resta il fatto che che ", DEC" deve essere rimosso

Ok, però è oggettivamente strano che possa ricavare il tag giusto.
Potremmo essere in uno di quei rarissimi casi di bug nel compilatore?
Quelli che gli esperti per ovvi motivi non possono trovare :smiley:

del bombo che non puo volare ma lui non lo sa e vola

Eh no, l'informatica, soprattutto quella di basso livello come sui micro, si basa sul totale determinismo di ogni singola micro operazione. Le cose vanno progettate esattamente come si vuole che vadano, non ottenute mescolando la pozione ;D