Schöne Idee, eventuell so?
void ausgabe(uint8_t w) {
uint8_t p = 0x80;
while (p > 0) {
if (w & p) {
Serial.print('1');
} else {
Serial.print('0');
}
p = p >> 1;
}
}
Unter Berücksichtigung der LED-Pins auch so:
void ausgabe(uint8_t w) {
uint8_t p = 0x80;
for (const byte lp : LED_PIN) {
if (w & p) {
Serial.print('1');
digitalWrite(lp, HIGH);
} else {
Serial.print('0');
digitalWrite(lp, LOW);
}
p = p >> 1;
}
}
Im Zusammenhang:
// Quelle: https://github.com/pinae/Knob-Louder
// Beschreibung: c't 18/2020
const byte LED_PIN[] = {2, 3, 4, 5, 6, 7, 8, 9};
const byte ENCODER_A_PIN = A0;
const byte ENCODER_B_PIN = A1;
void setup() {
Serial.begin(115200);
Serial.println("\nStart");
pinMode(ENCODER_A_PIN, INPUT);
pinMode(ENCODER_B_PIN, INPUT);
for (const byte lp : LED_PIN) pinMode(lp, OUTPUT);
}
void loop() {
static uint8_t wert = 127;
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 (state == 1) {
if (wert < 255) wert++;
Serial.print(" --> \t");
ausgabe (wert);
Serial.print('\t');
Serial.print(wert);
Serial.println();
}
}
void ausgabe(uint8_t w) {
uint8_t p = 0x80;
for (const byte lp : LED_PIN) {
if (w & p) {
Serial.print('1');
digitalWrite(lp, HIGH);
} else {
Serial.print('0');
digitalWrite(lp, LOW);
}
p = p >> 1;
}
}
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;
}
}