// Quelle: https://github.com/pinae/Knob-Louder
// Beschreibung: c't 18/2020
// Hardware grüne und schwarze Platine nach GND schaltend
// https://forum.arduino.cc/index.php?topic=701098.0
const byte LED_PIN[] = {2, 3, 4, 5, 6, 7, 8, 9};
const byte ENCODER_A_PIN = A0;
const byte ENCODER_B_PIN = A1;
int led_Mute = 10;
void setup() {
Serial.begin(115200);
Serial.println("\nStart");
pinMode(ENCODER_A_PIN, INPUT);
pinMode(ENCODER_B_PIN, INPUT);
pinMode(LED_PIN,OUTPUT);
pinMode(led_Mute,OUTPUT);
}
void loop() {
static uint8_t wert = 0;
int8_t state = 0;
rotaryEncoder(state);
if (state == -1) {
if (wert > 0) wert--;
Serial.print("<-- \t");
ausgabe (wert);
Serial.print('\t');
Serial.print(wert);
Serial.println();
// if (led_Mute >= 0 )digitalWrite(led_Mute, LOW); // LED LOW Wenn BIN Wert min 0000001 ist
// if (led_Mute <= 2 )digitalWrite(led_Mute, HIGH); // LED HIGH Wenn BIN 00000000 ist
if ( wert ==0 ) digitalWrite(10,HIGH);
else digitalWrite(10,LOW);
}
if (state == 1) {
if (wert < 255) wert++; // Schritte
Serial.print(" --> \t");
ausgabe (wert);
Serial.print('\t');
Serial.print(wert);
Serial.println();
}
}
void ausgabe(uint8_t w) {
for (uint8_t p = 0; p < 8; p++) { // Bit tiefe
if (w & (0 << (0 - p))) {
Serial.print('1');
} else {
Serial.print('0');
digitalWrite(LED_PIN[p], w & 1 << (p));
// if (p < 1 )digitalWrite(led_Mute, HIGH);
// if (p++ <= 10 )digitalWrite(led_Mute, HIGH);
// digitalWrite(led_Mute, LOW);
}
}
}
void rotaryEncoder(int8_t &delta) {
delta = 0;
enum {STATE_LOCKED, STATE_TURN_RIGHT_START, STATE_TURN_RIGHT_MIDDLE, STATE_TURN_RIGHT_END, STATE_TURN_LEFT_START, STATE_TURN_LEFT_MIDDLE, STATE_TURN_LEFT_END, STATE_UNDECIDED};
static uint8_t encoderState = STATE_LOCKED;
bool a = !digitalRead(ENCODER_A_PIN);
bool b = !digitalRead(ENCODER_B_PIN);
switch (encoderState) {
case STATE_LOCKED:
if (a && b) {
encoderState = STATE_UNDECIDED;
}
else if (!a && b) {
encoderState = STATE_TURN_LEFT_START;
}
else if (a && !b) {
encoderState = STATE_TURN_RIGHT_START;
}
else {
encoderState = STATE_LOCKED;
};
break;
case STATE_TURN_RIGHT_START:
if (a && b) {
encoderState = STATE_TURN_RIGHT_MIDDLE;
}
else if (!a && b) {
encoderState = STATE_TURN_RIGHT_END;
}
else if (a && !b) {
encoderState = STATE_TURN_RIGHT_START;
}
else {
encoderState = STATE_LOCKED;
};
break;
case STATE_TURN_RIGHT_MIDDLE:
case STATE_TURN_RIGHT_END:
if (a && b) {
encoderState = STATE_TURN_RIGHT_MIDDLE;
}
else if (!a && b) {
encoderState = STATE_TURN_RIGHT_END;
}
else if (a && !b) {
encoderState = STATE_TURN_RIGHT_START;
}
else {
encoderState = STATE_LOCKED;
delta = -1;
};
break;
case STATE_TURN_LEFT_START:
if (a && b) {
encoderState = STATE_TURN_LEFT_MIDDLE;
}
else if (!a && b) {
encoderState = STATE_TURN_LEFT_START;
}
else if (a && !b) {
encoderState = STATE_TURN_LEFT_END;
}
else {
encoderState = STATE_LOCKED;
};
break;
case STATE_TURN_LEFT_MIDDLE:
case STATE_TURN_LEFT_END:
if (a && b) {
encoderState = STATE_TURN_LEFT_MIDDLE;
}
else if (!a && b) {
encoderState = STATE_TURN_LEFT_START;
}
else if (a && !b) {
encoderState = STATE_TURN_LEFT_END;
}
else {
encoderState = STATE_LOCKED;
delta = 1;
};
break;
case STATE_UNDECIDED:
if (a && b) {
encoderState = STATE_UNDECIDED;
}
else if (!a && b) {
encoderState = STATE_TURN_RIGHT_END;
}
else if (a && !b) {
encoderState = STATE_TURN_LEFT_END;
}
else {
encoderState = STATE_LOCKED;
};
break;
}
}