INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
21.02.2015, 19:36
Beitrag #1
Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hallo,

Ich habe ein kleines Problem, ich möchte eine Variable in 0.01 Schritten erhöhen, Button1 kurz drücken Var=Var+0,01.
Wenn ich das mit einen Delay mache, ist es mühsam auf einen Wert von z.B. 5.25 zu kommen.
Also die Idee, kurz drücken + 0,01
Gedrückt halten soll es schneller erhöhen.
Im Prinzip geht das schnell erhöhen schon gut, ich halte den Button gedrückt und es zaehlt schnell hoch.
ABER das feine kurzes drücken klappt nicht ich bin da einfach zu langsam.

Jetzt kamen die Ideen, die Zeit zu messen und anhand derer zu ermitteln wie lange gedrückt wurde kurz oder lang.

Aber ich bräuchte einen Tipp wie ich das angehe, millis() ist klar aber ich bräuchte noch ein paar mehr Tipps, habe irgendwie eine Blockade.

Danke schön!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 20:42
Beitrag #2
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hi,
stelle mal das Coding hier ein, das Du bisher hast (das mit dem schnell erhöhen). Darauf kann man bestimmt aufbauen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 21:18
Beitrag #3
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Also Thorsten,

Ich habe null Code, dass ist der Standard Button down Code, dadurch das ich nicht entprelle oder ein Delay drin habe wird durch die Trägheit einfach schnell hoch gezählt.
Also nix smartes :-(
Ich habe noch nicht einmal einen Programmablaufplan, weil ich bisher nicht verstehe wie ich es abfangen kann ob der Button losgelassen wurde oder noch gehalten wird, macht ja einen Unterschied...
Das wäre ja der erste Schritt und dann könnte man wenn das ginge noch die Zeit messen wie lange gehalten wurde und dann die Schritte vergrößern je länger gehalten wurde...

Aber wie gesagt, mir qualmt und schmerzt der Kopf und ich bin irgendwie blockiert.

Danke schön

Gruss Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 22:01
Beitrag #4
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hi,
Du hast doch das hier geschrieben:
Zitat:Im Prinzip geht das schnell erhöhen schon gut, ich halte den Button gedrückt und es zaehlt schnell hoch.
Kopiere doch einfach mal das Coding, das Du dafür verwendet hattest, hier rein.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 22:33
Beitrag #5
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hallo,

ich hatte da schon mal so was programmiert:
Code:
void lcdRequestLong_min_max(String request, long *parameter,  long min, long max) {                // Eingabe long min min / max Limitierung
            long time = millis ();                                                                // Variablen lokal definieren / initial setzen
            long tdiff = 0;                                                                        // Variablen lokal definieren / initial setzen
            lcd.setCursor(0,1);                                                                    // Spalte 0, Zeile 1
            lcd.print(request);                                                                    // Text auf LCD anzeigen
            long lastencval = encoderValue1;                                                    // Vorbelegung lokale Variable mit aktuellem Wert
            do {
                lcd.setCursor(12,1);                                                            // Spalte 12, Zeile 1
                if(*parameter <10) lcd.print(" ");                                                 // ein leerzeichen wenn Zahl kleiner 2-stellig
                if(*parameter <100) lcd.print(" ");                                             // ein leerzeichen wenn Zahl kleiner 3-stellig
                if(*parameter <1000) lcd.print(" ");                                             // ein leerzeichen wenn Zahl kleiner 4-stellig
                lcd.print(*parameter);                                                            // Text auf LCD anzeigen
// Tasteneingabe LCD Keypad
                if(read_LCD_buttons() == btnUP_LCD) {                                            // bei Taste "auf" Wert erhoehen
                    tdiff = millis() - time;                                                    // Zeit messen wie lange die Taste gedrueckt ist
                    if(tdiff < pressed_time_button_for_faster)                                    // wenn noch nicht lange gedrueckt
                        *parameter = *parameter + 1;                                            // um 1
                    else if(tdiff < pressed_time_button_for_faster*2)                            // wenn laenger gedrueckt...
                        *parameter = *parameter + 10;                                            // um 10
                    else if(tdiff < pressed_time_button_for_faster*3)                            // wenn noch laenger gedrueckt...
                        *parameter = *parameter + 100;                                            // um 100
                    else                                                                         // wenn noch laenger gedrueckt...
                        *parameter = *parameter + 1000;                                            // um 1000
                    if(*parameter > max)                                                        // max ueberwachen...
                        *parameter = max;                                                        // und begrenzen
                    delay (delaytime_debounce);                                                    // Inkrementieren takten
                }
                if(read_LCD_buttons() == btnDOWN_LCD) {                                            // bei Taste "ab" Wert verringern
                    tdiff = millis() - time;                                                    // Zeit messen wie lange die Taste gedrueckt ist
                    if(tdiff < pressed_time_button_for_faster)                                    // wenn noch nicht lange gedrueckt
                        *parameter = *parameter - 1;                                            // um 1
                    else if(tdiff < pressed_time_button_for_faster*2)                            // wenn laenger gedrueckt...
                        *parameter = *parameter - 10;                                            // um 10
                    else if(tdiff < pressed_time_button_for_faster*3)                            // wenn noch laenger gedrueckt...
                        *parameter = *parameter - 100;                                            // um 100
                    else                                                                         // wenn noch laenger gedrueckt...
                        *parameter = *parameter - 1000;                                            // um 1000
                    
                    if(*parameter < min)                                                        // min ueberwachen
                        *parameter = min;                                                        // und begrenzen
                    delay (delaytime_debounce);                                                    // Dekrementieren takten
                }
                if(read_LCD_buttons() == btnNONE_LCD) {
                    time = millis ();                                                            // Zeit fuer Taste lange gedrueckt speichern
                }
}

Schau mal, ob Du das verwenden kannst.
Ist mit einer Taste am Analogport programmiert, das müsstest Du auf Digital umprogrammieren.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 22:38 (Dieser Beitrag wurde zuletzt bearbeitet: 22.02.2015 11:15 von HaWe.)
Beitrag #6
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
hallo
da war ich etwas zu langsam Wink

hier ist mein Vorschlag:
(ich hoffe, die float Ausgabe funktioniert bei dir, ich verwende einen float-Patch dafür - mit Sketch 1.6.0 möglicherweise aber nicht mehr nötig)
Code:
#define ledpin  13
#define btnpin   8
#define btndn(r) (digitalRead(r)==HIGH)
#define btnup(r) (digitalRead(r)==LOW )
#define on(w)    (digitalWrite(w, HIGH))
#define off(w)   (digitalWrite(w, LOW) )


//================================================================================​=====
void setup() {
   Serial.begin(9600);
   pinMode(btnpin, INPUT);
   pinMode(ledpin, OUTPUT);

}
//================================================================================​=====


char btnstate=false;
uint32_t elaptime, savetime;

float fval=0,  finc=0.01;
char  sbuf[100];



//================================================================================​=====
void loop() {
  
  
   if(btndn(btnpin)) {
     on(ledpin);
     if(!btnstate) savetime=millis();
     btnstate=true;
     if (elaptime<=1000) {
       finc=0.01;         // noch nicht entprellt !!
       delay(200);
     }
     else
     if (elaptime<=2000) finc=0.1;
     else
     if (elaptime<=5000) finc=1;
     else finc=elaptime/500;
     elaptime=millis()-savetime;
     fval+=finc;
   }
   else {
     if(btnstate) {
       elaptime=0;
       off(ledpin);    
       btnstate=false;
       finc=0.01;
     }
    
   }
  
   sprintf(sbuf, "%10ld   inc=%-10.2f   val=%-10.2f", elaptime, finc, fval);
   Serial.println(sbuf);
   delay(20);
  
}
//================================================================================​=====
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.02.2015, 09:50
Beitrag #7
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hi,
das mit dem "float to string" sollte aber auch mit dtostrf gehen, oder? Das dürfte den Patch sparen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.02.2015, 10:16 (Dieser Beitrag wurde zuletzt bearbeitet: 22.02.2015 10:21 von HaWe.)
Beitrag #8
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
klar, ich wars nur so gewohnt. Ich verwende sprintf ganz automatisch gewohnheitsmäßig (genau wie printf oder fprintf oder auch scanf), weil es für mich sauberer und alles in einem Rutsch formatiert ist, mit einer belibigen Anzahl von Variablen und links oder rechtsbündig und miit Nullen aufgefüllt oder nicht und mit festen oder variablen Nachkommastellen - mir ist erst hinterher eingefallen, dass Sketch dafür einen patch braucht, aber da war das Programm schon fertig. Wer mag, kann die Ausgabezeile ja noch umschreiben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Tastereingang gegen mehrmaliges drücken sperren Haustechno 9 819 13.09.2016 17:47
Letzter Beitrag: garagenloeter
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 981 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Gewichteten Durchschnitt berechnen, 20 Werte in fortlaufender Variable speichern TimeMen 10 473 03.07.2016 09:00
Letzter Beitrag: Binatone
  Frage zu One Button in Kombination mit Fast LED Wolfgang_2801 3 241 26.06.2016 22:11
Letzter Beitrag: hotsystems
  2 Tasten drücken damit licht angeht tjard 11 552 19.06.2016 12:24
Letzter Beitrag: hotsystems
  Inhalt einer Variable mit per Virtual Wire versenden toto1975 17 1.770 26.03.2016 18:57
Letzter Beitrag: hotsystems
  Bei Tastendruck ein Ausgang mehr dazu.... hannes77 2 986 07.03.2016 20:48
Letzter Beitrag: hannes77
  Pin anhand Variable schalten ! b3ta 13 827 12.01.2016 08:30
Letzter Beitrag: b3ta
  Library - Variable in Memberfunktion Scheams 1 407 10.01.2016 22:40
Letzter Beitrag: Rene
  Jeffs 4-Way Button Code auf Arduino Leonardo? noxx 17 1.312 16.11.2015 20:30
Letzter Beitrag: noxx

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste