// Beschreibung 4 Relais in Binär hochzaehlend NICHT Fertig // Alles Stabil nur läuft es beim Start durch die Relais hoch. Und bei mir nicht zurück auf kleinere Werte 6.11.26 const int ANALOG_IN_PIN = A0; // Dein Eingang (0-5V) const int OUT_1 = 2; // Relais 1 (LSB) const int OUT_2 = 3; // Relais 2 const int OUT_3 = 4; // Relais 3 const int OUT_4 = 5; // Relais 4 (MSB) // Konfiguration für den Mittelwertfilter const int FILTER_SAMPLES = 20; // Anzahl der Messungen, die gemittelt werden int messwerte[FILTER_SAMPLES]; // Das Ringpuffer-Array für die Messungen int leseIndex = 0; // Der aktuelle Index im Array long messwertSumme = 0; // Laufende Summe der Messwerte // Variablen für die Hysterese-Steuerung int aktuelleStufe = 0; const int HYSTERESE = 15; // Toleranzbereich (ca. 0,07V). Bei Bedarf erhöhen. void setup() { pinMode(OUT_1, OUTPUT); pinMode(OUT_2, OUTPUT); pinMode(OUT_3, OUTPUT); pinMode(OUT_4, OUTPUT); // Das Array initial mit Nullen füllen for (int i = 0; i < FILTER_SAMPLES; i++) { messwerte[i] = 0; } } void loop() { // 1. GLEITENDER MITTELWERTFILER (Moving Average) // Subtrahiere den ältesten Messwert von der Summe messwertSumme = messwertSumme - messwerte[leseIndex]; // Lies den aktuellen Wert vom Pin ein messwerte[leseIndex] = analogRead(ANALOG_IN_PIN); // Addiere den neuen Wert zur Summe messwertSumme = messwertSumme + messwerte[leseIndex]; // Index für den nächsten Durchlauf weiterschalten leseIndex = leseIndex + 1; if (leseIndex >= FILTER_SAMPLES) { leseIndex = 0; // Zurück zum Anfang (Ringpuffer) } // Berechne den aktuellen, perfekt geglätteten Durchschnittswert int geglaetteterWert = messwertSumme / FILTER_SAMPLES; // 2. STUFEN-BERECHNUNG // Wir ermitteln die theoretische Zielstufe (0-15) basierend auf dem sauberen Signal int zielStufe = map(geglaetteterWert, 0, 1023, 0, 15); // 3. HYSTERESE-LOGIK (Verhindert das Flattern an den Grenzen) if (zielStufe != aktuelleStufe) { // Ein Schritt entspricht 1024 / 16 = 64 Einheiten int schwellenWert = zielStufe * 64; // Nur umschalten, wenn das Signal das Totband (HYSTERESE) überschritten hat if (zielStufe > aktuelleStufe && geglaetteterWert > (schwellenWert + HYSTERESE)) { aktuelleStufe = zielStufe; } else if (zielStufe < aktuelleStufe && geglaetteterWert < (schwellenWert - HYSTERESE)) { aktuelleStufe = zielStufe; } } // 4. PARALLELE AUSGABE AN DIE RELAIS digitalWrite(OUT_1, bitRead(aktuelleStufe, 0)); digitalWrite(OUT_2, bitRead(aktuelleStufe, 1)); digitalWrite(OUT_3, bitRead(aktuelleStufe, 2)); digitalWrite(OUT_4, bitRead(aktuelleStufe, 3)); delay(5); // Sehr kurze Pause (Filter füllt sich alle 100ms komplett neu) }