Go Down

Topic: problema statechange detection (Read 554 times) previous topic - next topic

mattwolf

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?

mattwolf

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

mattwolf


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
















PaoloP

#3
Jan 12, 2013, 04:25 pm Last Edit: Jan 12, 2013, 04:28 pm by PaoloP Reason: 1
Prova così:
Code: [Select]
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)

mattwolf


Prova così:
Code: [Select]
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  :D

mattwolf



Prova così:
Code: [Select]
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  :D


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: [Select]
//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?

PaoloP

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

E poi rimuovi il delay... è deletario.  ;)

PaoloP

Aggiungi in testa al codice
Code: [Select]

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


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


poi crei una funzione per accendere i led
Code: [Select]
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: [Select]

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.

mattwolf


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

E poi rimuovi il delay... è deletario.  ;)


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...

Go Up