[RISOLTO] Lettura su display anomala

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;
}

Scusa, come hai fatto il debouncing del pulsante? Perché nel codice non mi sembra di vederlo ... lo hai fatto hardware?

Guglielmo

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?

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;
}

Nel loop principale ti basta un

if( pushButton(2, 500) ) {
   punteggio++;        
   Serial.println(punteggio); 
   // etc etc etc   
}

Ultimo appunto: i bottoni sono quelli delle camicie, in elettronica si chiamano PULSANTI (non riesco proprio a resistere scusate :wink: )

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.

bool pushButton(const uint8_t pinNumber){
    static bool fallingEdge = false;
    if( !digitalRead(pinNumber) && !fallingEdge ){        
        fallingEdge = true;
        return true;
    }
    else if( digitalRead(pinNumber)  && fallingEdge){
        fallingEdge = false;
    }
    return false;
}

ho modificato la funzione, ma mi da un errore di compilazione

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){
    static bool fallingEdge = false;
    if( !digitalRead(pinNumber) && !fallingEdge ){       
        fallingEdge = true;
        return true;
    }
    else if( digitalRead(pinNumber)  && 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
  }

}

la funzione pushButton l'hai dichiarata con un solo parametro e poi l'hai richiamata con due

fratt:
la funzione pushButton l’hai dichiarata con un solo parametro e poi l’hai richiamata con due

Hai ragione, che distrattino che sono, ora va alla grande!

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){
    static bool fallingEdge = false;
    if( !digitalRead(pinNumber) && !fallingEdge ){       
        fallingEdge = true;
        return true;
    }
    else if( digitalRead(pinNumber)  && 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) ) {
    punteggio++;
    myLed.println(punteggio);
    Serial.println(punteggio);
    // etc etc etc
  }

}