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
Rotary Encoder: schneller drehen > Wert mehr verändern
17.02.2015, 18:10 (Dieser Beitrag wurde zuletzt bearbeitet: 17.02.2015 18:11 von Foto-Ralf.)
Beitrag #1
Rotary Encoder: schneller drehen > Wert mehr verändern
Hallo,

folgendes Problem:
Einstellung eines int-Wertes mit einem Rotary-Encoder. Da der Wert zwischen 1 und 9999 liegen soll würde man sich ja bis zum anderen Ende der Skala den Wolf drehen... Daher möchte ich bei langsamem drehen in Einerschritten, bei schnellerem drehen in 10er-Schritten, bei noch schnellerem drehen in 100er-Schritten und bei ganz schnellem drehen in 250er-Schritten hochzählen.

Dieser Code funktioniert, zählt (logischerweise) aber nur in Einerschritten:
Code:
// Interrupt on A changing state
void doEncoderA(){
// debounce
if ( rotating ) delay (1);  // wait a little until the bouncing is done

// Test transition, did things really change?
if( digitalRead(rotary_encoder_Pin1) != A_set ) {  // debounce once more
A_set = !A_set;

// adjust counter + if A leads B
if ( A_set && !B_set ) {
    encoderValue1 --;
}
rotating = false;  // no more debouncing until loop() hits again
}
}

// Interrupt on B changing state, same as A above
void doEncoderB(){
if ( rotating ) delay (1);
if( digitalRead(rotary_encoder_Pin2) != B_set ) {
B_set = !B_set;
//  adjust counter - 1 if B leads A
if( B_set && !A_set ){
    encoderValue1 ++;
}
rotating = false;
}
}

Ich habe den Code jetzt so modifiziert:
Code:
// Interrupt on A changing state
void doEncoderA(){
// debounce
if ( rotating ) delay (1);  // wait a little until the bouncing is done

// Test transition, did things really change?
if( digitalRead(rotary_encoder_Pin1) != A_set ) {  // debounce once more
A_set = !A_set;

// adjust counter + if A leads B
if ( A_set && !B_set ) {
now = millis();
tdiff = now - last_turn;
encoderValue1 --;
if (tdiff < (rotary_fast/40))
speed = 250;// bei superschnellem drehen
else if (tdiff < (rotary_fast/10))
speed = 100;// bei ganz schnellem drehen
else if (tdiff < (rotary_fast))
speed = 10;// bei schnellem drehen
else
speed = 1;// bei normalem drehen

last_turn = now;// Zeit speichern fuer das naechste Mal
}
rotating = false;  // no more debouncing until loop() hits again
}
}

// Interrupt on B changing state, same as A above
void doEncoderB(){
if ( rotating ) delay (1);
if( digitalRead(rotary_encoder_Pin2) != B_set ) {
B_set = !B_set;
//  adjust counter - 1 if B leads A
if( B_set && !A_set ){
now = millis();
tdiff = now - last_turn;
encoderValue1 ++;// Inkrementieren; ergibt je Raste 1 Inkrement
if (tdiff < (rotary_fast/40))
speed = 250;// bei superschnellem drehen
else if (tdiff < (rotary_fast/10))
speed = 100;// bei ganz schnellem drehen
else if (tdiff < (rotary_fast))
speed = 10;// bei schnellem drehen
else
speed = 1;// bei normalem drehen

last_turn = now;// Zeit speichern fuer das naechste Mal
}
rotating = false;
}
}

Die Variablen sind als globale Variablen definiert, den (hochzuzählenden) int-Wert berechne ich (je nach Drehrichtung) mit Wert+speed bzw. Wert-speed.

Leider bekomme ich keine reproduzierbaren Ergebnisse. Manchmal kann ich in Einerschritten den Wert verändern, meisstens verändert er sich aber um 250. Die Veränderung der fix eingestellten Variablen rotary_fast bringt keine Veränderung.

Hat mir jemand einen Tipp was ich falsch mache?
Gerne auch einen "anderen" Code der das gewünschte kann.

Danke und Gruss
Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.02.2015, 18:22
Beitrag #2
RE: Rotary Encoder: schneller drehen > Wert mehr verändern
Hallo Ralf,

ich habe mir den Code nicht angeschaut und deshalb auch keine Lösung für einen Umbau.

