utente autorizzato

Ragazzi scusate…

byte autorizzato(unsigned long int utente)
{
    byte ritorno = 0;
    // restituisce il numero di riga dove si trova lo account dell'utente
    // 0 se non lo trova
    // serve per dare una autorizzazione agli utenti (col numero si gestisce anche il livello)

    // apro il file
    if (!SD.exists(FILEUTENTI))
    {
        Serial.print(F("File inesistente: "));
        Serial.println(FILEUTENTI);
        return 0;
    }
    else
    {
        File dataFile = SD.open(FILEUTENTI, FILE_READ);
        byte riga = 1;
        unsigned long int attuale = 0;

        while (dataFile.available())
        {
            //fino alla fine del file
            char cx = dataFile.read();

            if (cx == '\r')
            {
                continue;
                // ignoro fine riga windows
            }

            if (cx == '\n')
            {
                // fine riga linux
                // faccio il test se corrisponde
                if (attuale == utente)
                {
                    // corrisponde, restituisco il numero di riga ed esco
                    ritorno = riga;
                    break;
                }

                // se sono arrivato qui non corrisponde, avanti una riga
                riga++;
                attuale = 0;
                continue;
            }

            if (cx >= '0' && cx <= '9')
            {
                // una cifra
                attuale = attuale * 10 + cx - '0';
            }
        }

        dataFile.close();
        return ritorno;
    }
}

Sto considerando il pezzo di codice di STANDARDOIL della guida ti metto, ti trovo…, ma non riesco a farlo funzionare ; ho creato il documento utenti.txt sulla SD con i vari codici,ma non capisco dove mettere il codice di confronto.
Potete aiutarmi???

Con questo pezzo di codice mi funziona solamente se nel .txt il codice è impostato nella prima riga, altrimenti non funziona e va avanti

   if (SACCA == true)
    {
      lcd.setCursor(0, 2);

      rimasti = 0; //

      while (SACCA.available())
      {
        char c = SACCA.read();
       
        lcd.write(c);
        if (isdigit(c))
        {
          rimasti= rimasti * 10  + c - '0';
        }
      }
      delay(1000);

    }

  if (rimasti == codiceAutorizzato)
  {
    lcd.setCursor(0, 1);
    lcd.print("DISTRUTTA");
    SACCA.close();
    Riavvia();
  }

Scusa ma non si capisce niente, che è “codiceAutorizzato”? Che è “SACCA”? Dove leggi il file (ossia chiami la funzione “autorizzato()”)?

Posta tutto il codice, e tutto insieme, non solo due pezzi in due messaggi separati…

Scusami docodoc...il primo pezzo di codice è stato postato da STANDARDOIL nella guida ti metto, ti trovo.........e ho difficoltà a capirlo....quindi non so ,il secondo è una copia del primo adattato e mi funziona solo se nel .txt sulla sd è scritto solo un seriale, altrimenti non funziona.
Più tardi sistemo il codice e lo pubblico.

Comunque il problema è questo nella Sd ho un documento di testo con diversi SERIALI ALFANUMERICI un SERIALE per RIGA(TOTALE 100 righe) a me serve che all'avvio l'arduino mi vada a confrontare questi SERIALI con quelli impostati nel codice e se uno di questi è presente si arresti altrimenti continui.

Provo a ricapitolare un poco.

Intanto Arduino i codici della SD non deve leggerli "all'avvio" (che fai, memorizzi tutti i codici nella -scarsa- RAM di Arduino?) ma solo quando dalla seriale hai letto un codice intero.

Poi, secondo, parli di "codici alfanumerici" ma poi dentro al tuo codice vedo che accumuli solamente valori numerici, per cui deciditi...

Terzo, dici che "funziona solo se nel .txt sulla sd è scritto solo un seriale" ma continuo a non vedere nel tuo codice dov'è che leggi dalla SD o usi quella funzione di Standardoil, ossia non si sa in che modo valorizzi "codiceAutorizzato" (ad iniziare comunque dal tipo di variabile).
Se stai cercando di "innestare" in un tuo programma del codice preso in giro, o posti l'intero listato, oppure (meglio, almeno per ora) fai un progettino limitato a questa funzione e posti quello.

Quarto, se hai capito cosa fa quella funzione di Standardoil, credo che tu la stia usando comunque in modo sbagliato perché non ti restituisce il "codice autorizzato" ma il numero della riga del file nel quale ha trovato il codice, oppure zero se non c'è. Per cui per sapere se è autorizzato devi solo vedere se restituisce un valore diverso da zero (eppure c'è scritto tutto nei commenti dentro la funzione stessa, ma l'hai guardata?)

