Ciao a tutti, ho creato un contapunti in cui ogni volta che premo il tasto aumenta di 1 il punteggio, il problema è che fino a 14 tutto va bene, dal 15 in poi il display comincia a "svarionare" e a dare i numeri, vi posto il codice e il video così capite bene di cosa si tratta; il difetto può essere che il display legge la variabile continuamente anzichè leggerla una volta ogni tot tempo?
int last;
int actual;
int punteggio = 0;
#include <LedPrint.h>
LedPrintJustifiable myLed = LedPrintJustifiable
(
33, // DATA PIN
37, // CLOCK PIN
35, // CS PIN
4, // NUMBER OF DIGITS
1 // Orientation 0/1, if it looks backwards try the other
);
void setup() {
pinMode (51, INPUT_PULLUP);
// Set Brightness
myLed.setIntensity(15);
// Center justify (0), alternatives -1 for left and 1 for right
myLed.justify(1);
}
void loop() {
bottone();
myLed.println(punteggio);
Serial.print(punteggio);
}
void bottone() {
if (digitalRead(51) == LOW) {
actual = 1;
}
else {
actual = 0;
}
if (actual != last) {
if (actual == 1) {
punteggio = punteggio + 1;
}
}
last = actual;
}
Ma soprattutto, visto che hai pensato ad una funzione per controllare lo stato del pulsante, perché non farla generica e più completa in modo da riutilizzarla come e quando vuoi?
Il modo che hai scelto per controllare il fronte del segnale inoltre mi sembra piuttosto arzigogolato.... che ne pensi di un qualcosa del genere?
gpb01:
Scusa, come hai fatto il debouncing del pulsante? ...
purtroppo non lo avevo ancora fatto...
cotestatnt:
Ma soprattutto, visto che hai pensato ad una funzione per controllare lo stato del pulsante, perché non farla generica e più completa in modo da riutilizzarla come e quando vuoi? ....
ora il display funziona alla grande, però c'è un problema, ho l'esigenza che se tengo premuto il tasto non aumenti di valore fino alla prossima pressione del tasto, ecco il video e il codice:
int punteggio = 0;
#include <LedPrint.h>
LedPrintJustifiable myLed = LedPrintJustifiable
(
33, // DATA PIN
37, // CLOCK PIN
35, // CS PIN
4, // NUMBER OF DIGITS
1 // Orientation 0/1, if it looks backwards try the other
);
bool pushButton(const uint8_t pinNumber, uint16_t repeatTime) {
static bool fallingEdge = false;
static uint32_t pressTime;
if ( !digitalRead(pinNumber) && !fallingEdge ) {
fallingEdge = true;
pressTime = millis();
return true;
}
if (millis() - pressTime > repeatTime && fallingEdge) {
fallingEdge = false;
}
return false;
}
void setup() {
pinMode (51, INPUT_PULLUP);
// Set Brightness
myLed.setIntensity(1);
// Center justify (0), alternatives -1 for left and 1 for right
myLed.justify(1);
Serial.begin(9600);
}
void loop() {
if ( pushButton(51, 30) ) {
punteggio++;
myLed.println(punteggio);
Serial.println(punteggio);
// etc etc etc
}
}
>paolinux78: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso.
Gli utenti da device "mobile" (piccoli schermi) ringrazieranno per la cortesia
Guglielmo
P.S.: Ho troncato io il "quote" del tuo post qui sopra
paolinux78:
ho l'esigenza che se tengo premuto il tasto non aumenti di valore fino alla prossima pressione del tasto
Potresti modificare la funzione ad esempio in questo modo, solo che questa seconda opzione può soffrire del problema del rimbalzo sul pulsante.
La scelta migliore è un semplice filtro RC "hardware" sul pin di ingresso, ma volendo si può mettere una pezza anche con il software.