Drehgeber-Abfrage mit Drehgeschwindigkeits-Erkennung

Hallo,

okay, ein Bsp. LED aufleuchten ohne delay zeige ich dir noch. Wenn du das grundlegende Prinzip an Hand der gut erklärenden Links einmal verstanden hast, ist alles weitere einfach. Es gibt leider immer den Zusammenhang, je schneller ein Programm auf irgendwas reagieren soll mit anderen Zeitabläufen zusammen, umso unfangreicher wird das Programm selbst.

Wenn das Vorhaben größere Dimensionen annimmt mache ich mir einen Ablaufplan. Wenn der detailliert genug ist, ist es leichter das in Code umzusetzen. Man gewinnt mehr Überblick.

so, musst nur wieder deine Pins anpassen!

/*
  Doc Arduino - german Arduino Forum
  IDE 1.8.5
  Arduino Mega2560
  06.11.2017
  
  mit Klassen-Vererbung  http://forum.arduino.cc/index.php?topic=444899
  
  Info >>> https://www.mikrocontroller.net/articles/Drehgeber
       >>> https://www.mikrocontroller.net/topic/drehgeber-auslesen
  
  Board Pinouts   >>>  http://www.pighixxx.com/test/pinoutspg/boards/
  Pinout Uno      >>>  http://www.pighixxx.com/test/portfolio-items/uno/?portfolioID=314
  Pinout Mega2560 >>>  http://www.pighixxx.com/test/portfolio-items/mega/?portfolioID=314
*/


#include <GrayEncoder_v2.h>

// GrayEncoder_v2 Encoder1 (&PINH, 5, 6);  // Pin 8,9 > Port.H, Bit 5 und 6
ALPS_Encoder   Encoder1 (&PINH, 5, 6);  // Pin 8,9 > Port.H, Bit 5 und 6
int Encoder1_Direction;
int Encoder1_Counter;

const byte Taster_Pin = 4;    // Taster am Drehencoder
const byte LED_13 = 13;       // einfache Richtungsanzeige L/R >> ein/aus

const byte LED_L = 32;
const byte LED_R = 33;

void setup() {
  Serial.begin(9600);
  
  pinMode(8, INPUT_PULLUP);     // Encoder Phase A
  pinMode(9, INPUT_PULLUP);     // Encoder Phase B
  pinMode(Taster_Pin, INPUT_PULLUP);
  pinMode(LED_13, OUTPUT);
  pinMode(LED_L, OUTPUT);
  pinMode(LED_R, OUTPUT); 
  
}

void loop() {

  update_Encoder();

  update_Taster();
  
  if ( Encoder1.getDirection() > 0 ) {
    digitalWrite(LED_13, HIGH);
  }  
  else {
    digitalWrite(LED_13, LOW);
  }

  Richtungsauswertung();
  
  serieller_Monitor();

}


// ****** Funktionen ******
void Richtungsauswertung ()
{
  static char last_direction = 0;
  static bool rechts = false;
  static bool links = false;
  static unsigned long R_Einschaltzeitpunkt = 0;
  static unsigned long L_Einschaltzeitpunkt = 0;
  const unsigned int dauer = 400;
  
  if (Encoder1_Direction != last_direction) {   // neue Richtung verschieden zur alten?
    if (Encoder1_Direction > 0) {               // auswerten und entsprechend setzen
      rechts = true;
      links = false;
      digitalWrite(LED_R, HIGH);
      digitalWrite(LED_L, LOW);
      R_Einschaltzeitpunkt = millis();          // und LED Einschaltzeitpunkt merken
    }
    else {
      links = true;
      rechts = false;
      digitalWrite(LED_L, HIGH);
      digitalWrite(LED_R, LOW);
      L_Einschaltzeitpunkt = millis();
    }  
    last_direction = Encoder1_Direction;        // neue Richtung merken
  }

  if (rechts == true && (millis() > R_Einschaltzeitpunkt+dauer) ) {  // LED verzögert ausschalten
    digitalWrite(LED_R, LOW);
    rechts = false;
  }
  if (links == true && (millis() > L_Einschaltzeitpunkt+dauer) ) {
    digitalWrite(LED_L, LOW);
    links = false;
  }  
}


void update_Encoder ()
{  
  Encoder1.encode(); 
  Encoder1_Direction = Encoder1.getDirection(); 
  Encoder1_Counter   = Encoder1.getCounter();
}


void update_Taster ()
{
  if ( digitalRead(Taster_Pin) == LOW ) {
    Encoder1.setCounter(333);
  }  
}

void serieller_Monitor ()
{
  static unsigned int intervall = 500;
  static unsigned long last_ms = 0;

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


void Ueberschriftszeile ()
{
  static int counter = 33;

  counter++;
  
  if (counter<20) return; // Zeit noch nicht erreicht, Funktion abbrechen
  
  counter = 0; 
  Serial.print(F("DIR")); Serial.print('\t');
  Serial.print(F("COUNT")); Serial.print('\t');
  Serial.println();
}