Die Erklärung verstehe ich jetzt nicht so richtig, wenn etwas mit der Programierung nicht gestimmt hätte, dann wäre der Uno doch bestimmt keine 4 Tage ohne Ausfall gelaufen und der Uno wurde mit 9V bestomt und die Pinbelegung geht lediglich auf die Platine der Relay Karte , so das alle vier Relas gezogen werden , also einmal 2 Rechte und einmal 2 Linke und von den Pumpen kommen die Kabel je an ein Relay Braun , Blau, Braun, Blau und gleichfarbig vom Netz. so das wenn das Relay abschaltet der Leiter und die Null komplett getrennt sind. ich mache mal en Bild von dem UNO so wie er verkabelt ist und der Relay Karte und stelle den
/*
Pumpensteuerung für Jürgen Mantell
Mai 2013 von markus.sawo@gmail.com
Zwei Pumpen werden über jeweils zwei Relais zufällig gesteuert, wobei beide Pumpen nicht zusammen aus sein dürfen.
Es werden zwei Relais pro Pumpe genutzt, um beide AC-Phasen sicher zu trennen.
Pinbelegung:
Pumpe 1 A = Pin 2
Pumpe 1 B = Pin 3
Pumpe 2 A = Pin 4
Pumpe 2 B = Pin 5
Status LED 1 = Pin 8
Status LED 2 = Pin 9
*/
// Gesamtgeschwindigkeit, also Faktor mit dem die Zufallszahlen multipliziert werden. Standard 1, höhere Zahlen = langsamer
float multiplikator = 1;
// Sonstige Variablen:
int pumpe1_A = 2;
int pumpe1_B = 3;
int pumpe2_A = 4;
int pumpe2_B = 5;
int led1 = 8;
int led2 = 9;
long zufall1 = 0;
long zufall2 = 0;
long minwert_1 = 0;
long minwert_2 = 0;
int zufall_pumpe = 0;
int zufall_led = 0;
int pumpen_check = 0;
int Status_1 = HIGH;
int Status_2 = HIGH;
long altMillis1 = 0;
long altMillis2 = 0;
void setup() {
// Hier werden die grundlegenende Einstellungen vorgenommen: Funktion der Pins (hier Ausgang)
pinMode(pumpe1_A, OUTPUT);
pinMode(pumpe1_B, OUTPUT);
pinMode(pumpe2_A, OUTPUT);
pinMode(pumpe2_B, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
randomSeed(analogRead(0));
// Serielle Verbindung aufmachen, falls man am PC was nachschauen möchte:
Serial.begin(9600);
}
void loop() {
// Alles was hier in loop(); steht, läuft immer wieder durch solange Strom am Controller ist
// Erstmal die aktuelle Zeit in zwei Variablen schreiben:
unsigned long jetztMillis1 = millis();
unsigned long jetztMillis2 = millis();
// #############################
// Routine für Pumpe #1
// #############################
//
// Ist die zufällige Zeit für Pumpe 1 schon abgelaufen?
// Siehe dazu auch: www.arduino.cc/en/Tutorial/BlinkWithoutDelay
if(jetztMillis1 - altMillis1 > zufall1) {
// Letzter Intervall?
altMillis1 = jetztMillis1;
// Zufallszahl zwischen 5min und 20min erzeugen:
zufall1 = random(600000, 1500000);
// Multiplikator nimmt die zufällige Zahl mal, um die Geschwindigkeit zu steuern.
zufall1 = zufall1 * multiplikator ;
// In Minuten umrechnen:
minwert_1 = zufall1 / 60000;
// Status der Pumpe umdrehen und Ausgabe auf Serial Port(AN/AUS)
if (Status_1 == HIGH)
{
Status_1 = LOW;
Serial.println("----------------------------- ");
Serial.print("Pumpe 1 Intervall AN ");
Serial.print(minwert_1);
Serial.print(" Minuten");
Serial.println("");
}
else
{
Status_1 = HIGH;
Serial.println("----------------------------- ");
Serial.print("Pumpe 1 Intervall AUS ");
Serial.print(minwert_1);
Serial.print(" Minuten");
Serial.println("");
}
// Werte an die Relais und LED schreiben:
digitalWrite(pumpe1_A, Status_1);
digitalWrite(pumpe1_B, Status_1);
digitalWrite(led1, Status_1);
// Für die gerade erzeugte Zufallszahl haben wir noch nicht gecheckt, ob beide Pumpen aus sind (siehe Routine für Pumpencheck):
pumpen_check = 0;
}
// #############################
// Routine für Pumpe #2
// #############################
//
// Ist die zufällige Zeit für Pumpe 2 schon abgelaufen?
if(jetztMillis2 - altMillis2 > zufall2) {
// Letzter Intervall?
altMillis2 = jetztMillis2;
// Zufallszahl zwischen 5min und 20min erzeugen:
zufall2 = random(600000, 1500000);
// Multiplikator nimmt die zufällige Zahl mal, um die Geschwindigkeit zu steuern.
zufall2 = zufall2 * multiplikator ;
// In Minuten umrechnen:
minwert_2 = zufall2 / 60000;
// Status der Pumpe umdrehen und Ausgabe auf Serial Port(AN/AUS)
if (Status_2 == HIGH)
{
Status_2 = LOW;
Serial.println("----------------------------- ");
Serial.print("Pumpe 2 Intervall AN ");
Serial.print(minwert_2);
Serial.print(" Minuten");
Serial.println("");
}
else
{
Status_2 = HIGH;
Serial.println("----------------------------- ");
Serial.print("Pumpe 2 Intervall AUS ");
Serial.print(minwert_2);
Serial.print(" Minuten");
Serial.println("");
}
// Werte an die Relais und LED schreiben:
digitalWrite(pumpe2_A, Status_2);
digitalWrite(pumpe2_B, Status_2);
digitalWrite(led2, Status_2);
// Für die gerade erzeugte Zufallszahl haben wir noch nicht gecheckt, ob beide Pumpen aus sind (siehe Routine für Pumpencheck):
pumpen_check = 0;
}
// #############################
// Routine für Pumpencheck
// #############################
//
// Dieser Teil kontrolliert ob beide Pumpen aus sind und wir für diese Zufallszahlen noch nicht geprüft hatten (pumpen_check == 0);
// Wenn das der Fall ist wird zufällig eine der beiden Pumpen ausgewählt:
if (Status_1 == HIGH && Status_2 == HIGH && pumpen_check == 0)
{
// Zufallszahl generieren zwischen 1 und 2 (3 muss als obergrenze angegeben werden, da Obergrenze exklusive)
zufall_pumpe = random(1,3);
// Nachricht auf Serial Port ausgeben:
Serial.println("");
Serial.println("############################################# ");
Serial.print("# Beide Pumpen aus - Schalte Pumpe Nr. ");
Serial.print(zufall_pumpe);
Serial.print(" an #");
Serial.println("");
Serial.println("############################################# ");
Serial.println("");
// Unterscheiden welche der beiden Pumpen ausgewählt wurde und Werte schreiben:
// Pumpe 1
if ( zufall_pumpe == 1 )
{
// Werte an die Relais und LED schreiben:
digitalWrite(pumpe1_A, LOW);
digitalWrite(pumpe1_B, LOW);
digitalWrite(led1, LOW);
}
// oder Pumpe 2
if ( zufall_pumpe == 2 )
{
// Werte an die Relais und LED schreiben:
digitalWrite(pumpe2_A, LOW);
digitalWrite(pumpe2_B, LOW);
digitalWrite(led2, LOW);
}
// pumpen_check wird gleich 1 gesetzt, es wurde also für dieses Set Zufallszahlen schon gecheckt ob beide Pumpen aus sind.
// Dieser Wert wird nach dem Erzeugen einer neuen Zufallszahl in den Pumpenroutinen wieder = 0 gesetzt.
pumpen_check = 1;
}
// Kurze Warteschleife von 20ms damit sich das Programm nicht selbst überholt.
delay(20);
}