#include #include #include #include #include #define startPin 2 // #define stopPin 3 // #define taktPin 9 // #define relay1Pin 10 // #define relay2Pin 11 // #define relay3Pin 12 // #define potiPin A3 // #define DISPLAY_I2C_ADDRESS 0x3C #define DISPLAY_WIDTH 128 // Breite in Pixeln #define DISPLAY_HEIGHT 32 // Höhe in Pixeln Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1); // arduino UNO, NANO SDA=A4, SCL=A5 void setup() { Serial.begin(9600); // pinMode(startPin, INPUT_PULLUP); // Die Buttons schaltem gg GND pinMode(stopPin, INPUT_PULLUP); pinMode(taktPin, OUTPUT); pinMode(relay1Pin, OUTPUT); pinMode(relay2Pin, OUTPUT); pinMode(relay3Pin, OUTPUT); Timer1.initialize(1000000); Timer1.attachInterrupt(blink); // Initialisierung der Timer Interruptroutine mit einer Zeitkonstante von 1 Sekunde attachInterrupt(digitalPinToInterrupt(stopPin), stop_all, LOW); // Die Buttons schaltem gg GND, daher Interr.startet mit LOW attachInterrupt(digitalPinToInterrupt(startPin), Waschroutine, LOW); // Interrupt schaltet Waschvorgang ein if(!display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_I2C_ADDRESS)) { Serial.println("SSD1306 nicht gefunden"); } } int taktstate = LOW; int relay1state = HIGH; //Die Relais schalten bei LOW ein und bei HIGH aus, Anfangswert daher HIGH int relay2state = HIGH; int potiWert = 0; long Einschaltdauer = 0; int Einschaltdauer_now; int Minutendauer = 0; int taktwert = LOW; int startwert = HIGH; //Die Buttons schaltem gg GND, Anfangswert daher HIGH int relaywert = LOW; int relay1wert = LOW; int relay2wert = LOW; int relay3wert = LOW; int relayzeit_now = 0; int zaehler = 0; void blink(void) // Dies ist die Timer Interruptroutine, die einen Takt von 1 Sekunde erzeugt und entsprechend den Taktpin 5 wackeln läßt { if (taktstate == LOW) { taktstate = HIGH; } else { taktstate = LOW; } digitalWrite(taktPin, taktstate); } void loop() { Serial.println("Washtimer mit Arduino, Ersatz f. mech Timer. Arduino IDE: Waschzeit_3R_HIGH_01.ino"); potiWert = analogRead(potiPin); Einschaltdauer = map(potiWert, 0, 1023, 60 , 900); //Dieser Teil bestimmt die Waschzeit. Die Werte des Potis werden gemappt auf die Range Minutendauer = (Einschaltdauer / 60); //von 60 bis 900 Sekunden = 2 Minuten bis 15 Minuten // Serial.print(potiWert); // Serial.println(" Potistellung"); // Serial.print(Einschaltdauer); // Serial.println(" ESD"); // Serial.print(Minutendauer); // Serial.println(" Minuten"); taktwert = digitalRead(taktPin); //Serial.print(taktwert); //Serial.println(" TAKT"); if (taktwert == 0) { (Einschaltdauer_now --); } if (Einschaltdauer_now < 0) { (Einschaltdauer_now = 0); } //Serial.print(Einschaltdauer_now); //Serial.println(" ESD N"); if (Einschaltdauer_now != 0) { // Das dritte Relais ist eingeschaltet solange die Waschzeit läuft. Damit wird die Phase geschaltet. (relay3wert = 1); } if (Einschaltdauer_now == 0) { // Das dritte Relais ist eingeschaltet solange die Waschzeit läuft. Damit wird die Phase geschaltet. (relay3wert = 0); } if (relay3wert = 0) { digitalWrite(relay3Pin, LOW); } if (relay3wert = 1) { digitalWrite(relay3Pin, HIGH); } //Serial.print(relay3wert); //Serial.println(" RW 3"); if (Einschaltdauer_now == 0) { // Das dritte Relais wird ausgeschaltet, wenn die Waschzeit abgelaufen ist. digitalWrite(relay3Pin, LOW); } if (digitalRead(taktPin) == HIGH) { //Beginn der Waschroutine. Es startet eine Zeitschleife von 0 bis 60 Sekunden (relayzeit_now ++); } if (relayzeit_now == 60) { (relayzeit_now = 0); } //Serial.print(relayzeit_now); //Serial.println(" relayzeit_now"); if ((relayzeit_now >=0) && (relayzeit_now <= 2)) relay1wert = 0; //Hier wird die Zeitschleife genutzt, um die Relais im Rhythmus zu schalten if ((relayzeit_now >=3) && (relayzeit_now <= 27)) relay1wert = 1; //relaywert1 schaltet Relay1, Relay1 schaltet die Phase. Jeweils zum Wechsel der Laufrichtung (s.u.) if ((relayzeit_now >=28) && (relayzeit_now <= 32)) relay1wert = 0; //ist Relay1 für einige Sekunden auf 0, dazwischen läuft der Motor. if ((relayzeit_now >=33) && (relayzeit_now <= 57)) relay1wert = 1; if ((relayzeit_now >=58) && (relayzeit_now <= 60)) relay1wert = 0; if (relay1wert == 1 && Einschaltdauer_now != 0) { // Diese Routine bringt mich zu Verzweiflung. Die && Verknüpfung soll sicherstellen, dass Relais 1 nur eingeschaltet digitalWrite(relay1Pin, LOW); // wird, solange die Waschzeit läuft, also nicht 0 ist. Wie ich bemerken muss klappt das nicht. Das Relais schaltet } // auch nachdem die Zeit schon abgelaufen ist. Die Routine kümmert sich nicht um die && Bedingung! WARUM? if (relay1wert == 0 && Einschaltdauer_now != 0) { digitalWrite(relay1Pin, HIGH); } if ((relayzeit_now >=0) && (relayzeit_now <= 29)) digitalWrite(relay2Pin, HIGH); //Diese Routine schaltet das Relais 2 alle 30 Sekunden um. Damit ändert sich die Laufrichtung. (s.o.) if ((relayzeit_now >=30) && (relayzeit_now <= 59)) digitalWrite(relay2Pin, LOW); //Der Wechsel der Laufrichtung ist bei 0 bzw 30 Sekunden //Serial.print(relay1wert); //Serial.println(" Relay1"); //Serial.print(relay2wert); //Serial.println(" Relay2"); if (Einschaltdauer_now == 0) digitalWrite(relay1Pin, HIGH); if (Einschaltdauer_now == 0) digitalWrite(relay2Pin, HIGH); if (Einschaltdauer_now == 0) digitalWrite(relay3Pin, HIGH); // Ist eigentlich überflüssig. Soll sicherstellen, dass alle Relais aus sind, display.clearDisplay(); // Display(puffer) löschen display.setTextSize(2); // zweite Schriftgröße (Höhe 16px) display.setTextColor(WHITE); // helle Schrift, dunkler Grund) display.setCursor(0, 0); // links oben anfangen display.print(Minutendauer); if (Minutendauer == 1) display.print(" Minute"); if (Minutendauer > 1)display.print(" Minuten"); display.setCursor(0, 18); // links oben anfangen if (Einschaltdauer_now > 1) { display.print("noch "); display.print(Einschaltdauer_now); } if (Einschaltdauer_now == 0) { display.print("Motor aus"); } //display.print(Einschaltdauer_now); display.display(); delay(500); //delay bleibt nur zum debuggen. Wenn das Programm fertig ist, werden delay und alle Serial.print Anweisungen gelöscht. } void Waschroutine() { Einschaltdauer_now = Einschaltdauer; } void stop_all() //Diese Routine wird mit dem Stopbutton gestartet. Sie setzt alle Waschroutinen aul Null und { //schaltet die Relais aus. Einschaltdauer = 0; Einschaltdauer_now = 0; relaywert = LOW; startwert = HIGH; //relay1wert = 0 //relay2wert = 0 //relay3wert = 0 digitalWrite(relay1Pin, HIGH); //Die Relais schalten bei LOW ein und bei HIGH aus digitalWrite(relay2Pin, HIGH); digitalWrite(relay3Pin, HIGH); // Serial.println("Relais sind aus"); }