Go Down

Topic: Risolto (Read 1 time) previous topic - next topic

docdoc

Devo ancora metabolizzare bene la relazione fra byte e codice esadecimale!!!
Il byte è un valore numerico da 0 a 255 (se "unsigned", ossia senza segno) memorizzato in 8 bit, un valore esadecimale di un byte è la rappresentazione dello stesso valore ma con base esadecimale, ossia due caratteri (da 0 a 9 poi da A ad F) ognuno dei quali rappresenta 4 degli 8 bit (es. 9 è 09, 10 0A, 15 0F, 16 è 10 e così via).
Quindi se hai un byte e lo rappresenti come stringa esadecimale diventa di DUE caratteri, per questo quel valore "mfrc522.uid.size", che rappresenta il numero di BYTE dell'ID della card, quando lo converti in esadecimale diventa 2 caratteri.
Vedi l'istruzione sprintf? In particolare il formato "%02X" specifica proprio questo, la "X" che vuoi un valore esadecimale ("heX"), il "2" vuol dire la lunghezza totale ossia "voglio 2 caratteri/cifre", e lo "0" che vuoi che siano sempre 2 caratteri anteponendo automaticamente uno zero per avere sempre 2 caratteri (quindi il valore 3 sarà "03"). Questa cosa è evidentemente ignota a chi ha scritto quel codice che hai copiato, visto che ha messo una "if()" proprio per questo (quella che confrontava il valore con 0x10), segno che è un ignorante di linguaggio C, e dimostrazione che è un codice non propriamente fatto bene...
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Olam0436

Grazie Alex, spiegazioni chiarissime ed utilissime per colmare la mia ignoranza.
Ho inserito il codice che mi hai postato senza fare alcuna modifica, ma purtroppo mi restituisce quanto riportato:
Code: [Select]
Ingresso Aziendale
08:40:16.908 -> mfrc522 registrati n° --> 39
08:40:16.908 -> In attesa di lettura...
RFID UID rivelato --> CDFF1B9F
08:40:22.462 -> Accesso vietato
08:40:22.462 ->

Cosa può essere successo?
Grazie


P.S.: oggi dopo sei giorni di test di funzionamento perfetto, arduino mi si è ribblocato!!!!

fabpolli

#62
Dec 10, 2018, 09:26 am Last Edit: Dec 10, 2018, 09:26 am by fabpolli
Innutile dire che @docdoc ha ragione avevo analizzato il codice senza pensare a cosa avrebbe contenuto l'array...
Venendo al tuo problema credo che il problema sia che la comparazione di stringhe tiene conto delle differenze maiuscolo/minuscolo, prova a modificare i codici autorizzati mettendo in maiuscolo quello che stai usando per prova e controlla se ti da accesso o no

Patrick_M

l'unica cosa che mi viene in mente... è che CDFF1B9F
non c'è nell'elenco :)
Code: [Select]

"bdb15c9f",     "f0397889",    "cd618071",   "cc6785b9",
"133eb773",    "92d91ed9",   "db6a9179",   "eb8b68d9",
"4d1a54e9",    "625566d9",   "fdd3a671",    "656165d9",
"545e24d9"     "b94623d9",   "dd635a9f",    "c7ac65d9",
"9d51f99e",     "636524d9",   "bdd74b9f",    "2d90459f",
"4d941b9f",     "fdc4f19e",     "8d37e79e",    "8d6dd39f",
"3d851d9f",     "6d47a871",   "1d8efe9e",     "f7b17b3b",
"0700353b"     "3728b53c",    "47f9c03b",    "07a1b53c",
"2771a43b",    "576d613b",    "67d1af3b",    "5497724d",
"9780b53b",    "27ec823b",
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

fabpolli

 ;D ;D ;D  a me non è manco passato per la testa di controllarmi i codici

gpb01

#65
Dec 10, 2018, 09:36 am Last Edit: Dec 10, 2018, 09:38 am by gpb01
Venendo al tuo problema credo che il problema sia che la comparazione di stringhe tiene conto delle differenze maiuscolo/minuscolo
... in tal caso basta usare l'apposita funzione che ignora il "case" delle stringhe comparate:

Code: [Select]
strcasecmp() : The strcasecmp() function compares the two strings s1 and s2, ignoring the case of the characters.
o, se occorre, l'equivalente ...

Code: [Select]
strncasecmp() : The strncasecmp() function is similar to strcasecmp(), except it only compares the first len characters of s1.
Guglielmo
Search is Your friend ... or I am Your enemy !

steve-cr

....
P.S.: oggi dopo sei giorni di test di funzionamento perfetto, arduino mi si è ribblocato!!!!
....è sicuramente un disturbo elettrico. Lo hai messo il watchdog come ti ho detto?
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Olam0436

Come ha detto fabpolli il sistema trova diverse le maiuscole e le minuscole, per cui ho fatto la modifica e tutto funziona egregiamente, almeno "sul banco". Adesso provo ad inserire il codice sul "cancello", monto lo snubber, aggiungo il trasformatore per il relè e …. speriamo che tutti funzioni come dovrebbe.
Ovviamente vi tengo aggiornati e se tutto funziona chiudo la discussione.
Ancora grazie a tutti per i preziosissimi suggerimenti.

