Drehgeber-Abfrage mit Drehgeschwindigkeits-Erkennung

Jo, die CUIs sind halt butterweich :slight_smile:

Ich habe deinen Gray-Sketch für den ProMicro modifiziert und noch die Blitzfunktion abhängig von der Drehrichtung integriert, aber noch keine Abhängigkeit von der Anzahl der Impulse in Relation zu einem festgelegten Zeitraum. Das muss ich erst durchdenken.

Das Ganze läuft wirklich sehr flüssig mit den optischen Encodern, insofern erstmal vielen Dank! Allerdings blitzt bei schneller Drehung auch ab und zu mal die LED der jeweils anderen Drehrichtung auf. Vielleicht "verschluckt" er bei zu schneller Drehung den Vergleich zwischen aktuellem und vorherigem Zählwert?

Viele Grüße

Chris

/*
  Doc Arduino - german Arduino Forum
  IDE 1.8.5
  Arduino Mega2560
  05.11.2017
  
  mit Klassen-Vererbung  http://forum.arduino.cc/index.php?topic=444899
  
  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;

const byte LED_Pin1 = 7;
const byte LED_Pin2 = 8;


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.getDirection() > 0 && Encoder1_CurrentCounter > Encoder1_PreviousCounter) {
    Encoder1_PreviousCounter = Encoder1_CurrentCounter;
    digitalWrite(LED_Pin1, HIGH);
    delay(20);
    digitalWrite(LED_Pin1, LOW);
  }
  
  else {
    if ( Encoder1.getDirection() < 0 && Encoder1_CurrentCounter < Encoder1_PreviousCounter ) {
    Encoder1_PreviousCounter = Encoder1_CurrentCounter;
    digitalWrite(LED_Pin2, HIGH);
    delay(20);
    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;

  if (millis()-prevMillis<intervall) return; // Zeit noch nicht erreicht, Funktion abbrechen
  
  prevMillis+=intervall; 
  Serial.print(Encoder1_Direction); Serial.print('\t');
  Serial.print(Encoder1_CurrentCounter); Serial.print('\t');
  Serial.print(Encoder1_PreviousCounter);
  Serial.println();
}