Insomma, se cerchi di usare codice di altri devi prima cercare di capire come funziona e come si usa. Se vuoi un aiuto per cercare di "innestare" quel codice nel tuo, devi postare tutto il tuo codice, o quantomeno, come detto, fai uno sketch che fa solo quello che vuoi testare e posta qui quel listato (unitamente a ciò che fa o non fa o che leggi).

Il procedimento generale sarebbe una cosa del genere (fai sempre così quando scrivi un programma, inizia dai commenti in italiano, che poi "esplodi" nel relativo codice per implementare quello che c'è scritto):

// Acquisisco i caratteri dalla seriale
 // Se è 'r' lo ignoro
 // Se è '\n' l'input è finito ed esco
 // altrimenti accumulo il carattere nel buffer

// Cerco nel file SD il codice digitato, presente nel buffer
// La funzione "autorizzato()" mi dice che c'è (ossia restituisce un valore magggiore di zero)?
 // Si, autorizzo
// else
 // Non autorizzato.

Ma come faccio a corregere il mio secondo pezzo codice che ho pubblicato per fare leggere le varie righe....Ripeto se metto una sola riga....mi funziona perfettamente

louis83:
Ma come faccio a corregere il mio secondo pezzo codice che ho pubblicato per fare leggere le varie righe....Ripeto se metto una sola riga....mi funziona perfettamente

Ripeto se non ci fai vedere tutto il codice come faccio a dirti come correggere il codice?

ciao,

non ho letto tutti i post, ancor meno i codici pubblicati, però mi viene da fare una (due) domanda: dov’è che verifichi che hai cambiato “linea” nel file e, di conseguenza, resetti quanto letto in precedenza per fare nuova verifica?

#include <SD.h>
#include <RFID.h>
#include <LiquidCrystal_I2C.h>  // libreria di gestione del display lcd


File SACCA;


int annota = 0;
int rimasti = 0;

String reg = 1000
String codiceAutorizzato = 79458633F;
int codice=1458;



LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //  tipo display


void setup()
{
  digitalWrite(17 , LOW);
  pinMode (17, OUTPUT);       //Pin 17 in uscita
  pinMode (16, OUTPUT);       //Pin 16 in uscita
  pinMode (15, OUTPUT);       //Pin 15 in uscita
  pinMode (14, OUTPUT);       //Pin 14 in uscita
  pinMode(buzzerPin, OUTPUT);


  lcd.begin(20, 4);    // inizializza il display (20 caratteri per 4 righe)

 
  Serial.begin(9600);
  RTC.begin();

  /* Abilita SPI*/
  SPI.begin();

  /* Viene inizilizzato RFID reader */
  RC522.init();



  SD.begin(4);


  SACCA = SD.open("1000.txt");
 

void loop()
{
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice
    RC522.readCardSerial();
 
    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);

    Serial.println();

if (verificaCodice(codiceAutorizzato)){

annota=1

SACCA = SD.open("1000.txt", FILE_WRITE);
SACCA.println(1458);
SACCA.close();

}

if (annota == 1) {

    if (SACCA == true)

     {
       lcd.setCursor(0, 2);
      
       rimasti = 0; //

       while (SACCA.available())

       {
         char c = SACCA.read();
               
         lcd.write(c);
         if (isdigit(c))

         {

           rimasti = rimasti * 10  + c - '0';

         }

       }

       delay(1000);
 
     }

   if (rimasti  == codice)

   {
     lcd.setCursor(0, 1);
     lcd.print("FINITA");
     SACCA.close();
     Riavvia();

Ho messo il necessario del codice

Scusa, ho "scambiato" alcune risposte su topic simili. Ora vedo il tuo codice e ti rispondo.

Perdonami docdoc forse hai sbagliato a rispondere nel post........ma al momento del keypad e del LCD non mi interessa proprio...il problema è un altro.

ok...grazie

Ok, vediamo sto codice.

String reg = "1000";
String codiceAutorizzato = "79458633F";
String codiceLetto = "";

Le variabili "String" sono fortemente deprecate su Arduino perché la gestione della memoria non è come quella di ambienti più potenti e rischi malfunzionamenti o blocchi (nel forum troverai fantastilioni di link che ne parlano e spiegano perché non usarle, e come sostituirle).
Quindi appena possibile evita questi oggetti ed impara ad usare le cosiddette "stringhe C" ossia "array di caratteri" (che sono di fatto sempre stringhe, ma vengono gestite meglio su Arduino).

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //  tipo display

Anche qui, ti consiglio di cambiare libreria LiquidCrystal_I2C perché quella che usi è una delle "vecchie" librerie, che si riconoscono dal costruttore pieno di parametri assolutamente inutili per l'interfaccia I2C. Verifica quale libreria stai usando, purtroppo in giro ce ne sono svariate tutte con lo stesso nome.
Io uso (sia su UNO sia su WeMos) QUESTA che è la 1.1.2 di Frank de Brabander. La trovi in "Gestione librerie" dell'IDE, disistalla la tua ed installa quella (ignora il warning in compilazione, funziona benissimo), che come vedi nel costruttore ha i parametri "corretti", limitandosi a dire quanti caratteri per riga e quante righe:
LiquidCrystal_I2C lcd(0x27,20,4);
Poi si inizializza così:

  • lcd.init();*
  • lcd.backlight();*
    invece di:
    lcd.begin(20, 4); // inizializza il display (20 caratteri per 4 righe)
    Serial.println(codiceLetto);

    Serial.println();

if (verificaCodice(codiceLetto, codiceAutorizzato))

registra1
---------
---------
---------
}

if (registra1 == 1) {

    if (SACCA2000 == true)

     {
       lcd.setCursor(0, 2);
     
       rimasti = 0; //

       while (SACCA.available())

       {
         char c = SACCA2000.read();
               
         lcd.write(c);
         if (isdigit(c))

         {

           rimasti = rimasti * 10  + c - '0';

         }

       }

       delay(1000);
 
     }

   if (rimasti  == codiceAutorizzato)

   {
     lcd.setCursor(0, 1);
     lcd.print("FINITA");
     SACCA.close();
     Riavvia();

Anche qui, dato che hai "tagliato" parecchie righe (ma perché lasci tutte quelle righe vuote??) non si capisce, dopo "if (verificaCodice(codiceLetto, codiceAutorizzato))" cosa succede? Quella graffa che c'è dopo cosa chiude? E "SACCA2000" cosa diamine è? E la funzione "verificaCodice" che qui usi, dov'è? E la funzione "autorizzato()" di Standardoil, dov'è?

Quindi ripeto quello che ti ho detto: "devi postare tutto il tuo codice, o quantomeno fai uno sketch che fa solo quello che vuoi testare e posta qui quel listato (unitamente a ciò che fa o non fa o che leggi)."

Fare le cose così "a pezzetti"non serve a te perché non sappiamo come aiutarti, e non serve a noi perché ci fai solo venire il mal di testa e ripetere le stesse domande e richieste.

docdoc perdonami secondo me ti stai concentrando troppo sul codice di per se....il codice che a me serve sistemare è alla fine del codice che ho pubblicato STOP......il programma di per se funziona abbastanza bene a me serve solamente questo:

scrivere un codice seriale su documento.txt su SD ( e ci riesco...lo leggo e lo confronto perfettamente solo se è alla prima riga; il documento deve contenere circa 100 righe)

Ora mi serve un codice che vada a leggere riga per riga i vari seriali e quando incontra il Seriale che io dichiaro mi accenda un led , un relè o qualche altra cosa

Ripeto... a me serve solo capire come fare a leggere riga per riga e confrontare ogni riga con il mio codice

SACCA2000=SACCA è stata una distrazione

Ragazzi buonasera…sono ancora alle prese con il seguente codice e continua a non funzionare.
Praticamente ho un documento “2000.txt” sulla sd con dei SERIALI formati da 10 caratteri alfanumerici, uno per riga.
Se scrivo un solo seriale nel documento il tutto funziona, mi fa il confronto e mi spunta su LCD “DISTRUTTA”,ma se aggiungo altre righe il utto non funziona più.Praticamente non riesco a leggere riga x riga e fare il confronto.

#include <RTClib.h>
#include <Keypad.h>             // libreria di gestione della tastiera
#include <Wire.h>               // libreria wire presente, di default, nell'IDE
#include <LiquidCrystal_I2C.h>  // libreria di gestione del display lcd
#include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
#include <RFID.h>
#include <SD.h>
#include <SPI.h>
#include "Adafruit_Thermal.h"
#include "SoftwareSerial.h"
#define TX_PIN 42 // Arduino TX, pin RX della stampante / labeled RX on printer
#define RX_PIN 40 // Arduino RX, pin TX della stampante / labeled TX on printer
#define SDA_DIO 12
#define RESET_DIO 11

#define FILEUTENTI "utenti.txt"

SoftwareSerial mySerial(RX_PIN, TX_PIN); // Declare SoftwareSerial obj first
Adafruit_Thermal printer(&mySerial); // Pass addr to printer constructor
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //  tipo display

File SACCA;
File myFile;
File dataFile;

byte SDApin = 12;
byte RESETpin = 11;

int rimasti = 0;

String parola = "";

String reg = "SACCA";


char tastobattuto;       // variabile di memorizzazione del carattere battuto
const byte righe = 5;    // numero di righe della tastiera (quattro)
const byte colonne = 4;  // numero di colonne della tastiera (quattro)
char chiave[righe][colonne] =
{
  {'A', 'B', '#', '*'},

  {'1', '2', '3', 'U'},

  {'4', '5', '6', 'D'},

  {'7', '8', '9', 'C'},

  {'L', '0', 'R', 'E'}
};
byte pinrighe[righe]     = {49, 47, 45, 43, 41}; //porte cui devono essere connessi i pin delle
//                                         righe (i primi quattro pin di sinistra) della
//                                         tastiera
byte pincolonne[colonne] = {33, 35, 37, 39}; //porte cui devono essere connessi i pin delle
//                                         colonne (gli ultimi quattro pin di destra) della
//                                         tastiera
//

Keypad keypad = Keypad( makeKeymap(chiave), pinrighe, pincolonne, righe, colonne );

const int chipSelect = 4;

int i = 0;
long valore = 0;         // valore immesso da tastiera

int buzzerPin = 26;
String stringa;
int registra = 0;

long NB = 0;
int NR = 0;

void(* Riavvia)(void) = 0;

/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO);

String codiceAutorizzato1 = "79421633F";
unsigned long int utente = 156;
unsigned long int codiceautorizzato = 156;
unsigned long int codicevalido = 156;
int target = 5;
String codiceLetto = "";


void setup()
{
  digitalWrite(17 , LOW);
  pinMode (17, OUTPUT);
  pinMode (16, OUTPUT);
  pinMode (15, OUTPUT);
  pinMode (14, OUTPUT);
  pinMode(buzzerPin, OUTPUT);


  mySerial.begin(19200);  // Initialize SoftwareSerial
  printer.begin();       // Inizializza la stampante (stesso baudrate della trasmissione seriale)
  delay (2000);


  lcd.begin(20, 4);    // inizializza il display (20 caratteri per 4 righe)

  lcd.setCursor(0, 0); // posiziona il cursore all'inizio della prima riga (carattere 0 e riga 0)
  Serial.begin(9600);
  RTC.begin();
  /* Abilita SPI*/
  SPI.begin();
  /* Viene inizilizzato RFID reader */
  RC522.init();

  SD.begin(4);
  SACCA = SD.open("2000.txt");

  if (SACCA == true)
  {
    lcd.setCursor(0, 2);

    rimasti = 0; //

    while (SACCA.available())
    {
      char c = SACCA.read();

      lcd.write(c);
      if (isdigit(c))
      {
        rimasti = rimasti * 10  + c - '0';
      }
    }
    delay(1000);

  }

  if (rimasti == codicevalido)
  {
    lcd.setCursor(0, 1);
    lcd.print("DISTRUTTA");
    SACCA.close();
    Riavvia();
  }
}

void loop()
{

}

Dalla serie fino a che ci sono thread c'è speranza... In uno dei tanti avevo posto il quesito " dov'è che intercetti la nuova riga e resetti quanto letto prima?" ...lo ribadisco in questo.

Gentile Orso se tu guardi bene il codice...infatti manca proprio questo.....ed é quello che non riesco a fare...... riesco praticamente solo a leggere la prima riga .....se aggiungo la seconda(sul documento.txt) il confronto non funziona più.....ho provato diverse volte a modificare il codice con la guida di STANDARDOIL.......purtroppo non ci riesco.
Mi serve un aiuto su come fare per leggere riga a volta e confrontarla per poi passare alla seconda e così via

non l’ho provato…vedi se funziona:

#include <RTClib.h>
#include <Keypad.h>             // libreria di gestione della tastiera
#include <Wire.h>               // libreria wire presente, di default, nell'IDE
#include <LiquidCrystal_I2C.h>  // libreria di gestione del display lcd
#include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
#include <RFID.h>
#include <SD.h>
#include <SPI.h>
#include "Adafruit_Thermal.h"
#include "SoftwareSerial.h"
#define TX_PIN 42 // Arduino TX, pin RX della stampante / labeled RX on printer
#define RX_PIN 40 // Arduino RX, pin TX della stampante / labeled TX on printer
#define SDA_DIO 12
#define RESET_DIO 11

#define FILEUTENTI "utenti.txt"

SoftwareSerial mySerial(RX_PIN, TX_PIN); // Declare SoftwareSerial obj first
Adafruit_Thermal printer(&mySerial); // Pass addr to printer constructor
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //  tipo display

File SACCA;
File myFile;
File dataFile;

byte SDApin = 12;
byte RESETpin = 11;

int rimasti = 0;

String parola = "";

String reg = "SACCA";


char tastobattuto;       // variabile di memorizzazione del carattere battuto
const byte righe = 5;    // numero di righe della tastiera (quattro)
const byte colonne = 4;  // numero di colonne della tastiera (quattro)
char chiave[righe][colonne] =
{
  {'A', 'B', '#', '*'},

  {'1', '2', '3', 'U'},

  {'4', '5', '6', 'D'},

  {'7', '8', '9', 'C'},

  {'L', '0', 'R', 'E'}
};
byte pinrighe[righe]     = {49, 47, 45, 43, 41}; //porte cui devono essere connessi i pin delle
//                                         righe (i primi quattro pin di sinistra) della
//                                         tastiera
byte pincolonne[colonne] = {33, 35, 37, 39}; //porte cui devono essere connessi i pin delle
//                                         colonne (gli ultimi quattro pin di destra) della
//                                         tastiera
//

Keypad keypad = Keypad( makeKeymap(chiave), pinrighe, pincolonne, righe, colonne );

const int chipSelect = 4;

int i = 0;
long valore = 0;         // valore immesso da tastiera

int buzzerPin = 26;
String stringa;
int registra = 0;

long NB = 0;
int NR = 0;

void(* Riavvia)(void) = 0;

/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO);

String codiceAutorizzato1 = "79421633F";
unsigned long int utente = 156;
unsigned long int codiceautorizzato = 156;
unsigned long int codicevalido = 156;
int target = 5;
String codiceLetto = "";
bool trovato = false; // verifico se ho trovato il codice utente

void setup()
{
  digitalWrite(17 , LOW);
  pinMode (17, OUTPUT);
  pinMode (16, OUTPUT);
  pinMode (15, OUTPUT);
  pinMode (14, OUTPUT);
  pinMode(buzzerPin, OUTPUT);


  mySerial.begin(19200);  // Initialize SoftwareSerial
  printer.begin();       // Inizializza la stampante (stesso baudrate della trasmissione seriale)
  delay (2000);


  lcd.begin(20, 4);    // inizializza il display (20 caratteri per 4 righe)

  lcd.setCursor(0, 0); // posiziona il cursore all'inizio della prima riga (carattere 0 e riga 0)
  Serial.begin(9600);
  RTC.begin();
  /* Abilita SPI*/
  SPI.begin();
  /* Viene inizilizzato RFID reader */
  RC522.init();

  SD.begin(4);
  SACCA = SD.open("2000.txt");

  if (SACCA == true)
  {
    lcd.setCursor(0, 2);

    rimasti = 0; //

    while (SACCA.available() && !trovato)
    {
      char c = SACCA.read();

      lcd.write(c);
      if (isdigit(c))
      {
        rimasti = rimasti * 10  + c - '0';
      }
      if (c == '\n') {
        if (rimasti == codicevalido)
        {
          trovato  = true;
          lcd.setCursor(0, 1);
          lcd.print("DISTRUTTA");
          SACCA.close();
          Riavvia();
        }
        if (rimasti != codicevalido) {
          rimasti = 0;
          lcd.clear();
          lcd.setCursor(0, 2);
        }
    delay(1000);
      }
    }


  }


}

void loop()
{

}

Grazie ORSO2011....funziona perfettamente....ti volveo chiedere l'ultima cosa se era possibile.
Se

rimasti è iINT e codice valido String quindi:

int rimasti= 0;
String codice valido="125S5R65D6"

é possibile fare qualcosa????
Il problema è che il seriale ha caratteri alfanumerici e quindi devo impostarlo per forza come String......o esiste alternativa?????

In questo caso usate int implica delle limitazioni sul " codice utente" da analizzare; gli oggetti String, in Arduino, sono da evitare. L’unica è gestire il tutto come array di char.
Qui nel forum ci sono centinaia di discussioni in merito…cerca prova e facci sapere.