Pages: [1] 2 3   Go Down
Author Topic: contatore  (Read 2230 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve ragazzi

potreste aiutarmi con questo codice?

Code:
// Contatore

int pulsante =2;
int val = 0;
int contatore = 0;
int old_counter = 0;
int currentState = 0;
int previousState = 0;

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

void loop(){
val = digitalRead(pulsante);
if (val == HIGH) { 
currentState = 1;
}
else {
currentState = 0;
Serial.println("Pippo");
}


if(currentState != previousState){
if(currentState == 1){
contatore = contatore + 1;
Serial.println(contatore);
}
}
previousState = currentState;
delay(250);
}

il problema è che quando premo il pulsante ho la transizione da Pippo a 1 ma come rilascio torna a Pippo :-)

se ripremo il pulsante fa 2 e se mollo rifà Pippo. le sto provando tutte ma proprio non trovo soluzione per far visualizzare sempre il numero e non pippo
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi sembra normale che a pulsante rilasciato (LOW) sulla seriale compaiano tanti Pippo. E' esattamente ciò che l'if() subito dopo la digitalRead() fa.

Cosa vuoi ottenere esattamente ?
Logged

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

In pratica il programma inizia visualizzando la parola Pippo come premo il pulsante visualizzo 1 e come rilascio visualizzo sempre 1 e così via per il 2 e per il 3 :-)
sostanzialmente Pippo è lo 0

Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora dovresti stampare pippo quando contatore vale zero, non tutte le volte che leggi LOW dal pin.

PS: CTRL+T per indentare correttamente il codice. Lo rende più leggibile.
Logged

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao

ma come modifico? avevo già testato a mettere contatore == 0 ma nulla
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se ciò che vuoi è stampare pippo quando contatore vale zero è molto semplice: togli print("pippo") da dove si trova ora e aggiungi nel ciclo questo test:

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

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Già fatto ma poi non incrementa più, cioè fa pippo premo fa 1 e resta sempre e solo 1 anche se ripremo  non aumenta
Logged

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come dice giustamente tux, il problema col tuo codice sta qua
Code:
if (val == HIGH) { 
     currentState = 1;
}
else {
     currentState = 0;
     Serial.println("Pippo");
}
quando premi il pulsante val  è = HIGH e quindi entri e setti currentState ad 1, ma al prossimo giro, se il pulsante non è premuto,  setti currentState a 0 e stampi Pippo! praticamente ricominci da capo. Io lascerei stare currentState e incrementerei il contatore alla pressione del pulsante. Utilizzerei old_counter per memorizzare il vecchio valore del contatore e stamperei il valore di contatore solo se maggiore di old_counter.
per capirci:
Code:
void loop(){
old_counter = contatore;
if(digitalRead(pulsante)){
contatore +=1;
}
if(contatore > old_counter){
Serial.println(contatore);
}
delay(250);
}
se poi vuoi stampare pippo al primo giro, la modifica è facile facile. che ne pensi?
N.
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie :-)

e nel caso volessi mettere un pulsante che decremeta? e un'altro che mi riporta a pippo?
Logged

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley su, su, un po di iniziativa!!  smiley
comincia a fare ipotesi che se ne parla tutti insieme  smiley-wink
N.
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

:-) mi sono espresso male

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

 smiley-razz cmq proverò in caso di problemi riposto

grazie di tutto
Logged

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

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

Code:
// 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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22638
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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.
Logged


Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, perchè usi tutti quegli if? Alla fine non fanno tutti la tessa cosa, cioè stampare contatore+1?
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// 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().
« Last Edit: September 26, 2012, 05:13:02 am by tuxduino » Logged

Pages: [1] 2 3   Go Up
Jump to: