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();
}