Array di stringhe - RFID

Buongiorno a tutti, è il mio primo post su questo forum, non avendo tanta esperienza con arduino vorrei porvi il seguente problema.

Sto utilizzando un RFID MFRC522, il mio codice dovrebbe riconoscere qualsiasi tipo di tag nelle vicinanze ma solo una volta.

Avevo pensato di creare un array di char, in modo tale che l'UID (sotto forma di stringa) di ogni tag che viene riconosciuto viene salvato e confrontato con tutti quelli precedenti. Come posso realizzarlo? Grazie a chiunque risponderà.

Buongiorno, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Se ho ben capito tu vuoi leggere dei TAG, memorizzarti il TAG letto e non accettarlo più se viene passato una seconda volta ...

Il problema che vedo in questa cosa è che ... la SRAM è limitata e non è che puoi memorizzare chissà quanti TAG. Tu quanti ne hai in mente di "archiviare" come già letti?

Guglielmo

Esattamente, vorrei “salvare” le stringhe UID di ogni tag che viene passato e confrontarlo con quelli precedenti. Se trova un’altra stringa uguale, non avviene il riconoscimento (nel mio caso specifico, non compare nessuna scritta sullo schermo LCD).
In teoria vorrei riconoscere quanti più tag possibili, al minimo 10. Grazie mille

Ok, 10 tag non dovrebbe essere un problema, che formato hanno queste stringhe UID? Quanto sono lunghe?

Guglielmo

Una stringa presa come esempio è "49 8B 71 A3", quindi almeno 11 caratteri credo.

Virtualmente quante stringhe possono essere archiviate al massimo?

Grazie mille ancora

Ok, quindi per memorizzarla in una stringa classica del 'C', occorrono 12 caratteri, la tua stringa ed il carattere terminatore che vale 0x00.

Quante ne puoi memorizzare lo possiamo dire solo DOPO che hai sviluppato il programma e si vede quanta memoria SRAM occupi ...
... un Arduino UNO ha 2KB di SRAM, una Arduino MEGA ne ha 8KB, una scheda con in 1284P (come QUESTA) ne ha 16KB. Considera che nella SRAM vanno tutte le tue variabili, lo stack, la memoria dinamica, ecc. ecc. quindi dipende dalla complessità del programma quanta te ne resta libera, comunque 10 o 20 non dovrebbero essere un problema neanche sulla UNO ... sono 120 o 240 bytes :wink:

Come programma devi semplicemente leggere il TAG, verificare se è già presente in array (lo scorri fino a dove lo hai riempito e compari con ogni singolo TAG già memorizzato) e decidere cosa fare ...

Guglielmo

Per quanto tempo è necessario ricordare le stringhe lette? Devono resistere a eventuali reset di Arduino?

gpb01:
Come programma devi semplicemente leggere il TAG, verificare se è già presente in array (lo scorri fino a dove lo hai riempito e compari con ogni singolo TAG già memorizzato) e decidere cosa fare ...

Guglielmo

Il mio problema è proprio il programma. Io ho inizializzato l'array come char tag[10][12];, ipotizzando 10 tag.

Nel momento dell'assegnamento della stringa del tag all'i-esima riga dell'array, mi dà errore. Non capisco dove sbaglio.

Silente:
Per quanto tempo è necessario ricordare le stringhe lette? Devono resistere a eventuali reset di Arduino?

No, le stringhe vanno cancellate dopo eventuali reset.

dzietto:
Nel momento dell'assegnamento della stringa del tag all'i-esima riga dell'array, mi dà errore. Non capisco dove sbaglio.

Chiaramente in come fai l'assegnazione ...

  1. in che tipo di variabile hai il tuo TAG? DEVE ovviamente essere un char[12] ovvero una stringa del 'C' in grado di contenere 11 caratteri più il terminatore

  2. come assegni tale variabile ad uno dei 10 elementi dell'array? NON certo con un '=' ... stai lavorando con stringhe classiche del 'C' quindi devi usare le funzioni che ti mette a disposizione <string.h> che si trova in AVR libc, libreria SEMPRE automaticamente aggiunta dell'IDE di ARduino e che puoi usare.

