Drehgeber-Abfrage mit Drehgeschwindigkeits-Erkennung

Hallo Doc Arduino,

ja habs gemerkt, vielen Dank :slight_smile:

Dein letzter Sketch von gestern erkennt zwar elegant die Richtungsänderung und steuert dementsprechend auch die jeweilige LED an, aber ich möchte ja für jeden Detent ein kurzes LED-Aufblitzen haben, quasi als optische Visualisierung des Detents.

Deinen Sketch hab ich dahingehend modifiziert, was auch prima funktioniert. Die millis-Abfrage habe ich verstanden und somit gibt es auch keine ungewünschten "Fremdblitze" wie bei delay() mehr!

Gleichzeitig habe ich versucht, den Counterwert der Encoderabfrage nur in einem festen Zeitraum zu bekommen und mittels der Differenz aus Zeitraum und ermitteltem Counterwerts die EncoderSpeed zu ermitteln, um damit eben schnell und langsam für die Weiterverarbeitung zu identifizieren. Das klappt leider gar nicht, weil ich wie gesagt nicht genau weiß, wo diese Abfrage stattfinden muss. Er soll ja solange in dem Zeitraum von sagen wir mal 250ms den Counter zählen, bis der Zeitraum abgelaufen ist. Dann soll er das Verhältnis zur Zeit berechnen, weitergeben, und dann geht das Ganze von vorne los. Kann ja eigentlich nur unter update_Encoder stattfinden, oder?

Viele Grüße

Chris

/*
Doc Arduino - german Arduino Forum
IDE 1.8.5
Arduino Mega2560
05.11.2017

mit Klassen-Vererbung andere Lib - darf Klassenname gleich bleiben? - Deutsch - Arduino Forum

Board Pinouts >>> http://www.pighixxx.com/test/pinoutspg/boards/
*/

#include <GrayEncoder_v2.h>

GrayEncoder_v2 Encoder1 (&PIND, 0, 1); // Pin 2,3 > Port.D "Bit 0","Bit 1"

int Encoder1_Direction;
int Encoder1_CurrentCounter;
int Encoder1_PreviousCounter;
int Encoder1_Speed;

static unsigned long Einschaltzeitpunkt = 0;
const unsigned int Dauer = 10;
const unsigned int Messzeit = 250;
const byte LED_Pin1 = 6;
const byte LED_Pin2 = 7;

void setup() {

Serial.begin(9600);

pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(LED_Pin1, OUTPUT);
pinMode(LED_Pin2, OUTPUT);
}

void loop() {

update_Encoder();

if (Encoder1_CurrentCounter > Encoder1_PreviousCounter) {
Encoder1_PreviousCounter = Encoder1_CurrentCounter;
digitalWrite(LED_Pin1, HIGH);
digitalWrite(LED_Pin2, LOW);
Einschaltzeitpunkt = millis();
}

else if (Encoder1_CurrentCounter < Encoder1_PreviousCounter) {
Encoder1_PreviousCounter = Encoder1_CurrentCounter;
digitalWrite(LED_Pin2, HIGH);
digitalWrite(LED_Pin1, LOW);
Einschaltzeitpunkt = millis();
}

if (millis() > Einschaltzeitpunkt + Dauer) {
digitalWrite(LED_Pin1, LOW);
digitalWrite(LED_Pin2, LOW);
}

serieller_Monitor();

}

void update_Encoder() {

Encoder1.encode();
Encoder1_Direction = Encoder1.getDirection();
Encoder1_CurrentCounter = Encoder1.getCounter();
}

void serieller_Monitor() {

static unsigned int intervall = 250;
static unsigned long prevMillis = 0;

Serial.print(Encoder1_Direction); Serial.print('\t');
Serial.print(Encoder1_CurrentCounter); Serial.print('\t');
Serial.print(Encoder1_PreviousCounter);
Serial.println();
}