Inkrementieren

Hallo,
ich habe eine funktion geschrieben, die beim drücken des button_up wird um 0.01 inkrementieren und beim drücken des button _dwn soll dekrementiert werden..enter_button ist für return ergebnis.

const int  button_up = 48;    
const int button_enter=50;
const int buttonPin_dwn=44;
 float i = 0.0;

float wpreis(){
  
  if(digitalRead(button_enter)==LOW){
    
  while (digitalRead(button_up)== HIGH){
    
  
    //digitalRead(buttonPin)== LOW;
     delay(2500);
     lcd.setCursor(4,1);
     lcd.print(i);
     Serial.println(i);
     i= i+0.01;
  
  }
  
 
  
  while (digitalRead(buttonPin_dwn)== HIGH){
   
     delay(2500);
     lcd.setCursor(4,1);
     lcd.print(i);
    Serial.println(i);
    i= i-0.01;
  
  }
 
}
   return i;

}
void setup() {
  lcd.begin(20, 4);
pinMode(button_up, INPUT);
  pinMode(button_enter, INPUT);
  pinMode(buttonPin_dwn, INPUT);
  Serial.begin(9600);
}
void loop{
wpreis();
}

wollte wissen was mache ich da falsch, weil ich die gewünschte ergebnis nicht kriege.
freue mich auf Feedbackkkkkkkk.

Was kriegst du denn für ein Ergebnis?

Noch dazu könnte es an der Beschaltung liegen. Hast du Pulldown-Widerstände an den Tastern?

Es zählt bis 0.01 und fängt sofort ohne was zu drücken minus zu zählen..-0.01, -0.02....
ich habe Pullup wiederstände.

Diese Programmierlogik mit while und delay stoppt den Controller. Er kann nichts anderes machen.

Du hast Pullup Widerstände, sagtest Du.

Sobald und solange Du den Enter-Taster drückst ist dann ist digitalRead(button_up) und digitalRead(button_dwn) immer H also zählt er immer 0,01 dazu. Wenn Du dann noch den digitalRead(button_up) drückst zählt er immer 0,01 weg.

Ander symptome sind möglich wegen des Tastaturprellens.

Wartezeiten von 2,5 Sekunden sind zu lange; da mußt Du zu lange warten bis etwas passiert.

Was soll das Programm machen? Wenn Du 10 Minuten den Enter und den UP-Knopf drückst dann zählt er um 1 hoch?

Grüße Uwe

Hi Uwe,

wie soll mein code aussehen damit es inkrementiert(button_up) und dekrementiert(button_dwn)?
Vielen dank.

Im primitivsten Fall kannst du deine Abfrage nach High oder Low einfach umdrehen.

Ich habe HIGH mit LOW geändert. zählt aber nur bis 0.01 dann zählt wieder -0.01,-0.02.....

Hast du auch wirklich beim Subtrahieren das High und Low getauscht?

ja das habe ich auch......

Hier mal mein Code, getestet auf dem Arduino Duemilanove:

const int button_up = 4;            // Hier habe ich andere Pins genutzt
const int button_enter = 3;
const int buttonPin_dwn = 2;
float i = 0.0;

float wpreis() {
  if(digitalRead(button_enter)==LOW) {                        // Enter-Taste muss gedrueckt sein, um Werte einzustellen
    while (digitalRead(button_up)== LOW) {                  // Abfrage fuer Tastendruck bei PullUps
      i= i + 0.01;                                                           // erst addieren
      delay(500);                                                          // dann Pause, zum Testen lieber nicht so lang wie vorher
      Serial.println(i);                                                   // Ausgabe  
    }
    while (digitalRead(buttonPin_dwn)== LOW) {           // analog zu oben...
      i= i - 0.01;
      delay(500);
      Serial.println(i);
    }
  }  
  return i;
}

void setup() {
  pinMode(button_up, INPUT);
  pinMode(button_enter, INPUT);
  pinMode(buttonPin_dwn, INPUT);
  digitalWrite (button_up, HIGH);                // aktiviert den internen PullUp, spart Bauteile
  digitalWrite (button_enter, HIGH);
  digitalWrite (buttonPin_dwn, HIGH);
  Serial.begin(9600);
}

void loop() {
  wpreis();
}

Getestet und für gut befunden...

Danke für Code.
Es hat aber bei mir net funktioniert. ich verwende ein Arduino Mega 2560.

Hallo,
ich habe auch immer mal so ein Problem, und errinnere mich dan daran das ich vergessen hatte den Input default auf High, kann das der Fehler sein?