Vor langer Zeit hatte ich aber für einen PIC-Controller mal was ähnliches gemacht.
Damals hatte ich das Eingabemenue so geschrieben dass ich jede Dezimalstelle mit dem Rotary-Encoder + dessen Drucktaste einzeln anwählen konnte und einzeln verstellen konnte.
Das geht dann recht fix und üblicherweise macht man das auch so.
Stell dir vor, der Wertebereich wäre fünf- oder sechstellig. Undecided

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.02.2015, 22:51
Beitrag #3
RE: Rotary Encoder: schneller drehen > Wert mehr verändern
Hallo Arne,

ja die von Dir vorgeschlagene Variante hat auch was :-)

In diesem speziellen Fall möchte ich aber doch bei der "Schnell-Dreh-Variante" bleiben, da das Bedienkonzept seither schon so war und ich da jetzt nix neues einführen möchte.

Vielleicht hat ja noch jemand einen Tipp.


Danke und Gruss
Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.02.2015, 22:28
Beitrag #4
RE: Rotary Encoder: schneller drehen > Wert mehr verändern
Hi,
ich habe mich jetzt nicht wirklich ins Coding reingelesen, aber hast Du mal einen Sketch geschrieben, der Dir einfach nur die Geschwindigkeit anzeigt? Darauf könnte man dann 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
27.02.2015, 22:22
Beitrag #5
RE: Rotary Encoder: schneller drehen > Wert mehr verändern
Hallo Ralf, bist du schon weitergekommen?
Ich hätte auch Interesse, vielleicht können wir zusammen mal schauen?

Grüße Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.02.2015, 23:36
Beitrag #6
RE: Rotary Encoder: schneller drehen > Wert mehr verändern
Hallo Alex,

nein, ich hatte noch keine Zeit - es war immer was anderes was gerade "dringender" war...

Ich hoffe, ich komm' am Wochenende mal dazu.


Gruss Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.02.2015, 09:42
Beitrag #7
RE: Rotary Encoder: schneller drehen > Wert mehr verändern
Hallo Ralf, ich hoffe heute kommen die Drehregler per Post und ich kann mich mal daran probieren,
Erst einmal dass er normal funktioniert.

Ich Wunsch dir viel Erfolg!


Grüße Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.02.2015, 15:50 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2015 15:52 von HaWe.)
Beitrag #8
RE: Rotary Encoder: schneller drehen > Wert mehr verändern
als Tipp:
es könnte ähnlich funktionieren wie der Code mit der Button-Druck-Dauer:
Nur muss nicht geguckt werden, wie lange der Btn bereits gedrückt wurde als Bezugsgröße ("elaptime"), sondern wie hoch die Drehgeschwindigkeit ist.
Drehgeschwindigkeit= Änderung der Drehstellung pro zeiteinheit (also "loop-Dauer"),
daraus errechnet sich dann z.B. der increment-Wert (beim Button-Programm == finc) entsprechend:

dt=millis()-savtime;

rot_speed= abs(curr_deg - old_deg) / dt; // Drehgeschw. neu berechnen von loop zu loop
savtime=millis();
if (rot_speed) < irgendwas ) finc = 0.01;
else
if (rot_speed) < wasgroesseres ) finc = 0.1;
else
finc= 1.0; // oder was auch immer
delay(100);


vielleicht hilft das ja als Einstieg!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  encoder clemens5555 17 393 20.10.2016 15:48
Letzter Beitrag: hotsystems
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 981 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Mega: Hardware i2c bus speed (Wire.) verändern? HaWe 10 2.928 14.07.2016 20:09
Letzter Beitrag: Mathias
  LCD Menue mit u8glib und Encoder stefanch 1 361 04.06.2016 21:02
Letzter Beitrag: hotsystems
  Encoder auslesen Phil333 1 666 23.03.2016 21:40
Letzter Beitrag: hotsystems
  Drehgeber - Encoder - Wertebereich eingrenzen Nimes 3 474 14.03.2016 12:38
Letzter Beitrag: Nimes
  Bei Tastendruck ein Ausgang mehr dazu.... hannes77 2 986 07.03.2016 20:48
Letzter Beitrag: hannes77
  PWM schneller machen...? Maxi290997 6 492 01.02.2016 06:50
Letzter Beitrag: Binatone
  Rotary Encoder - Anschließen King2k7 10 1.149 18.01.2016 12:38
Letzter Beitrag: hotsystems
  Encoder s_fr 3 498 10.01.2016 19:41
Letzter Beitrag: hotsystems

Gehe zu:


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