#include <Encoder.h>// Library für den RotaryEncoder
// Initialisierung benötigter Variablen
int Pin_clk_Letzter;// letzter Status des clk-Pins
int Pin_clk_Aktuell;// aktueller Status des clk-Pins
// Definition der Eingangs-Pins
int pin_clk = 8;// Uhrzeigersinn
int pin_dt = 7;// GegenUhrzeigersinn
int button_pin = 3;// Interruptfähiger Pin
long encMillis;// Mindest-Zeitablauf für Encoder-Kontakte entprellen
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time;
void setup()
{
// Eingangs-Pins werden initialisiert...
pinMode (pin_clk,INPUT);
pinMode (pin_dt,INPUT);
pinMode (button_pin,INPUT);
// ...und deren Pull-Up Widerstände aktivieren
digitalWrite(pin_clk, true);
digitalWrite(pin_dt, true);
// Drucktaste des Encoders initialisieren
digitalWrite(button_pin, INPUT_PULLUP);
// Drucktaste dem Interrupt-Pin Zuweisen
attachInterrupt(digitalPinToInterrupt(button_pin), interrupt_call, CHANGE);
Pin_clk_Letzter = digitalRead(pin_clk);// Initialisierendes Auslesen des Pin_CLK
encMillis = millis();// Entprellzeit initianlisieren
}
void loop()
{
// // Auslesen des aktuellen Statuses
Pin_clk_Aktuell = digitalRead(pin_clk);
// // Überprüfung auf Änderung
if (Pin_clk_Aktuell != Pin_clk_Letzter)
// Pin_CLK hat sich zuerst verändert, also rechtsdrehend
{
if (digitalRead(pin_dt) != Pin_clk_Aktuell)
{
if (millis() - encMillis >= 100)// Schutzphase zum Entprellen prüfen
{
//
//
// Code-Block für die Auswertung und weitere Verarbeitung
// der Rechtsdrehung (Uhrzeigersinn) des Drehimpulsgebers.
// ....
//
encMillis = millis();// Ende der Entprellzeit
}
}
else
// Andernfalls hat sich Pin_DT zuerst verändert, also linksdrehend
{
if (millis() - encMillis >= 100)// Schutzphase zum Entprellen prüfen
{
//
//
// Code-Block für die Auswertung und weitere Verarbeitung
// der Linksdrehung (GegenUhrzeigersinn) des Drehimpulsgebers.
// ....
//
encMillis = millis();// Ende der Entprellzeit
}
}
// Vorbereitung für den nächsten Druchlauf:
// Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert
Pin_clk_Letzter = Pin_clk_Aktuell;
}
}
void interrupt_call()// Interruptaufruf incl. entprellen der Encoder-Drucktaste
{
interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 250)// Interruptimpuls ignorieren, der früher als 250 ms erfolgt
{
//
// Befehlsfolge, die vom Interrupt ausgelöst werden soll
// ....
//
}
last_interrupt_time = interrupt_time;
}