variabile non si incrementa

Buonasera a tutti !!!

ho un problema con il mio sketch...

ho interfacciato con arduino un lettore di badge magnetici che funziona perfettamente, lo sketch che ho scritto dopo la lettura di qualsiasi scheda , deve permettermi di incrementare una variabile int di 1 ogni volta che un pulsante venga premuto, ma questo non avviene, sullo schermo lcd la variabile è sempre uguale a 0 ...

da premettere che la routine per l'incremento della variabile tramite pulsante funziona benissimo se non la integro nello sketch dove è compreso l'interfacciamento con il lettore di badge...

  //Lettore di Badge
  //Arduino Pin 2 - arancione RDT/data
  //Arduino Pin 3 - giallo RCL/clock
  //Arduino Pin 4 - marrone CLS/card present    
    
    #include <MagStripe.h> //includo la libreria per il riconoscimento del lettore di badge
    #include <LiquidCrystal.h> //includo libreria LCD
    static const byte DATA_BUFFER_LEN = 108;  
    static char data[DATA_BUFFER_LEN];
    MagStripe card;

int in=7;


int a = 0;
int b = 0;
int c= 0;
int d = 0;


    //definizione pin lcd---------------------
    LiquidCrystal lcd(13, 12, 11, 10, 9, 8);   

           
          
           
    void setup()                                               
    {      
     pinMode(in,INPUT);
     lcd.begin(16, 2);       
    Serial.begin(9600); 
    delay(1000);
    lcd.setCursor(2, 0);
    lcd.print("Benvenuto In");
    delay(1000);
    lcd.setCursor(3, 1);
     lcd.print("M.a.Y.a.JA");
     delay(5000);
    lcd.clear();
    lcd.setCursor(1, 0);
    lcd.print("Passa La Carta");
    // inizializza la libreria per leggere la traccia 2        
    card.begin(2);                                             
    }                                                          

 
 //Ciclo che contiene il codice pricincipale del programma, si ripete continuamente...
                                                                                      
    void loop()   {
     c=digitalRead(in);
      
    
    
      // Don't do anything if there isn't a card present...                              
    if (!card.available()) 
    { 
      return;
    }                                                                                 
 
  // leggi la carta nell buffer "data" (come una stringa con terminazione null)...    
    short chars = card.read(data, DATA_BUFFER_LEN);  

    // se chars è maggiore si 0 esegui le istruzioni seguenti
    if(chars>0){
  d=digitalRead(in);
  if ( in== 1){a=a+1;delay(500);}
  lcd.clear();
  lcd.print("inserisci");
lcd.setCursor(12, 1);
  lcd.print(a);

  }
    }

questo è il codice... non capisco dove sbaglio...

Grazie in anticipo a tutti per l'aiuto :slight_smile:

Ho notato solo un errore banale che è la causa del malfunzionamento
ma non ho analizzato il codice nel dettaglio.

  d=digitalRead(in);
  if ( in== 1){a=a+1;delay(500);}

La variabile 'd' contiene lo stato del pin letto con digitalRead(), mentre pin è una costante numerica che identifica il numero assegnato al pin di arduino.