gpb01

#68
Dec 10, 2018, 10:52 am Last Edit: Dec 10, 2018, 10:52 am by gpb01
>Olam0436: ... in ogni caso, relativamente all'affidabilità del tutto, ti ricordo sempre quanto dice il REGOLAMENTO nel punto 15.5 ... tienilo sempre presente. :)

Guglielmo
Search is Your friend ... or I am Your enemy !

Olam0436

Si certo.

Comunque proverò anche il suggerimento propostomi da Guglielmo, che mi sembra molto interessante, in quanto se uno si sbaglia a digitare una maiuscola o minuscola, il codice non dà errore.
Grazie

docdoc

Grazie Alex, spiegazioni chiarissime ed utilissime per colmare la mia ignoranza.
Di nulla, è sempre un piacere aiutare chi sta cercando di imparare!

Quote
Ho inserito il codice che mi hai postato senza fare alcuna modifica, ma purtroppo mi restituisce quanto riportato:
Come ti hanno già scritto (questo weekend sono stato "in modalità basso consumo" perché Sabato sera ho dato un concerto -suono in una tribute band Genesis, genere impegnativo-) il problema, oltre a passare la giusta card (quell'ID non esiste nella tua lista) è solo che il confronto deve essere ESATTO, quindi "CDFF1B9F" è diverso da "cdff1b9f".

Il prossimo passo magari sarebbe anche mettere su scheda SD la tabella degli ID autorizzati, così non hai la necessità di ricompilare tutto il programma per aggiungerne o rimuoverne uno... PRendilo come spunto per imparare anche una cosa nuova ;)
Quando passa una card, apri il file "codici.txt" dalla SD, e leggi una riga per volta (metterai un ID per riga per semplicità) quindi confronti magari ignorando il case delle lettere come ti ha consigliato Guglielmo (ma dato che quella sprintf ti mette sempre le maiuscole, non penso sia difficile aprire il file sulla SD e attivare il Caps Lock.. ;).
Sempre come eventuale spunto per migliorare il progetto, considera anche un RTC ossia una schedina con un orologio: in questo modo puoi persino scrivere sulla scheda SD il log di tutti gli accessi (quelli consentiti, ma anche di quelli rifiutati...).

Ovviamente PRIMA di modificare il tuo programma fai esperimenti con progettini di prova, MAI pensare di fare le cose insieme quando si desidera utilizzare qualche componente per noi nuovo!

Intanto tenere sempre almeno un secondo Arduino per fare questi esperimenti (senza dover rifare i collegamenti dell'altro...).
Quindi prima prova con una SD (apertura di un file, lettura del contenuto una riga per volta, chiusura del file) e poi con un RTC (impostazione iniziale della data/ora, lettura della data/ora) e poi con entrambi (es. aspetto la pressione di un tasto, quando lo premo apre un file sulla SD e ci scrive dentro la data e ora dell'evento, poi richiude il file). E se possibile evita il copia/incolla di codice preso da internet, al massimo limitati agli esempi forniti con le varie librerie, cercando sempre di capire cosa fanno e come lo fanno, solo così si può imparare per bene!
Ciao!
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Olam0436

Grazie mille Alex, cercherò di seguire i tuoi consigli e complimenti per i tuoi progetti musicali!!!!

steve-cr

...

Come ti hanno già scritto (questo weekend sono stato "in modalità basso consumo" perché Sabato sera ho dato un concerto -suono in una tribute band Genesis, genere impegnativo-)
 ....
Wow, Genesis... Qui ci sono un sacco di ragazzini che nemmeno sanno chi sono i Genesis !!!  :D
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Olam0436

Siamo da capo a dodici!!!!!
Ricapitoliamo:
Ho inserito Arduino, il relè ed un lettore rfid in una scatola di plastica stagna. Ho alimentato il relè come da voi indicato con un trasformatore da 5V, mentre Arduino con un altro trasformatore da 9V. Per i collegamenti ho separato le masse di Arduino è del relè. Ho installato uno Snubber sui contatti del relè (quindi sull'alimentazione (forse è qui che sbaglio?)). Ho messo uno zener sui contatti dell'elettroserratura. Ho installato lo sketch che mi avete giustamente suggerito. Risultato? Dopo un po' che funziona Arduino si blocca. Cosa posso fare? Diminuire, per esempio, il tempo di eccitazione dell'elettroserratura?

gpb01

#74
Dec 12, 2018, 10:11 pm Last Edit: Dec 12, 2018, 10:12 pm by gpb01
... lo "snubber" va in "parallelo" ai contatti che utilizzi (... ovvero, tra il comune ed il contatto NO o NC, a seconda di quello che usi)  ... che c'entra l'alimentazione ? ? ?

Guglielmo

P.S.: .. e comunque ribadisco il mio post #68 ::)
Search is Your friend ... or I am Your enemy !

Go Up