Go Down

Topic: contatore (Read 2 times) previous topic - next topic

AMBUSH

:-) mi sono espresso male

per far tutto ciò mi basta modificare lo sketch soltanto invece di mettere +1 metto -1

:P cmq proverò in caso di problemi riposto

grazie di tutto

AMBUSH

Ciao

dopo i vostri consigli ieri mi sono divertito a modificare e rimodificare il codice in maniera folle ed ecco il risultato

Code: [Select]
// Contatore

int pulsante =2;
int pulsante2 =4;
int val = 0;
int val0 =0;
int contatore = 0;
int old_contatore = 0;



void setup() {
pinMode(pulsante, INPUT);
pinMode(pulsante2, INPUT);
Serial.begin(9600);
}

void loop(){
 
if ( contatore == 0 ) {
 
  Serial.println("pippo");
}
if(digitalRead(pulsante)){
contatore +=1;

}
if(contatore > old_contatore){
  if ( contatore == 1) {
  Serial.println("2");
} if ( contatore == 2) {
  Serial.println ("3");}
  if ( contatore == 3) {
    Serial.println ("4");}
    if ( contatore == 4) {
      Serial.println ("5");}
      if ( contatore >=5) {
       
        val0= contatore + 1;
        Serial.println(val0);
      }
               
}
if(digitalRead(pulsante2)){
  contatore -=1;
}
if(contatore< old_contatore){
  val = abs(contatore);
  Serial.println(val);
}
delay (200);
}


i miei problemi sono i seguenti:

1) non riesco a far mantenere lo stato fisso dopo ogni incremento o decremento, in un paio di casi ci sono riuscito ma poi mi venivano numeri a caso con decremento di 2

2) come evito i fenomeni di falso contatto?

grazie

leo72

1) sono i rimbalzi del pulsantino
2) prova così:

Code: [Select]

if(digitalRead(pulsante)){
  delay(50);
  if(digitalRead(pulsante)){
    contatore +=1;
  }
}

Fermi 50 ms il codice, poi rifai una lettura. Se è sempre HIGH, vuol dire che il pulsantino è ancora premuto, altrimenti è stato un falso contatto.

superp

Ciao, perchè usi tutti quegli if? Alla fine non fanno tutti la tessa cosa, cioè stampare contatore+1?
"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

tuxduino

#14
Sep 26, 2012, 12:11 pm Last Edit: Sep 26, 2012, 12:13 pm by tuxduino Reason: 1
Penso che sia "dummy code" che serve soltanto ora per assicurarsi che la struttura del programma sia corretta, cioè che premendo il pulsante si passa da una sezione all'altra. Una volta verificato che tutto funzia, si possono sostuire le println() con chiamate  a funzione che fanno effettivamente quello che il programma deve fare...

(Nota: per cortesia, premi CTRL+T prima di postare il codice!)

Usa le righe vuote in modo consistente con il flusso del programma.

Raggruppa il codice che legge i pulsanti e modifica la variable contatore.

Non è chiaro perché pulsante e pulsante2 invece di pulsante1 e pulsante2. Poi ti consiglierei di dare un nome che renda più chiaro se si tratta del pin del pulsante o del suo stato. Tipo pinPulsante1, pinPulsante2.

Manca l'aggiornamento di old_contatore.

Infine è "semanticamente" più corretto scrivere if (digitalRead(pin) == HIGH) invece di if (digitalRead(pin)).

Code: [Select]

// Contatore

int pulsante =2;
int pulsante2 =4;
int val = 0;
int val0 =0;
int contatore = 0;
int old_contatore = 0;

void setup() {
    pinMode(pulsante, INPUT);
    pinMode(pulsante2, INPUT);
    Serial.begin(9600);
}

void loop(){
    if(digitalRead(pulsante)){
        contatore +=1;
    }

    if(digitalRead(pulsante2)){
        contatore -=1;
    }

    if ( contatore == 0 ) {
        Serial.println("pippo");
    }

    if(contatore > old_contatore){
        if ( contatore == 1) {
            Serial.println("2");
        }
        if ( contatore == 2) {
            Serial.println ("3");
        }
        if ( contatore == 3) {
            Serial.println ("4");
        }
        if ( contatore == 4) {
            Serial.println ("5");
        }
        if ( contatore >=5) {
            val0= contatore + 1;
            Serial.println(val0);
        }
    }

    if(contatore < old_contatore) {
        val = abs(contatore);
        Serial.println(val);
    }

    old_contatore = contatore;    // <<==== !

    delay (200);    // debounce
}


Penso che il debounce sia già abbondamentemente coperto dal delay(200) alla fine di loop().

Go Up