Guglielmo

gpb01:

  1. in che tipo di variabile hai il tuo TAG? DEVE ovviamente essere un char[12] ovvero una stringa del 'C' in grado di contenere 11 caratteri più il terminatore

L'UID del mio Tag è salvato come String, dovrei convertirlo prima a char per effettuare l'assegnazione?

gpb01:
2. come assegni tale variabile ad uno dei 10 elementi dell'array? NON certo con un '=' ... stai lavorando con stringhe classiche del 'C' quindi devi usare le funzioni che ti mette a disposizione <string.h> che si trova in AVR libc, libreria SEMPRE automaticamente aggiunta dell'IDE di ARduino e che puoi usare.

Avevo pensato di utilizzare la funzione strcpy per copiare la stringa del tag in uno degli elementi dell'array. Potrebbe essere corretto?

Su una memoria piccola come quella di Arduino, senza un sistema operativo solido, le String non vanno usate, soprattutto se si vuole poter usare tanta memoria.

dzietto:
L'UID del mio Tag è salvato come String, dovrei convertirlo prima a char per effettuare l'assegnazione?

Pessima idea ... NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Evita di usarla e usa SOLO stringhe classiche del 'C'.

Guglielmo

gpb01:
Pessima idea ... NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Evita di usarla e usa SOLO stringhe classiche del 'C'.

Guglielmo

Perfetto, ho capito la questione. Partendo però da un esempio relativo al mio RFID, vi mostro parte del codice:

Serial.print("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));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();

E successivamente per il riconoscimento del TAG utilizza content.substring(1), che sarebbe il codice del tag contenente la stringa che mi interesserebbe copiare in questo fantomatico array.
Ovviamente non posso brutalmente cambiare dicitura da String a char, per questo mi chiedevo come potessi fare.

dzietto:
... per questo mi chiedevo come potessi fare.

Semplicemente ... studia ed impara ad usare le stringhe classiche del C e tutte le funzioni che trovi nella libreria standard AVR libc ed, in particolare, quanto è in <string.h> :wink:

In fin dei conti parliamo di semplici array di char :slight_smile:

Guglielmo

gpb01:
Semplicemente ... studia ed impara ad usare le stringhe classiche del C e tutte le funzioni che trovi nella libreria standard AVR libc ed, in particolare, quanto è in <string.h> :wink:

In fin dei conti parliamo di semplici array di char :slight_smile:

Guglielmo

D'accordo, ti ringrazio molto per la disponibilità e per il materiale di studio!

Salve a tutti, ancora non ne sono venuto a capo.

Per motivi "didattici" ho voluto evitare di ricorrere alle funzioni di string.h, ecco parte del loop (premetto che ho inizializzato char tag[10][20], int r=0 e codice è la char che voglio memorizzare nel mio array, qualora non sia già presente):

String stringa=content.substring(1);
  bool var=true;
  char codice[12];
  stringa.toCharArray(codice,12);
  
    for(k=0;k<r && var==true;k++){ 
      for(l=0;l<12 && var==true;l++){
      if (codice[l]==tag[k][l]){
      
      if (l==11){  
          var=false;
          break;
        }
      }
        else{
        if(k==r-1){
        
        for (n=0;n<12;n++){       
    tag[r][n]=codice[n];
                          }
  
    Serial.println("ok");
    
    r++;
    var=true;               
 
        
                 }
     }
      }
    }
}

Sapreste dirmi dov'è che sbaglio? Grazie mille

dzietto:
Salve a tutti, ancora non ne sono venuto a capo.

Per motivi "didattici" ho voluto evitare di ricorrere alle funzioni di string.h

Sapreste dirmi dov'è che sbaglio? Grazie mille

fatto

Salvorhardin:
fatto

Alla fine ho desistito e mi sono abbandonato alla string.h e sono riuscito a risolvere il problema!! :smiley: