Hallo hochgeschätzte Community,
ich versuche meinen Drehgeber-Sketch dahingehend zu verfeinern, dass es nicht nur die Drehrichtung erkennt, sondern auch noch die Drehgeschwindigkeit ausliest.
Konkret arbeitet angehängter Sketch so, dass abhängig von der Drehrichtung einmal die gelbe (Pin 8 ) und einmal die rote LED (Pin 9) aufblitzt.
Nun möchte ich gerne realisieren, dass bei normaler Drehgeschwindigkeit eben die eben genannten LEDs weiterhin aufblitzen, bei schneller Drehgeschwindigkeit jedoch zwei andere LEDs je nach Drehrichtung aufblinken (Pin 10 und 11).
Ich habe den ganzen Tag mit dem Intervall im Verhältnis zu millis rumprobiert, aber ich komme absolut nicht auf eine Lösung. Vielleicht habt Ihr einen Vorschlag oder auch ein paar ergänzende Codezeilen?
Vielen Dank im Voraus für Eure Hilfe.
VG Chris
struct rotary_t {byte pinA; byte pinB; byte state; int count;};
rotary_t encoder[]={
{4,5}, // Encoder1
{2,3}, // Encoder2
};
#define NUMENCODERS (sizeof(encoder)/sizeof(encoder[0]))
void beginEncoders()
{
for (int i=0; i<NUMENCODERS; i++)
{
pinMode(encoder[i].pinA, INPUT_PULLUP);
pinMode(encoder[i].pinB, INPUT_PULLUP);
readEncoder(i);
}
}
short readEncoder(byte i)
{
short result=0;
byte state=encoder[i].state;
state= state<<2 | (byte)digitalRead(encoder[i].pinA)<<1 | (byte)digitalRead(encoder[i].pinB);
state= state & 0xF;
if (state==0b0001 || state==0b0111 || state==0b1110 || state==0b1000) result= -1;
else if (state==0b0010 || state==0b1011 || state==0b1101 || state==0b0100) result= 1;
encoder[i].state= state;
return result;
}
void input()
{
for (int i=0; i<NUMENCODERS; i++)
{
encoder[i].count+= readEncoder(i);
}
}
void output()
{
#define INTERVAL_slow 10
static unsigned long lastOutput;
static int lastCount[NUMENCODERS];
if (millis()-lastOutput>=INTERVAL_slow)
{
lastOutput=millis();
boolean changed=false;
for (int i=0;i<NUMENCODERS;i++)
{
if (encoder[i].count!=lastCount[i])
{
changed=true;
}
}
if (changed)
{
for (int i=0;i<NUMENCODERS;i++)
{
if (lastCount[i]>encoder[i].count)
{
digitalWrite(i+7, HIGH);
delay(30);
digitalWrite(i+7, LOW);
lastCount[i]=encoder[i].count;
}
else if (lastCount[i]<encoder[i].count)
{
digitalWrite(i+8, HIGH);
delay(30);
digitalWrite(i+8, LOW);
lastCount[i]=encoder[i].count;
}
}
}
}
}
void setup() {
beginEncoders();
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop() {
input();
output();
}