// vim: fileencoding=utf-8: ts=4: sw=4: expandtab: #define POTI_PIN A0 // Potentiometer am analogen Pin A0 #define RELAIS_1 2 // Relais 1 an Digitalpin 2 #define RELAIS_2 3 // Relais 2 an Digitalpin 3 #define RELAIS_3 4 // Relais 3 an Digitalpin 4 #define NUM_POSITIONS (1+3) // AUS plus drei Positionen #define ADCSTEPS (1<<10) // 10 Bit ADC void switcher(uint16_t adc_in) { static uint8_t out = 0; static uint8_t corr = ADCSTEPS / NUM_POSITIONS / 8; adc_in = adc_in >= corr ? adc_in - corr : 0;// Obere und untere Stufe egalisieren uint8_t x = 4 * adc_in * NUM_POSITIONS / ADCSTEPS; uint8_t i = x / 4; // Positionen uint8_t f = x % 4; // Schwellen uint8_t dist = i >= out ? i - out : out - i;// Distanz zum letzten Wert if (dist > 0) { // Bei Änderungsmöglichkeit… if ((dist >= 2) // Weite Sprünge **IMMER** || ((i > out) && (f > 0)) // oder über Schwelle zum höheren Nachbarn… || ((i < out) && (f < 3))) // oder über Schwelle zum niedrigeren Nachbarn… out = i; } uint8_t pattern = out ? 1 << (out - 1) : 0; // Bitmap erstellen (000₂, 001₂, 010₂, 100₂) digitalWrite(RELAIS_1, pattern & 1 ? HIGH : LOW); digitalWrite(RELAIS_2, pattern & 2 ? HIGH : LOW); digitalWrite(RELAIS_3, pattern & 4 ? HIGH : LOW); } void setup() { pinMode(RELAIS_1, OUTPUT); pinMode(RELAIS_2, OUTPUT); pinMode(RELAIS_3, OUTPUT); // Alle Relais zu Beginn aus digitalWrite(RELAIS_1, LOW); digitalWrite(RELAIS_2, LOW); digitalWrite(RELAIS_3, LOW); } void loop() { switcher(analogRead(POTI_PIN)); }