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);
}
}
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 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
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
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 ma io voglio far incrementare la variabile dopo che legge i dati di un badge...
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 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.
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(; che rilancia il loop.
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 ...
Inoltre, solo per scrupolo, fai il test così :
byte c;
...
...
c = digitalRead(in2);
if ( c == HIGH ) {
...
}
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 ...
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
byte c;
...
...
c = digitalRead(7);
if ( c == HIGH ) {
...
}
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).
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...