Go Down

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

SukkoPera

"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

#46
Nov 09, 2016, 06:31 pm Last Edit: Nov 09, 2016, 06:39 pm by vince59
SI scrive sia AUT se legge scheda il cui codice è inserito sia NON AUT quando legge scheda il cui codice non è inserito.

Non capisco proprio eppure la funzione FOR e l'utilizzo del BREAK me li sono letti e riletti... cosi come il ciclo del counter...ho ricontrollato le variabili...boh.
Più tardi ti posto i risultati del variare il counter...

SukkoPera

Il break lo fa, perché dici di no? Cosa ti aspetti e cosa succede invece?
"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

Il break lo fa, perché dici di no? Cosa ti aspetti e cosa succede invece?
Premetto che ci sto dedicando tempo in modo saltuario...vediamo se riesco a spiegare a voce.

Il break, se ho ben compreso, dovrebbe bloccare l'esecuzione del codice dopo aver verificato tutti i codici presenti nell'array e trovato quello autorizzato.

Se così fosse il break non funziona in quanto il ciclo loop continua a girare ed il print out mostra il codice senza interruzione.

Lo logica che mi serve è che una volta trovato UN codice autorizzato il ciclo smetta e venga inviato un segnale in output.

SukkoPera

#49
Nov 09, 2016, 09:49 pm Last Edit: Nov 09, 2016, 09:50 pm by SukkoPera
Il break interrompe solo il for, e funziona perché altrimenti ogni volta che ti stampa AUT ti stamperebbe anche NON AUT. Invece il break interrompe il for prima che sopraggiunga la sua condizione di uscita, quindi d!=3, ecc ecc.

Non c'è modo di interrompere il loop(), e non avrebbe comunque senso farlo. Se devi inviare un segnale fallo insieme alla stampa di AUT, no?
"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

Il break interrompe solo il for, e funziona perché altrimenti ogni volta che ti stampa AUT ti stamperebbe anche NON AUT. Invece il break interrompe il for prima che sopraggiunga la sua condizione di uscita, quindi d!=3, ecc ecc.

Non c'è modo di interrompere il loop(), e non avrebbe comunque senso farlo. Se devi inviare un segnale fallo insieme alla stampa di AUT, no?
Grazie del chiarimento provo e ti aggiorno

vince59

Funziona...ancora non ho compreso la logica complessiva ma almeno mi è ora chiaro il ciclo for, i contatori e qualche altra cosa:-)

SukkoPera

Sì però allora, se vuoi un consiglio, forse è meglio che ti fermi un attimo a impratichirti con il C e la programmazione, in modo da poter affrontare in maniera più proficua i problemi che ti troverai davanti.
"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

Sì però allora, se vuoi un consiglio, forse è meglio che ti fermi un attimo a impratichirti con il C e la programmazione, in modo da poter affrontare in maniera più proficua i problemi che ti troverai davanti.
Si concordo pienamente ed è quello che sto facendo. Pian piano sto comprendendo i comandi e la sintassi fatico un pò con la logica di programmazione. Sto leggendo diversi testi, suggeriti anche da Guglielmo, ma sono sul linguaggio e mi stanno aiutando a comprendere però non trovo qualcosa sulla programmazione.

Nel caso appena risolto in effetti funziona perchè all'output seriale ho associato un output di segnale, però non avevo considerato ciò che tu mi hai fatto notare. Io stavo mirando altrove.
Intendevo far leggere il RIFD una sola volta dopodichè avviare la sequenza. Invece così funziona lo stesso pur se legge in continuazione fintantoché il RIFD è in prossimità....ti aggiorno.

Grazie a te e Guglielmo...finalmente so cosa sono e come si gestiscono gli array :-)

SukkoPera

Se non vuoi processare ripetutamente il tag devi leggere lo UID, confrontarlo con l'ultimo che hai processato e comportarti di conseguenza. Una sorta di "debouncing", simile a quanto si fa con i pulsanti (l'esatto contrario in realtà :D).

Nell'esempio che ti ho passa prima dovrebbe esserci anche questo.

Comunque ti invito a verificare la lunghezza degli UID, perché sono 4 byte e non 5 come stai facendo tu.
"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

#55
Nov 10, 2016, 10:46 am Last Edit: Nov 10, 2016, 11:15 am by vince59
a vantaggio di tutti il codice....

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 ========

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 della 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);
    // ============== Viene verificato se il codice è tra quelli autorizzati o meno
    for (d = 0; d < 3; d++)
    {
     if (strcmp(codici[d], codiceLetto.c_str()) == 0 )
      {
        Serial.println("AUTORIZZATA");
     //   delay(500);
        digitalWrite(ledVerde, HIGH);
        delay(500);
        digitalWrite(ledVerde, LOW);
     //   digitalWrite(rele, HIGH);
     //   delay(800);
     //   digitalWrite(rele, LOW);
        break;
      }
    }
    if (d == 3)
    {
      // codice NON trovato e l'indice è arrivato fino a 30 poi sei uscito dal for.
      Serial.println("NON AUTORIZZATA");
      // delay(500);
      digitalWrite(ledRosso, HIGH);
      delay(500);
      digitalWrite(ledRosso, LOW);
    }
  }
}

vince59

Buonasera,

qualcuno potrebbe "tradurmi" queste due linee di codice, non mi sono chiare:

1.

for (i = 0; i <= 4; i++)                                         DOMANDA: cosa fa questo ciclo?                   
    {
      codiceLetto += String (RC522.serNum, HEX);  DOMANDA:  questo passaggio definisce la variabile codiceLetto come la stringa contenente il seriale in carattere HEX? Che fa l'operatore +=?
     
      codiceLetto.toUpperCase();
    }

2.

     if (strcmp(codici[d], codiceLetto.c_str()) == 0 )  DOMANDA: la parte "c_str()" dopo il punto cosa fa?

Grazie

SukkoPera

#57
Nov 17, 2016, 02:53 pm Last Edit: Nov 17, 2016, 11:46 pm by SukkoPera
L'operatore += concatena qualcosa a codiceLetto. Però così non fa niente di utile, secondo me manca un indice:

Code: [Select]
codiceLetto += String (RC522.serNum[i], HEX);

Altrimenti concatena 4 volte la stessa cosa.

c_str() trasforma la String() in una stringa stile C, ovvero un array di caratteri. Tutte le funzioni della libreria C string supportano infatti solamente questa rappresentazione. L'alternativa sarebbe forse usare i metodi equals() o compareTo() della classe String, ma dato che la classe String su Arduino sarebbe meglio evitarla come la peste, non la conosco molto. Ti consiglio comunque di studiarti qua i metodi che mette a disposizione.
"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

#58
Nov 17, 2016, 11:00 pm Last Edit: Nov 17, 2016, 11:07 pm by vince59
thanks  ;D
Cmq hai ragione mancava la i...l'ho omessa x errore

Go Up