Go Down

Topic: tag RFID ed apertura cancello (Read 4800 times) previous topic - next topic

vince59

#15
Oct 27, 2016, 06:19 pm Last Edit: Oct 27, 2016, 06:25 pm by vince59
Perfetto era l'indicazione di cui avevo bisogno di conferma.

Questa è un pò criptica però...

"Nota che la strcmp() si trova in <string.h> ;)"

Il diagramma di flusso e le relative parti di codice le ho a mente e appena ho tempo lo butto giù.

Grazie...vediamo cosa riesco a tirare fuori.

gpb01

Questa è un pò criptica però...
"Nota che la strcmp() si trova in <string.h> ;)"
Come sai, l'IDE di arduino include sempre la AVR libc ... all'interno hai vari gruppi di funzioni, il gruppo <string.h> contiene le funzioni per la manipolazioni delle stringhe come la strcmp().

In testa al programma, assieme alle altre include, sarà quindi sufficiente che metti :

#include <string.h>

per avere a disposizione tutte le funzioni che vedi nel link che ti ho messo.

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

vince59

Grazie molto chiaro. No, non sapevo della libreria AVR...ora si :-)

Vedi che quando vuoi sei amabile  ;)  :D  ;D  8)  ???  ::)  :P  :-[  :-X  :-\  :-*  :'(  :smiley-eek-blue: 

gpb01

#18
Oct 27, 2016, 07:12 pm Last Edit: Oct 27, 2016, 07:13 pm by gpb01
Vedi che quando vuoi sei amabile  ...
Io amabile ? ? ? ... 
Guglielmo :D :D :D
Search is Your friend ... or I am Your enemy !

vince59

#19
Oct 28, 2016, 03:29 pm Last Edit: Oct 28, 2016, 03:35 pm by vince59
...l'array la "infilo" nel loop..anche se mi sembra di poterla mettere anche prima del setup laddove definisco oggetti, variabili ecc

gpb01

... ovviamente, essendo l'array che contiene le chiavi autorizzate e deve essere disponibile a tutte le funzioni del codice, direi che lo metti tra le "globali", ovvero, per capirci, prima del setup(), dove metti anche le altre cose.

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

vince59

yes...ho fatto proprio così :-) e, ci tengo a precisarlo, prima che lo scrivessi tu  8)

Sto costruendo il codice  :smiley-roll-blue:

gpb01

#22
Oct 28, 2016, 05:26 pm Last Edit: Oct 28, 2016, 05:26 pm by gpb01
... e, ci tengo a precisarlo, prima che lo scrivessi tu  8)
:D :D :D :D :D :D :D

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

vince59

#23
Nov 06, 2016, 06:53 pm Last Edit: Nov 06, 2016, 07:01 pm by vince59
Questo che segue è il codice che sto utilizzando con successo...ovviamente non è stato generato da me (..magari fossi capace) e ringrazio l'autore.
Tuttavia per capire meglio ho cercato di utilizzare le array come suggerito da Gugliemo. Mi viene però fuori un problema di conversione della stringa. Purtroppo i progressi nella programmazione sono molto lenti....
Ho postato anche il codice da me modificato...non maltrattatemi

(l'errore invece è questo Arduino:1.6.12 (Windows XP), Scheda:"Arduino/Genuino Uno"
C:\Documents and Settings....\apriporta_test.ino: In function 'void loop()':

apriporta_test:87: error: cannot convert 'String' to 'const char*' for argument '2' to 'int strcmp(const char*, const char*)'

       if (strcmp(codici, codiceLetto) == 0 )

                                        ^

exit status 1
cannot convert 'String' to 'const char*' for argument '2' to 'int strcmp(const char*, const char*)')


Code: [Select]
/*
Con questo sketch è possibile fare accendere un led o commutare un relè
al passaggio di una tessera magnetica sul lettore RFID.
Se la tessera viene riconosciuta si accende un led verde e commuta il relè,
altrimenti un led rosso per indicarci l`inaccessibilità. 

Autore Salvatore Fancello

PINOUT:
 
RC522 MODULO    Uno/Nano   
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V

led verde al Pin 3
Led rosso al Pin 4
Relè al Pin 2
*/
 
