sketch rfid

Progetti Arduino
Avatar utente
pgv
Messaggi: 137
Iscritto il: 17/09/2020, 11:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

Capisco, si tratta di lavori in corso. Buona fortuna, e non esiti a postare in caso di problemi.

Io nel frattempo a tempo perso preparo un regalo per la collettivita', un "coprocessore arduinato per uscite temporizzate" (CAPUT) che permettera' di dimenticare la funzione delay()...
sandro.s
Messaggi: 14
Iscritto il: 05/04/2021, 20:53

Re: sketch rfid

Messaggio da sandro.s »

Codice: Seleziona tutto


#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 = "AAC9411634";
String codiceAutorizzato2 = "798D8C6E16";
String codiceAutorizzato3 = "ESEMPIO480";
int stato = LOW;

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);
  digitalWrite(rele, LOW);
}

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);
      if (rele ==  LOW) {
        stato = !stato;
        if (stato == LOW) {
          digitalWrite (rele, HIGH);
          Serial.println ("acceso");
          delay (300);
        } else {
          (stato ==  HIGH)
          digitalWrite(rele, LOW);
          Serial.println("spento");
          delay(300);
        }
      }
      else {
        accendiLed(ledrosso);
        delay(2000)
      }
    }
  }

  // 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);
  }
sandro.s
Messaggi: 14
Iscritto il: 05/04/2021, 20:53

Re: sketch rfid

Messaggio da sandro.s »

be immagino lei sia moolto esperto complimenti,
Ultima modifica di sandro.s il 07/04/2021, 20:40, modificato 1 volta in totale.
sandro.s
Messaggi: 14
Iscritto il: 05/04/2021, 20:53

Re: sketch rfid

Messaggio da sandro.s »

ho provato molte volte ma mi da sempre errore nell' if(verificacodice…. non capisco…
Avatar utente
pgv
Messaggi: 137
Iscritto il: 17/09/2020, 11:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

Premesso che non so esattamente quale libreria RFID stia utilizzando (e quindi esattamente che file RFID.h includa), ne ho trovata una che somiglia alla seguente URL:

https://community.particle.io/t/getting ... ved/3571/3

Rimossi i problemi legati all'inclusione di RFID.h, ottengo un messaggio di errore che allude ad una funzione verificaCodice() che non sarebbe dichiarata nell'ambito della visibilita' (scope) di loop(). Siccome a riga 78 trovo quello che sembrerebbe essere la funzione mancante, vado a contare le parentesi { } aperte e chiuse... In realta' sfrutto la IDE di Arduino e cliccando appena dopo la parentesi } che viene subito prima della dichiarazione della nostra funzione errante scopro (perche' me lo visualizza la IDE) che non corrisponde a quella di loop() { ma bensi' a quella di if (RC522.isCard()) {. Aggiungiamo una parentesi } chiusa subito prima della dichiarazione di verificaCodice() e stiamo a vedere...
Un passo avanti lo si e' fatto, ora si lamenta che manca un ; nella parte di codice seguente:

Codice: Seleziona tutto

        } else {
          (stato ==  HIGH)
          digitalWrite(rele, LOW);
          Serial.println("spento");
e in effetti, dopo (stato == HIGH) manca il punto e virgola di fine istruzione. PERO'... l'istruzione in questione non mi sembra corretta. L'operatore "==" realizza un CONFRONTO e non un'assegnazione. L'istruzione desiderata e' probabilmente

Codice: Seleziona tutto

          stato =  HIGH;
Quasi ci siamo. In realta' a pensarci bene abbiamo gia' cambiato il valore contenuto nella variabile stato qualche riga prima, con la stato = !stato; e quindi, secondo me, possiamo rimuovere completamente la riga incriminata (stato == HIGH).
A questo punto c'e' un problema con la chiamata di accendiLed(ledrosso); che sostiene di non conoscere questo fantomatico ledrosso. A una prima occhiata ci sarebbe la riga 10 che dice

Codice: Seleziona tutto

#define ledRosso 4
ma uno sguardo piu' attento evidenzia la lieve, ma significativa, differenza fra la dichiarazione di ledRosso con la "R" maiuscola e l'utilizzo di ledrosso con la "r" minuscopa. Mal di poco, cambiamo la chiamata in accendiLed(ledRosso); con la maiuscola. E gia' che ci siamo, aggiungiamo un bel punto e virgola a terminare l'istruzione successiva che diventa delay(2000);. E finalmente compila...

Sono a casa e la mia Signora non apprezza la presenza di Arduino sotto il tetto domestico per cui non posso mettere alla prova il programma, ma almeno adesso compila. Sperando di esserLe stato utile, mi sono accorto che forse e' meglio includere tutto il listato:

Codice: Seleziona tutto


#include <SPI.h>
#include <RFID.h> // #include "RFID.h" per me che ho aggiunto la libreriadirettamente al progetto
/* 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 = "AAC9411634";
String codiceAutorizzato2 = "798D8C6E16";
String codiceAutorizzato3 = "ESEMPIO480";
int stato = LOW;

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);
  digitalWrite(rele, LOW);
}

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);
      if (rele ==  LOW) {
        stato = !stato;
        if (stato == LOW) {
          digitalWrite (rele, HIGH);
          Serial.println ("acceso");
          delay (300);
        } else {
          digitalWrite(rele, LOW);
          Serial.println("spento");
          delay(300);
        }
      }
      else {
        accendiLed(ledRosso);
        delay(2000);
      }
    }
  }
}

  // 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);
  }
sandro.s
Messaggi: 14
Iscritto il: 05/04/2021, 20:53

Re: sketch rfid

Messaggio da sandro.s »

Buongiorno, be, mi ha fatto tutto lei, é stato piu di un aiuto, non so neanche come ringraziarla per tutto il tempo che ha perso per me, ora anche io devo scappare a lavoro quindi lo provo piu tardi con arduino, io in realtà sono un meccanico appassionato e in grado di riparare tutto(quando possibile e conveniente) e per imparare a riparare schede elettroniche ho iniziato a studiare elettronicae ora studierò anche arduino che mi sembra valido per comprendere questo mondo, la ringrazio buona giornata,
Avatar utente
pgv
Messaggi: 137
Iscritto il: 17/09/2020, 11:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

Arduino e' molto conveniente per imparare, ma oggigiorno esistono anche altre possibilita' interessanti come microPython/circuitPython e perfino tool grafici su Web per programmare microcontrollori. E' molto educativo e divertente. Saluti.
sandro.s
Messaggi: 14
Iscritto il: 05/04/2021, 20:53

Re: sketch rfid

Messaggio da sandro.s »

grazie li darò uno sguardo…. comunque il programma non funziona, appena ho più tempo faccio altre prove.. ora se passo la tessera valida si accende il led verde e poi il rosso e poi nulla...rele niente… se passo la tessera non valida non fa nulla di nulla devo cambiare tutto mi sa :lol:
Avatar utente
pgv
Messaggi: 137
Iscritto il: 17/09/2020, 11:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

Penso che ci sia un po' di confusione su dove finiscono gli if..else seguenti:
if (verificaCodice(codiceLetto, codiceAutorizzato1)...
...
if (rele == LOW) {
...
if (stato == LOW) {
...

Ora non posso controllare piu' a fondo.
sandro.s
Messaggi: 14
Iscritto il: 05/04/2021, 20:53

Re: sketch rfid

Messaggio da sandro.s »

Non si preoccupi, anche io ho poco tempo questi giorni.. Quando ho tempo modifico ancora lo sketch e provo.. Prima o poi riuscirò, buona serata e grazie degli ottimi consigli
Rispondi