problema statechange detection

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?

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

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;

}

Prova così:

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)

PaoloP:
Prova così:

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:

mattwolf:

PaoloP:
Prova così:

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:

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:

 //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?

Che è sta cosa? :astonished:

if (buttonPushCounter++);{(pincount++);

Se incrementi la variabile buttonPushCounter allora incrementa pincount?
Non si fa così...

E poi rimuovi il delay... è deletario. :wink:

Aggiungi in testa al codice

#define PINLED1 4
#define PINLED2 5
#define PINLED3 6
#define PINLED4 7

poi nel setup li setti come output

pinMode(PINLED2, OUTPUT);
pinMode(PINLED2, OUTPUT);
pinMode(PINLED3, OUTPUT);
pinMode(PINLED4, OUTPUT);

poi crei una funzione per accendere i led

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

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.

PaoloP:
Che è sta cosa? :astonished:

if (buttonPushCounter++);{(pincount++);

Se incrementi la variabile buttonPushCounter allora incrementa pincount?
Non si fa così...

E poi rimuovi il delay... è deletario. :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...