pinMode(button_enter, INPUT);
pinMode(buttonPin_dwn, INPUT);
digitalWrite (button_up, HIGH);
digitalWrite (button_enter, HIGH);
digitalWrite (buttonPin_dwn, HIGH);

Viele Grüße

Sofern du externe PullUps verwendest, musst du natürlich nicht die internen aktivieren. Klingt schlüssig, oder? :wink:

ICH hab auch nur mit externe pullup probiert...der zählt von alleine auch ohne den tastern zu drücken.
ich will aber wenn ich auf button_up drücke-->ikrementiert z.b. 0.01, 0.02, 0.03, 0.04.
wenn ich auf button_dwn drücke-->dekrementiert z.b. 0.04, 0.03, 0.02, 0.01.
Grüß.

brauche eure Idees...freue mich auf Feedback

Und welche Funktion hat dann der dritte Taster?
Grüße Uwe

Hi Uwe,

der dritte taste ist für enter-->z.b wenn man auf button_enter drückt, nimmt die funktion das letzte zahl.
z.b.: button_up einmal gedrckt:0.01--zweite mal gedrückt:0.02....
button_dwn einmal gedrückt:0.02--zweite mal:0.01....
button_enter nimt dann die 0.01 z.b.
Ich hab den ganzen tag an den Programm gebastelt, kriege aber die richtige funktion nicht.

Grüß

Also ich habe deinen Code als "Vorbild", also eher als Grundlage genommen, verwende also die gleichen Variablen, hab nur die Pinnummern an den Duemilanove angepasst und auf die LCD-Ausgabe verzichtet. Und hier funktioniert der Code, ohne dass automatisch gezählt wird. Automatische Tastendrücke haben meist ihre Ursache in falschen Beschaltungen, wie ich anfangs schon vermutete...
Aber wie gesagt, mein Code basiert auf deinem, daher funktioniert das mit der Enter-Taste anders, als du dir das vorstellst. Das habe ich in der Dokumentation zum Code auch deutlich gemacht: Eine Änderung der Werte +/- kann man nur vornehmen, wenn die Enter-Taste dabei gehalten wird.
Die Idee, dass die Werte bei Enter-Druck übernommen erden, ist einfach umzusetzen: Abfrage der Enter-Taste aus der Funktion rausnehmen, i direkt inkrementieren/dekrementieren. Bei Enter wird einfach wird in der loop einer neuen Variable (z.B. j) das i zugewiesen. Nun kann man zwar weiter i ändern, aber erst nach Enter wird der Wert übernommen.

Um Fehler auszuschließen, könntest du mal ein paar aussagefähige Fotos der Beschaltung zeigen, dass wir hier nicht im Trüben fischen.

tahakora:
der dritte taste ist für enter-->z.b wenn man auf button_enter drückt, nimmt die funktion das letzte zahl.
z.b.: button_up einmal gedrckt:0.01--zweite mal gedrückt:0.02....
button_dwn einmal gedrückt:0.02--zweite mal:0.01....
button_enter nimt dann die 0.01 z.b.
...

Das Programm macht aber ganz was anderes.

float wpreis()
{  
  if(digitalRead(button_enter)==LOW){    
  while (digitalRead(button_up)== HIGH)
     {   
     delay(2500);
     lcd.setCursor(4,1);
     lcd.print(i);
     Serial.println(i);
     i= i+0.01;  
     }  
  while (digitalRead(buttonPin_dwn)== HIGH)
     {   
     delay(2500);
     lcd.setCursor(4,1);
     lcd.print(i);
     Serial.println(i);
     i= i-0.01;
     }
 }
   return i;
}

Das obrige programm funktioniert folgendermaßen:
Damit überhaupt etwas gezählt wird muß der Enter-Taster kurz gedrückt werden.
Dann solange UP oder DOWN nicht gedrückt werden zählt es aufwärts, alle 2,5 Sekunden um 0,01. Wenn UP gedrückt wird dann zählt es herunter solange bis DOWN gedrückt wird.
Dann beginnt alles von vorne.

Damit das Programmm das macht was Du sagst:

button_up einmal gedrckt:0.01--zweite mal gedrückt:0.02....
button_dwn einmal gedrückt:0.02--zweite mal:0.01....
button_enter nimt dann die 0.01 z.b.

Mußt Du:

  1. die Kontakte entprellen.
  2. auf die fallende Flanke von UP bzw DOWN( H nach L) reagieren und um 0,01 inkrementieren bzw dekrementieren.
  3. bei Enter die Funktion die ausgeführt werden soll starten.

Grüße Uwe