Go Down

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

vince59

...ci guardo...da un occhiata ora

Code: [Select]



#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);


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.
      {
       
      }
    }
  }
}

SukkoPera

La correzione per quello è sempre quella del mio post precedente.
"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

continua a darmi lo stesso errore: cannot convert 'char(*)[11]' to ' const char' for argument '1' to 'int...

Ho letto un pò ma non comprendo...provo a leggere ancora

SukkoPera

#33
Nov 07, 2016, 05:35 pm Last Edit: Nov 07, 2016, 05:37 pm by SukkoPera
Veramente prima l'errore che hai postato era diverso... Questo a che riga lo dà?

Per inciso, questo:

Code: [Select]
if (i == 3)
      // NON HAI trovato il codice e l'indice è arrivato fino a 30 poi sei uscito dal for
      {


non ha senso metterlo DENTRO al for ;).
"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

#34
Nov 07, 2016, 05:54 pm Last Edit: Nov 07, 2016, 06:03 pm by vince59
Aspetta stiamo facendo confusione, colpa mia che posto tra una cosa e l'altra.
L'errore, dopo il tuo suggerimento ha solo cambiato un riferimento e credo la sostanza sia riferita al non riuscire a convertire ed è riferito alla riga incriminata:

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

ovvero

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

Devo studiare e risolvere entro stasera... prima che Guglielmo se ne accorga

SukkoPera

#35
Nov 07, 2016, 05:57 pm Last Edit: Nov 07, 2016, 05:57 pm by SukkoPera
codici è l'intero array, tu devi confrontare un singolo elemento, anche perché sei dentro un ciclo for, quindi va cambiato in codici[ i ]. Poi devi anche sistemare il secondo parametro, che è una String, ma strcmp() gestisce solo le stringhe in senso C (array di caratteri), quindi o aggiungi .c_str() come ti ho suggerito prima, o usi il metodo equals() della classe String, come mi pare sia già fatto altrove.
"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

Va meglio ragionandoci su sono riuscito a far leggere e aver riscontro con Serial.println...tuttavia NON mi esce dal loop (non prende il break? o non va il contatotre?) e legge in continuazione

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;
  byte d;
  // 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 (d=0; d<3; d++)
    {
      //      if (strcmp(codici[i], codiceLetto) == 0 )
      // HAI trovato il codice, esci dal for. L'indice i ti dice quale è il codice trovato
      if (strcmp(codici[d], codiceLetto.c_str()) == 0 ) // sukkopera
        {
          Serial.println("AUT");
          break;
        }
     }
     if (d==3)
     {
          // NON HAI trovato il codice e l'indice è arrivato fino a 30 poi sei uscito dal for.
      Serial.println("NON AUT");
     }
  }
}



SukkoPera

Secondo me il for che legge il codice deve andare da 0 a 4, ma 4 escluso, altrimenti copi un byte di troppo.

Comunque metti qualche print qua e là e verifica a ogni step quali codici vengono effettivamente comparati.
"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

Secondo me il for che legge il codice deve andare da 0 a 4, ma 4 escluso, altrimenti copi un byte di troppo.

Comunque metti qualche print qua e là e verifica a ogni step quali codici vengono effettivamente comparati.
non mi sembra in quanto le letture leggono l'intero codice

SukkoPera

Prova a cambiare <= in < e vedrai ;).
"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

..provato..legge solo otto caratteri invece di dieci ma non interrompe il loop e legge in continuazione

SukkoPera

Scusa, ma i codici sono di 8 caratteri, non 10, o sbaglio?
"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


SukkoPera

Ma... a me non risulta. Comunque... prova a mettere una print dentro al ciclo e fai stampare a ogni iterazione i codici che confronta.
"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

...ciao...non capiscoperò perchè non vede il break

Go Up