#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // Pin 53 per Arduino Mega
#define RESET_DIO 9
#define delayRead 1000 // Tempo
#define delayLed 2000
#define ledVerde 3
#define ledRosso 4
#define rele 2
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO);
  // inserire tutti i codici esadecimali delle schede magnetiche riconosciute
String codiceAutorizzato1 = "C5E8165368";
String codiceAutorizzato2 = "43AA7A25B6";
String codiceAutorizzato3 = "ESEMPIO480";
 
void setup()
{
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin();
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
  pinMode(ledVerde,OUTPUT);
  pinMode(ledRosso,OUTPUT);
  pinMode(rele,OUTPUT);
}
 
void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto,codiceAutorizzato1)||verificaCodice(codiceLetto,codiceAutorizzato2)
    ||verificaCodice(codiceLetto,codiceAutorizzato3)){
      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
      digitalWrite (rele, HIGH);
      delay (500);     // Tempo relè in stato ON
      digitalWrite (rele, LOW);
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
    }
  delay(delayRead); 
  }
}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto, String codiceAutorizzato){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  } 
}   
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
}


Codice adattato

Code: [Select]

/*
Con questo sketch è possibile fare accendere un led o commutare un relè
al passaggio di una tessera magnetica sul lettore RFID.
Se la tessera viene riconosciuta si accende un led verde e commuta il relè,
altrimenti un led rosso per indicarci l`inaccessibilità. 

Autore Salvatore Fancello

PINOUT:
 
RC522 MODULO    Uno/Nano   
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V

led verde al Pin 3
Led rosso al Pin 4
Relè al Pin 2
*/
 
#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // Pin 53 per Arduino Mega
#define RESET_DIO 9
#define delayRead 1000 // Tempo
#define delayLed 2000
#define ledVerde 3
#define ledRosso 4
#define rele 2
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO);
  // inserire tutti i codici esadecimali delle schede magnetiche riconosciute
String codiceAutorizzato1 = "C5E8165368";
String codiceAutorizzato2 = "43AA7A25B6";
String codiceAutorizzato3 = "ESEMPIO480";
 
void setup()
{
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin();
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
  pinMode(ledVerde,OUTPUT);
  pinMode(ledRosso,OUTPUT);
  pinMode(rele,OUTPUT);
}
 
void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto,codiceAutorizzato1)||verificaCodice(codiceLetto,codiceAutorizzato2)
    ||verificaCodice(codiceLetto,codiceAutorizzato3)){
      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
      digitalWrite (rele, HIGH);
      delay (500);     // Tempo relè in stato ON
      digitalWrite (rele, LOW);
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
    }
  delay(delayRead); 
  }
}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto, String codiceAutorizzato){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  } 
}   
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
}

Gian70Luca

In allegato se ti può aiutare. Io l'ho modificato in base alle mie esigenze

vince59

Grazie avevo visto il tuo thread ...studio il tuo codic cercando di comprenderlo...staiscrivendo i dati in EEPROM..vero?

Gian70Luca

Il mio è tutto un altro progetto più complesso. Ho preso la parte che scrive i codici con l'ausilio di una scheda master.

SukkoPera

#27
Nov 07, 2016, 01:08 am Last Edit: Nov 07, 2016, 01:10 am by SukkoPera
Forse hai postato due volte lo stesso codice, perché io non trovo nessuna strcmp(). In ogni caso, prova così:

Code: [Select]
if (strcmp(codici, codiceLetto.c_str()) == 0 )

Comunque secondo me è sbagliato proprio l'approccio di usare stringhe per memorizzare e confrontare gli UID. Sono banalmente 4 byte, non è meglio usare un array di, appunto, byte? Date un'occhiata a questo esempio del mio progetto Sensoria:

https://github.com/SukkoPera/Arduino-Sensoria/blob/master/arduino/examples/RFIDTrigger/RFIDTrigger.ino

In particolare alla funzione compareUid(), per la quale alla fine sarebbe bastato un banale memcmp(), ma che ho scelto di implementare in maniera più "didattica".
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

vince59

#28
Nov 07, 2016, 01:32 pm Last Edit: Nov 07, 2016, 01:48 pm by vince59
Comunque secondo me è sbagliato proprio l'approccio di usare stringhe per memorizzare e confrontare gli UID. Sono banalmente 4 byte, non è meglio usare un array di, appunto, byte? Date un'occhiata a questo esempio del mio progetto Sensoria:

Si infatti sono d'accordo e su suggerimento di Guglielmo è proprio ciò che vorrei fare.
Siccome non sono ancora in grado di programmare da solo ho preso un esempio che funzionava con l'intendimento di sostituire il blocco del codice che usa le stringhe con l'array.
Guglielmo mi aveva postato alcune veloci righe però non ho ancora la padronanza adeguata.
Ecco il codice variato

Code: [Select]

/*
  PINOUT:
  RC522 MODULO    Uno/Nano
  SDA             D10
  SCK             D13
  MOSI            D11
  MISO            D12
  IRQ             N/A
  GND             GND
  RST             D9
  3.3V            3.3V
  led verde al Pin 3
  Led rosso al Pin 4
  Relè al Pin 2
*/

#include <SPI.h>
#include <RFID.h>
#include <string.h> // libreria per manipolazione stringhe

/* ========================= Vengono definiti PIN del RFID reader ============ */

#define SDA_DIO 10  // Pin 53 per Arduino Mega
#define RESET_DIO 9
#define delayRead 1000 // Tempo
#define delayLed 2000
#define ledVerde 3
#define ledRosso 4
#define rele 2

/* ================ Viene creata una istanza della RFID libreria ============= */

RFID RC522(SDA_DIO, RESET_DIO);

/*
  // ======== inserire tutti i codici esadecimali delle schede magnetiche riconosciute ========

  String codiceAutorizzato1 = "C5E8165368";
  String codiceAutorizzato2 = "43AA7A25B6";
  String codiceAutorizzato3 = "ESEMPIO480";
*/

char codici[3][11] = {"C5E8165368", "43AA7A25B6", "EC40E03480"}; // definizione array char

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

  /* ================ Abilita SPI ==================== */

  SPI.begin();

  /* ================ Viene inizilizzato RFID reader =============== */

  RC522.init();
  Serial.println("Setup");
  pinMode(ledVerde, OUTPUT);
  pinMode(ledRosso, OUTPUT);
  pinMode(rele, OUTPUT);
}

void loop()
{
  /* ============== Temporary loop counter ===================== */
  byte i;
// Se viene letta una tessera
 
if (RC522.isCard())
  {
    // =========== Viene letto il suo codice

    RC522.readCardSerial();
    String codiceLetto = "";
    Serial.println("Codice delle tessera letto:");

    // ================ Viene caricato il codice della tessera, all'interno di una Stringa

    for (i = 0; i <= 4; i++)
    {
      codiceLetto += String (RC522.serNum[i], HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);

    for (i = 0; i < 3; i++)
    {
      if (strcmp(codici[i], codiceLetto) == 0 )
      // HAI trovato il codice, esci dal for. L'indice i ti dice quale è il codice trovato
      {
        break;
      }
      if (i == 3)
      // NON HAI trovato il codice e l'indice è arrivato fino a 30 poi sei uscito dal for.
      {
        
      }
    }
  }
}
/*

  if(verificaCodice(codiceLetto,codiceAutorizzato1)||verificaCodice(codiceLetto,codiceAutorizzato2)
  ||verificaCodice(codiceLetto,codiceAutorizzato3)){
  Serial.println("Tessera autorizzata");
  accendiLed(ledVerde);
  digitalWrite (rele, HIGH);
  delay (1000);     // Tempo relè in stato ON
  digitalWrite (rele, LOW);
  }else{
  Serial.println("Tessera non autorizzata");
  accendiLed(ledRosso);
  }
  delay(delayRead);
  }
  }


  // ================= Questa funzione verifica se il codice Letto è autorizzato

  boolean verificaCodice(String codiceLetto, String codiceAutorizzato){

  if(codiceLetto.equals(codiceAutorizzato)){
  return true;
  }else{
  return false;
  }
  }

  // ================= Questa funzione permette di accendere un LED per un determinato periodo

  void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
  }
*/

SukkoPera

Boh, se guardi quello che ti ho linkato vedrai che è più semplice di quel che credi. Sono tutte queste trasformazioni tra byte e stringhe hex che creano casino.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Go Up