#include // 3stufen_intervallscheibenwischer_drehencoder_und_rgb-led // Fuer Arduino UNO Stand 09.05.2024 // Seit dem 09.05.2024 im Saporoshez // Den Code zum Blinken hat der Nutzer combie vorgestellt, vielen Dank // Der Blinkcode ist nicht perfekt beim Ueberlauf, aber das ist hier egal // InterruptRotator auf Basis von Copyright (c) by Matthias Hertel, http://www.mathertel.de // funktioniert mit schapo zwischen 0 und 5 // mit RGB-LED zur Kontrolle der Schaltstellungen, dunkler als in der ersten Version #include #include #define PIN_IN1 A2 // Kabel orange vom Drehencoder #define PIN_IN2 A3 // Kabel braun vom Drehencoder int schapo = 0 ; int schapoalt = 0 ; RotaryEncoder *encoder = nullptr; const unsigned long onzeit = 1000; // ms Einschaltzeit Schalterposition 2, 3 und 4 const unsigned long offzeit1 = 4000; // ms kurze Ausschaltzeit Schalterposition 2 const unsigned long offzeit2 = 6000; // ms mittlere Ausschaltzeit Schalterposition 4 const unsigned long offzeit3 = 8000; // ms lange Ausschaltzeit Schalterposition 4 const int relais1 = 2; //Signal zum Ansteuern Relais 1 am Digitalpin 2 Kabel gruengelb const int relais2 = 3; //Signal zum Ansteuern Relais 2 am Digitalpin 3 Kabel hellblau const int relais3 = 9; //Signal zum Ansteuern Relais 3 am Digitalpin 9 Kabel gelb const int rgbpinrot = 5; // Signal zum Ansteuern rot an RGB-LED Kabel rot const int rgbpingruen = 6; // Signal zum Ansteuern gruen an RGB-LED Kabel gruen const int rgbpinblau = 10; // Signal zum Ansteuern blau an RGB-LED Kabel blau int taster = HIGH; void checkPosition() { encoder->tick(); // just call tick() to check the state. } void setup() { pinMode(relais1, OUTPUT); pinMode(relais2, OUTPUT); pinMode(relais3, OUTPUT); pinMode(rgbpinrot, OUTPUT); pinMode(rgbpingruen, OUTPUT); pinMode(rgbpinblau, OUTPUT); pinMode(8, INPUT_PULLUP); //INPUT_PULLUP ist wichtig, sonst brummt dieses Relais int taster = HIGH; //Variable für den integrierten Taster am Drehencoder am Digitalpin 8 Kabel weiß digitalWrite(relais1, HIGH); // beim Einschalten der Autobatterie erst einmal alles ausschalten digitalWrite(relais2, HIGH); // beim Einschalten der Autobatterie erst einmal alles ausschalten Serial.begin(9600); while (!Serial) ; Serial.println("InterruptRotator example for the RotaryEncoder library."); encoder = new RotaryEncoder(PIN_IN1, PIN_IN2, RotaryEncoder::LatchMode::FOUR3); attachInterrupt(digitalPinToInterrupt(PIN_IN1), checkPosition, CHANGE); attachInterrupt(digitalPinToInterrupt(PIN_IN2), checkPosition, CHANGE); } void loop() { static int pos = 0; encoder->tick(); // just call tick() to check the state. int newPos = encoder->getPosition(); if (pos != newPos) { Serial.print("pos:"); Serial.print(newPos); schapo = schapoalt + (int)(encoder->getDirection()); if ( schapo < 1 ) { schapo = 0 ; } if ( schapo > 4 ) { schapo = 5 ; } Serial.print(" schapo:"); Serial.print(schapo); Serial.print(" taster:"); Serial.print(taster); Serial.print(" dir:"); Serial.println((int)(encoder->getDirection())); pos = newPos; schapoalt = schapo; } if (schapo == 0) { digitalWrite(relais1, LOW); digitalWrite(relais2, LOW); analogWrite(rgbpinrot, 0); // 0 aus analogWrite(rgbpingruen, 0); // 0 aus analogWrite(rgbpinblau, 0); // 0 aus } if (schapo == 1) { digitalWrite(relais1, HIGH); digitalWrite(relais2, HIGH); analogWrite(rgbpinrot, 0); // 0 gruen analogWrite(rgbpingruen, 5); // 5 gruen analogWrite(rgbpinblau, 0); // 0 gruen } if (schapo == 2) { digitalWrite(relais1, (millis()%(onzeit+offzeit1))>offzeit1); //Vom Nutzer Combie vorgestellt digitalWrite(relais2, (millis()%(onzeit+offzeit1))>offzeit1); analogWrite(rgbpinrot, 40); // 40 rot analogWrite(rgbpingruen, 0); // 0 rot analogWrite(rgbpinblau, 0); // 0 rot } if (schapo == 3) { digitalWrite(relais1, (millis()%(onzeit+offzeit2))>offzeit2); digitalWrite(relais2, (millis()%(onzeit+offzeit2))>offzeit2); analogWrite(rgbpinrot, 150); // 150 weiss analogWrite(rgbpingruen, 50); // 50 weiss analogWrite(rgbpinblau, 10); // 10 weiss } if (schapo == 4) { digitalWrite(relais1, (millis()%(onzeit+offzeit3))>offzeit3); digitalWrite(relais2, (millis()%(onzeit+offzeit3))>offzeit3); analogWrite(rgbpinrot, 0); // 0 blau analogWrite(rgbpingruen, 0); // 0 blau analogWrite(rgbpinblau, 10); // 10 blau } if (schapo == 5) { digitalWrite(relais1, HIGH); digitalWrite(relais2, LOW); analogWrite(rgbpinrot, 100); // 100 gelb analogWrite(rgbpingruen, 17); // 17 gelb analogWrite(rgbpinblau, 0); // 0 gelb } taster = digitalRead(8); if (taster == 0) { digitalWrite(relais3, HIGH); } else { digitalWrite(relais3, LOW); } }