Pages: [1]   Go Down
Author Topic: problema statechange detection  (Read 424 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao ragazzi,
ho modificato lo sketch di esempio sullo statechange detection per fare effettuare ad arduino un conteggio da 1 a 4 e da 4 a 1 utilizzando due pulsanti denominati "UP" e "DOWN.
il problema che mi si pone è questo..quando io arrivo a 1 premendo il pulsante down e succesivamente premo il pulsante up ricevo in risposta sul monitor seriale 6 invece di 2,viceversa ricevo -1...

qualcuno sa aiutarmi su cme risolvere questo problema?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato a postare il listato ma...ho scoperto che non so come si fa
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


const int  buttonPin = 2;    // pulsante UP
const int  buttonPin1= 3;    // pulsante DOWN


int buttonPushCounter = 1;   // counter for the number of button presses
int buttonState = 0;         // stato di UP
int buttonState1 =0;         //stato di DOWN
int lastButtonState = 0;     // previous state of the button
int lastButtonState1= 0;

void setup() {
:
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin1, INPUT);
   pinMode(ledPin, OUTPUT);
   Serial.begin(9600);
}
void loop() {
 //conteggio da 1 a 4 ciclico
  buttonState = digitalRead(buttonPin);
  buttonState1= digitalRead(buttonPin1);
   if (buttonState != lastButtonState) {
   
    if (buttonState == HIGH) {
     
      buttonPushCounter++;
      delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
     
      Serial.println("off");
    }
   
  if (buttonPushCounter>3){
    buttonPushCounter=0;}
  }

 
  lastButtonState = buttonState;
 
  //conteggio da 4 a 1 ciclico
    if (buttonState1 != lastButtonState1) {
   
    if (buttonState1 == HIGH) {
     
      buttonPushCounter--;
      delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
     
      Serial.println("off");
    }
   
  if (buttonPushCounter<2){
    buttonPushCounter=5;}
  }
 
 
  lastButtonState1 = buttonState1;
 
 
}



 











Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6589
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova così:
Code:
const int buttonPin = 2;    // pulsante UP
const int buttonPin1= 3;    // pulsante DOWN

int buttonPushCounter = 1;   // counter for the number of button presses
int buttonState = 0;         // stato di UP
int buttonState1 = 0;         //stato di DOWN
int lastButtonState = LOW;     // previous state of the button
int lastButtonState1= LOW;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin1, INPUT);
  Serial.begin(9600);
}
void loop() {
  //conteggio da 1 a 4 ciclico
  buttonState = digitalRead(buttonPin);
  buttonState1= digitalRead(buttonPin1);
  delay(20); // debounce

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
      if (buttonPushCounter>4) buttonPushCounter=4;
      // delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else
    {
      Serial.println("off");
    }
  }
  lastButtonState = buttonState;

  //conteggio da 4 a 1 ciclico
  if (buttonState1 != lastButtonState1) {

    if (buttonState1 == HIGH) {
      buttonPushCounter--;
      if (buttonPushCounter<0) buttonPushCounter=0;
      // delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
      Serial.println("off");
    }
  }
  lastButtonState1 = buttonState1;
}
Il controllo del limite lo devi fare subito dopo l'incremento o il decremento.
In questo modo vai da 1 a 4 e ti fermi o viceversa.
Nel tuo modo sembrava più un incremento circolare: da 1 a 4 e poi rinizia da 1 (anche se il codice secondo me era sbagliato)
« Last Edit: January 12, 2013, 10:28:08 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova così:
Code:
const int buttonPin = 2;    // pulsante UP
const int buttonPin1= 3;    // pulsante DOWN

int buttonPushCounter = 1;   // counter for the number of button presses
int buttonState = 0;         // stato di UP
int buttonState1 = 0;         //stato di DOWN
int lastButtonState = LOW;     // previous state of the button
int lastButtonState1= LOW;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin1, INPUT);
  Serial.begin(9600);
}
void loop() {
  //conteggio da 1 a 4 ciclico
  buttonState = digitalRead(buttonPin);
  buttonState1= digitalRead(buttonPin1);
  delay(20); // debounce

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
      if (buttonPushCounter>4) buttonPushCounter=4;
      // delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else
    {
      Serial.println("off");
    }
  }
  lastButtonState = buttonState;

  //conteggio da 4 a 1 ciclico
  if (buttonState1 != lastButtonState1) {

    if (buttonState1 == HIGH) {
      buttonPushCounter--;
      if (buttonPushCounter<0) buttonPushCounter=0;
      // delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
      Serial.println("off");
    }
  }
  lastButtonState1 = buttonState1;
}
Il controllo del limite lo devi fare subito dopo l'incremento o il decremento.
In questo modo vai da 1 a 4 e ti fermi o viceversa.
Nel tuo modo sembrava più un incremento circolare: da 1 a 4 e poi rinizia da 1 (anche se il codice secondo me era sbagliato)

funziona perfettamente ora..ho solo modificato i limiti ponendo nel salire "if (buttonPushCounter>4) buttonPushCounter=1;" e " if (buttonPushCounter<1) buttonPushCounter=4; nel pulsante down..