Se non è chiaro il controllo if (... deve essere fatto sulla variabile 'd', cioè:

if ( d == 1) { 
    a = a + 1;   // oppure a++; o ++a; in questo contesto sono validi entrambe
   delay(500);
}

Ciao.

ciao grazie del consiglio ho impostato il codice per come mi hai spiegato tu, adesso la variabile si incrementa di 1 ogni volta che passo il badge nel lettore :S

Per semplificare di piú si potrebbe lasciar via il if e sommare lo stato del entrata direttamente alla variabile.

d=digitalRead(in);
a+=d;
delay(500);

oppure

a+=digitalRead(in);
delay(500);

ciao

ho provato ma niente conta solo quando il pulsante è premuto e passo il badge...praticamente conta quante volte passo il badge quando dovrebbe contare quante volte premo il pulsante

Ho riguardato il tuo codice ma non mi piace come è scritto.

    if (!card.available()) 
    { 
      return;
    }

Scusa, mi spieghi cosa significa "return" all'interno del ciclo loop? Dove dovrebbe uscire il tuo ciclo? :wink:

se tolgo quelle stringhe di codice prosegue senza che io passi il badge, e va direttamente a stampare sullo schermo lcd la variabile che si incrementa ogni volta che premo il pulsante, però ora la variabile si incrementa :slight_smile: ma io voglio far incrementare la variabile dopo che legge i dati di un badge...

up

Cambia quell'if facendo in modo che tutto quello che c'è dopo lo esegui se la scheda è presente:

if (card.available()) { 
      // leggi la carta nell buffer "data" (come una stringa con terminazione null)...    
    short chars = card.read(data, DATA_BUFFER_LEN);  
  ecc...
}

franz94:
se tolgo quelle stringhe di codice prosegue senza che io passi il badge, e va direttamente a stampare sullo schermo lcd la variabile che si incrementa ogni volta che premo il pulsante, però ora la variabile si incrementa :slight_smile: ma io voglio far incrementare la variabile dopo che legge i dati di un badge...

Il mancato conteggio dipende proprio dalla if(... return;
Si può usare return per impedire la prosecuzione di una funzione e infatti loop è proprio una funzione,
e il mancato funzionamento dipende proprio dal fatto che return ritorna al chiamante, il quale chiama nuovamente
la funzione loop e così via fino a che card.available() ritorna false, la conseguenza è che tutto il codice dopo l'istruzione return viene eseguito solo se card.available() ritorna true.

Ciao.

leo72:
Cambia quell'if facendo in modo che tutto quello che c'è dopo lo esegui se la scheda è presente:

if (card.available()) { 

// leggi la carta nell buffer "data" (come una stringa con terminazione null)...   
    short chars = card.read(data, DATA_BUFFER_LEN); 
  ecc...
}

ciao ho provato a modificare l'if e scrivere il codice al suo interno, ma si verificano gli stessi problemi...

MauroTec:
Il mancato conteggio dipende proprio dalla if(... return;
Si può usare return per impedire la prosecuzione di una funzione e infatti loop è proprio una funzione,
e il mancato funzionamento dipende proprio dal fatto che return ritorna al chiamante, il quale chiama nuovamente

Appunto, era del tutto inutile. Esci a quello che aveva chiamato loop, che nell'ambiente Arduino è il vero main che c'è dietro. E cadi in un loop infinito for(;:wink: che rilancia il loop.

franz94:
ciao ho provato a modificare l'if e scrivere il codice al suo interno, ma si verificano gli stessi problemi...

Pubblica il codice.

//Lettore di Badge
  //Arduino Pin 2 - arancione RDT/data
  //Arduino Pin 3 - giallo RCL/clock
  //Arduino Pin 4 - marrone CLS/card present    
    
    #include <MagStripe.h> //includo la libreria per il riconoscimento del lettore di badge
    #include <LiquidCrystal.h> //includo libreria LCD
    
    static const byte DATA_BUFFER_LEN = 108;  
    static char data[DATA_BUFFER_LEN];
    
    MagStripe card;
    
    int in2=7;
    int c=0;
    int b=0;

    //definizione pin lcd---------------------
    LiquidCrystal lcd(13, 12, 11, 10, 9, 8);   

           
          
           
    void setup()                                               
    {    

      
    pinMode(7,INPUT);
    digitalWrite(in2,LOW);
    lcd.begin(16, 2);       
    Serial.begin(9600); 
    delay(1000);
    lcd.setCursor(2, 0);
    lcd.print("Benvenuto In");
    delay(1000);
    lcd.setCursor(3, 1);
    lcd.print("M.a.Y.a.JA");
    delay(5000);
    lcd.clear();
    lcd.setCursor(1, 0);
    lcd.print("Passa La Carta");
    // inizializza la libreria per leggere la traccia 2       
    card.begin(2);                                              
    }                                                          

 
                                                                   
    void loop()   {
    if (card.available()){
    
 short chars = card.read(data,DATA_BUFFER_LEN);
                
  c=digitalRead(in2);
  if ( c== 1){
    b=b+1;
  delay(500);
  }
  lcd.setCursor(13, 1);
  lcd.print(b);
  lcd.setCursor(15,1);
  lcd.print(c);
  }

    }

ho apportato delle modifiche, infatti faccio stampare anche una variabile sullo schermo lcd che mi dice lo stato del pin7(low/high).

Ma il pin 7 come lo hai collegato ? Hai messo una resistenza di pull-down e quando chiudi il pulsante lo colleghi al +Vcc ? Perché, in caso contrario ... sarà difficile avere letture affidabili in presenza di altri segnali attorno ... :roll_eyes:

Inoltre, solo per scrupolo, fai il test così :

byte c;
...
...
c = digitalRead(in2);
if ( c == HIGH ) {
   ...
}

Guglielmo

gpb01:
Ma il pin 7 come lo hai collegato ? Hai messo una resistenza di pull-down e quando chiudi il pulsante lo colleghi al +Vcc ? Perché, in caso contrario ... sarà difficile avere letture affidabili in presenza di altri segnali attorno ... :roll_eyes:

Inoltre, solo per scrupolo, fai il test così :

byte c;

...
...
c = digitalRead(in2);
if ( c == HIGH ) {
  ...
}




Guglielmo

ciao Guglielmo, naturalmente sula pin 7 c'è una resistenza da 10 kohm a pull-down, inoltre ho provato ha impostare la varibile c come una varibile di tipo byte come mi hai consigliato ma non cambia niente

franz94:
ciao Guglielmo, naturalmente sula pin 7 c'è una resistenza da 10 kohm a pull-down, inoltre ho provato ha impostare la varibile c come una varibile di tipo byte come mi hai consigliato ma non cambia niente ...

Mah ... non mi vengono in mente altre stranezze ...

...puoi giusto provare a mettere nella digitalRead() il numero del pin direttamente invece che tramite una variabile ... ma siamo veramente ai limiti dell'alchimia :grin: :grin: :grin:

byte c;
...
...
c = digitalRead(7);
if ( c == HIGH ) {
   ...
}

Guglielmo

Mi spiegi questo?

 int in2=7;
...
...

    pinMode(7,INPUT);
    digitalWrite(in2,LOW);

In pratica metti un pin in INPUT e poi cerchi di impostarne lo stato su LOW.
Non puoi farlo. Se pensavi di attivare una resistenza interna di pull-down, hai sbagliato perché le MCU Atmel hanno solo quelle di pull-up internamente (che si attivano con una scrittura HIGH su un pin messo in INPUT).

leo72:
Mi spiegi questo?

 int in2=7;

...
...

pinMode(7,INPUT);
   digitalWrite(in2,LOW);



In pratica metti un pin in INPUT e poi cerchi di impostarne lo stato su LOW. 
Non puoi farlo. Se pensavi di attivare una resistenza interna di pull-down, hai sbagliato perché le MCU Atmel hanno solo quelle di pull-up internamente (che si attivano con una scrittura HIGH su un pin messo in INPUT).

ok ora tolgo il pasticcio che ho combinato posso assicurarti che non sta li il problema...

Sicuramente non sta lì, però non si vede tutto il codice quindi non so dirti se in altri punti ci sono altri errori.