[...]
10:01:19.748 -> Zeitablauf Pause
10:01:19.748 -> Zeitablauf Pause
10:01:19.788 -> Zeitablauf Pause
10:01:19.788 -> Zeitablauf Pause
10:01:19.828 -> irPin[i]==LOW (Sensor erkennt Bewegung)
10:01:19.828 -> Zeitablauf Laufzeit (Laufzeit beginnt....
10:01:19.868 -> pumpPin[i]==HIGH ..... Pumpe soll hier auf LOW schalten....
10:01:19.868 -> Sensor 1: Objekt erkannt!
10:01:21.828 -> Zeitablauf Pause (Laufzeit vorbei, Timer der Pause beginnt...
10:01:21.868 -> Pumpe aus! ... und die Pumpe wird abgeschaltet)
10:01:21.868 -> pumpPin[i]==HIGH
10:01:21.868 -> Zeitablauf Pause (Wartezustand)
10:01:21.908 -> Zeitablauf Pause
10:01:21.948 -> Zeitablauf Pause
10:01:21.948 -> Zeitablauf Pause
10:01:21.948 -> Zeitablauf Pause
[...]
So... die If´s mal ein wenig aufgebröselt.
// Anzahl Kreise
const int Kreise = 1;
// Pin-Belegung
const int irPin[] = {2, 3};
const int pumpPin[] = {5, 6};
// Zeitangaben
const int laufzeit[] = {2000, 2000}; // Laufzeit Pumpen
const int pausezeit[] = {3000, 3000} ; // Zwangspause Pumpen
// Zeit- / Zählervariablen
unsigned long laufmillis[] = {0, 0};
unsigned long pausemillis[] = {0, 0};
// Programm
void setup()
{
Serial.begin(9600);
for (int i = 0; i < Kreise; i++)
{
pinMode(irPin[i], INPUT);
pinMode(pumpPin[i], OUTPUT);
digitalWrite(irPin[i], HIGH);
digitalWrite(pumpPin[i], HIGH);
}
}
void loop()
{
for (int i = 0; i < Kreise; i++)
{
if (digitalRead(irPin[i]) == LOW)
{
Serial.println("irPin[i]==LOW");
if (millis() - pausemillis[i] > pausezeit[i])
{
Serial.println("Zeitablauf Laufzeit");
if (!digitalRead(pumpPin[i]) == HIGH)
{
Serial.println("pumpPin[i]==HIGH");
Serial.print("Sensor ");
Serial.print(i+1);
Serial.println(": Objekt erkannt!");
digitalWrite(pumpPin[i], HIGH);
laufmillis[i] = millis();
}
}
}
if (millis() - laufmillis[i] > laufzeit[i])
{
Serial.println("Zeitablauf Pause");
if (digitalRead(pumpPin[i]))
{
Serial.println("Pumpe aus!");
digitalWrite(pumpPin[i], LOW);
Serial.println("pumpPin[i]==HIGH");
pausemillis[i] = millis();
}
}
}
}
Funktioniert schonmal ganz gut!
Das einzige Problem was vorliegt ist, dass das Relais direkt nach Einschalten des Arduino die
Laufzeit startet und anschließend das Relais auf LOW (betätigt) setzt. Wechsel ich die Zustände im Code, reagiert das Relais allerdings nicht mehr.
Soll:
1. Arduino Ein / Reset -> Wartezustand (Sensor und Relais auf HIGH)
2. Programm wartet auf Erfüllung der Bedingung. Das heißt die Pumpe ist aus und der Sensor erkennt eine Bewegung (Sensor == LOW, Pumpe == HIGH, Zwangspause vorbei))
2. Hand vor Sensor -> Relais schaltet ein (also auf LOW)
3. Relais bleibt gemäß der festgelegten Dauer von "Laufzeit" betätigt und schaltet danach ab
4. Timer der Zwangspause läuft ab -> Neubeginn des Zyklus möglich
Ist:
1. Arduino Ein / Reset -> Relais ist aus (HIGH), Laufzeit läuft ab (2s) und Relais schaltet direkt auf LOW (also Pumpe betätigt) -> Wartezustand
2. Warten auf Erfüllung der Bedingung (wie oben)
3. Hand vor Sensor -> Relais schaltet ab (also auf HIGH)
4. Relais bleibt gemäß der festgelegten Dauer von "Laufzeit" UNbetätigt und schaltet danach wieder ein
5. Timer der Zwangspause läuft ab -> Neubeginn des Zyklus möglich
Ist, wenn Zustände gewechselt werden:
1. Arduino Ein / Reset -> Stillstand (Relais auf HIGH, also aus)
10:24:39.321 -> Pumpe aus!
10:24:39.321 -> pumpPin[i]==HIGH
10:24:39.361 -> Zeitablauf Pause
10:24:39.361 -> Pumpe aus!
10:24:39.401 -> pumpPin[i]==HIGH
10:24:39.401 -> Zeitablauf Pause
10:24:39.401 -> Pumpe aus!
10:24:39.441 -> pumpPin[i]==HIGH
10:24:39.441 -> Zeitablauf Pause
10:24:39.481 -> Pumpe aus!
10:24:39.481 -> pumpPin[i]==HIGH
10:24:39.521 -> Zeitablauf Pause
10:24:39.521 -> Pumpe aus!
10:24:39.521 -> pumpPin[i]==HIGH
10:24:39.561 -> Zeitablauf Pause
10:24:39.561 -> Pumpe aus!
2. Wenn hand vor Sensor
10:25:45.719 -> pumpPin[i]==HIGH
10:25:45.759 -> irPin[i]==LOW
10:25:45.759 -> Zeitablauf Pause
10:25:45.799 -> Pumpe aus!
10:25:45.799 -> pumpPin[i]==HIGH
10:25:45.799 -> irPin[i]==LOW
10:25:45.839 -> Zeitablauf Pause
10:25:45.839 -> Pumpe aus!
3. keinerlei Reaktion
Wo übersehe ich etwas? Rein theoretisch müsste ich doch nur die beiden digitalWrite(pumpPin) Zustände im Code wechseln?
// Anzahl Kreise
const int Kreise = 1;
// Pin-Belegung
const int irPin[] = {2, 3};
const int pumpPin[] = {5, 6};
// Zeitangaben
const int laufzeit[] = {2000, 2000}; // Laufzeit Pumpen
const int pausezeit[] = {3000, 3000} ; // Zwangspause Pumpen
// Zeit- / Zählervariablen
unsigned long laufmillis[] = {0, 0};
unsigned long pausemillis[] = {0, 0};
// Programm
void setup()
{
Serial.begin(9600);
for (int i = 0; i < Kreise; i++)
{
pinMode(irPin[i], INPUT);
pinMode(pumpPin[i], OUTPUT);
digitalWrite(irPin[i], HIGH);
digitalWrite(pumpPin[i], HIGH);
}
}
void loop()
{
for (int i = 0; i < Kreise; i++)
{
if (digitalRead(irPin[i]) == LOW)
{
Serial.println("irPin[i]==LOW");
if (millis() - pausemillis[i] > pausezeit[i])
{
Serial.println("Zeitablauf Laufzeit");
if (digitalRead(pumpPin[i]) == HIGH)
{
Serial.println("pumpPin[i]==HIGH");
Serial.print("Sensor ");
Serial.print(i+1);
Serial.println(": Objekt erkannt!");
digitalWrite(pumpPin[i], LOW); Hier auf LOW schalten, damit das Relais eingeschaltet wird
laufmillis[i] = millis();
}
}
}
if (millis() - laufmillis[i] > laufzeit[i])
{
Serial.println("Zeitablauf Pause");
if (digitalRead(pumpPin[i]))
{
Serial.println("Pumpe aus!");
digitalWrite(pumpPin[i], HIGH); Hier auf HIGH wechseln, damit das Relais abgeschaltet wird
Serial.println("pumpPin[i]==HIGH");
pausemillis[i] = millis();
}
}
}
}