grazie mille  smiley-grin
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova così:
Code:
const int buttonPin = 2;    // pulsante UP
const int buttonPin1= 3;    // pulsante DOWN

int buttonPushCounter = 1;   // counter for the number of button presses
int buttonState = 0;         // stato di UP
int buttonState1 = 0;         //stato di DOWN
int lastButtonState = LOW;     // previous state of the button
int lastButtonState1= LOW;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin1, INPUT);
  Serial.begin(9600);
}
void loop() {
  //conteggio da 1 a 4 ciclico
  buttonState = digitalRead(buttonPin);
  buttonState1= digitalRead(buttonPin1);
  delay(20); // debounce

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
      if (buttonPushCounter>4) buttonPushCounter=4;
      // delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else
    {
      Serial.println("off");
    }
  }
  lastButtonState = buttonState;

  //conteggio da 4 a 1 ciclico
  if (buttonState1 != lastButtonState1) {

    if (buttonState1 == HIGH) {
      buttonPushCounter--;
      if (buttonPushCounter<0) buttonPushCounter=0;
      // delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
      Serial.println("off");
    }
  }
  lastButtonState1 = buttonState1;
}
Il controllo del limite lo devi fare subito dopo l'incremento o il decremento.
In questo modo vai da 1 a 4 e ti fermi o viceversa.
Nel tuo modo sembrava più un incremento circolare: da 1 a 4 e poi rinizia da 1 (anche se il codice secondo me era sbagliato)

funziona perfettamente ora..ho solo modificato i limiti ponendo nel salire "if (buttonPushCounter>4) buttonPushCounter=1;" e " if (buttonPushCounter<1) buttonPushCounter=4; nel pulsante down..

grazie mille  smiley-grin

mi si è presentato un ulteriore problema...ho aggiunt la variabile pincount per comandare una serie di 4 led che in base al buttonpush counter si accendono..provandolo con il monitor seriale il pincount va bene ma il controllo del pulsante va in modo "casuale"

il listato che ho aggiunto è questo:
Code:
//conteggio da 1 a 4 ciclico
  buttonState = digitalRead(buttonPin);
  buttonState1= digitalRead(buttonPin1);
  delay(20); // debounce

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++ ;
   if (buttonPushCounter>4) buttonPushCounter=1;
   if (buttonPushCounter++);{(pincount++);
   if (pincount>4) pincount=1;
      delay (500);
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
     
Serial.println ("pincount");
Serial.println(pincount);}
    }
    else
    {
      Serial.println("off");
    }
  }
  lastButtonState = buttonState;

sapresti indicarmi una via per capire dove trovo l'errore?
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6589
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Che è sta cosa?  smiley-eek
Code:
if (buttonPushCounter++);{(pincount++);
Se incrementi la variabile buttonPushCounter allora incrementa pincount?
Non si fa così...

E poi rimuovi il delay... è deletario.  smiley-wink
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6589
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aggiungi in testa al codice
Code:
#define PINLED1 4
#define PINLED2 5
#define PINLED3 6
#define PINLED4 7

poi nel setup li setti come output
Code:
pinMode(PINLED2, OUTPUT);
pinMode(PINLED2, OUTPUT);
pinMode(PINLED3, OUTPUT);
pinMode(PINLED4, OUTPUT);

poi crei una funzione per accendere i led
Code:
void LedOn (int numberled)
{
  // spegne led
  digitalWrite(PINLED1, LOW);
  digitalWrite(PINLED2, LOW);
  digitalWrite(PINLED3, LOW);
  digitalWrite(PINLED4, LOW);

  // accende il led numero ...
  switch(numberled) {
  case 1:
    digitalWrite(PINLED1, HIGH);
    break;
  case 2:
    digitalWrite(PINLED2, HIGH);
    break;
  case 3:
    digitalWrite(PINLED3, HIGH);
    break;
  case 4:
    digitalWrite(PINLED4, HIGH);
    break;

    default;
  }
}

e al posto del delay(500); metti la chiamata alla funzione
Code:
LedOn(buttonPushCounter);

Potresti al posto dello switch case usare una funzione che ti calcoli lo stato da imporre ai led con un confronto binario.
Tra l'altro non sono sicuro se in questo modo i led possano lampeggiare, visto che li spegni e li accendi ogni volta.
Non ho provato il codice e non ho idea se compila e funziona.

Ricorda di mettere le resistenze in serie ai led o bruci i piedini di Arduino.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Che è sta cosa?  smiley-eek
Code:
if (buttonPushCounter++);{(pincount++);
Se incrementi la variabile buttonPushCounter allora incrementa pincount?
Non si fa così...

E poi rimuovi il delay... è deletario.  smiley-wink

Per come ho messo il codice funziona il conteggio sia di uno che dell'altro(forse ho apportato delle modifiche su pincount)...e poi sinceramente era l'unico metodo che mi era venuto in mente per fargli effettuare entrambi i conteggi...per il codice appena ho tempo proverò anche se per ora ho risolto con un for loop...
Logged

Pages: [1]   Go Up
Jump to: