Ich gehe das hier nochmal Step für Step für einen Kreis durch. Vielleicht könnt ihr fehlerhafte Gedankengänge feststellen und mich korrigieren:
int ir1Pin = 2; // Infrarotsensor 1
int relais1Pin = 5; // Relais 1
void setup() {
Serial.begin(9600);
pinMode(ir1Pin, INPUT);
pinMode(relais1Pin , OUTPUT);
}
void loop() {
digitalWrite(relais1Pin , HIGH);
digitalWrite(ir1Pin, HIGH);
int i1 = digitalRead(ir1Pin);
if( i1 == LOW){
Serial.println("Sensor 1: Objekt erkannt!");
digitalWrite(relais1Pin , LOW);
delay(2000);
}
}
Damit schaltet das Relais schonmal wenn ich meine Hand vor den Sensor halte.
Als nächstes muss ich schauen, dass ich mein delay() durch millis() ersetze, um die Möglichkeit zu haben, zwei voneinander unabhängige Kreise laufen zu lassen und die Laufzeit sowie die anschließende Zwangspause zu timen.
Dazu benötige ich 2 weitere konstante Variablen sowie je Kreis 2 Variablen mit unsigned long:
- zwei konstante Variablen für die Laufzeit und die Pausenzeit
const int laufzeit1 = 1000
const int pausezeit1 = 3000
- zwei Variablen (je Kreis) für die Zeitenmessung von Laufzeit und Pause
unsigned long laufmillis1
unsigned long pausemillis1
Sieht im Kopf dann so aus:
int ir1Pin = 2; // Infrarotsensor 1
int relais1Pin = 5; // Relais 1
int ir2Pin = 3; // Infrarotsensor 2
int relais2Pin = 6; // Relais 2
const int laufzeit1 = 1000; // Laufzeit der Relaisbetätigung Kreis 1
const int pausezeit1 = 3000; // Laufzeit der Zwangspause nach Relaisbetätigung Kreis 1
unsigned long laufmillis1;
unsigned long pausemillis1;
void setup() {
Serial.begin(9600);
pinMode(ir1Pin, INPUT);
pinMode(relais1Pin, OUTPUT);
pinMode(ir2Pin, INPUT);
pinMode(relais2Pin, OUTPUT);
}
Dann setze ich den Zustand meiner Bauteile (Sensor und Relais) fest und vergebe Namen für digitalRead:
void loop() {
digitalWrite(relais1Pin, HIGH);
digitalWrite(ir1Pin, HIGH);
int i1 = digitalRead(ir1Pin);
int r1 = digitalRead(ir1Pin);
Als nächstes muss ich meine Bedingungen zum Betätigen des Relais entsprechend anpassen und festlegen was passieren soll, wenn alle Bedingungen erfüllt sind.
Dazu prüfe ich:
- ob mein Infrarotsensor 1 etwas erkennt,
- mein Relais ausgeschaltet ist,
- die vergangene Zeit von jetzt bis zu meiner Pause größer als die festgelegte Pausenzeit ist (hier ist wahrscheinlich mein gedanklicher Knackpunkt)
und teile ihm mit:
- , dass ich eine Textzeile im Monitor haben möchte
- , dass Relais 1 schalten soll
- wie lange Relais 1 schalten soll
if ((i1 == LOW) && (r1 == HIGH) && (millis() - pausemillis1 > pausezeit1)) {
Serial.println("Sensor 1: Objekt erkannt!");
digitalWrite(relais1Pin, LOW);
laufmillis1 = millis();
}
Damit diese Bedingung funktioniert, muss ich zusätzlich sagen, dass er nach der Laufzeit:
- das Relais 1 abschaltet
- die vergangene Zeit von jetzt bis zu meiner erneut möglichen Betätigung des Sensors größer als die festgelegte Zwangspausenzeit ist.
Dazu prüfe ich
- ob das Relais 1 betätigt ist
- die Laufzeit von Relais 1 abgelaufen ist.
if ((r1 == LOW) && (millis() - laufmillis1 > laufzeit1)) {
Serial.println("Relais ausgeschaltet!");
digitalWrite(relais1Pin, HIGH);
pausemillis1 = millis();
}
Fasst man das ganze jetzt nochmal zusammen sieht es wie folgt aus:
int ir1Pin = 2; // Infrarotsensor 1
int relais1Pin = 5; // Relais 1
int ir2Pin = 3; // Infrarotsensor 2
int relais2Pin = 6; // Relais 2
const int laufzeit1 = 1000; // Laufzeit der Relaisbetätigung Kreis 1
const int pausezeit1 = 3000; // Laufzeit der Zwangspause nach Relaisbetätigung Kreis 1
unsigned long laufmillis1;
unsigned long pausemillis1;
void setup() {
Serial.begin(9600);
pinMode(ir1Pin, INPUT);
pinMode(relais1Pin, OUTPUT);
pinMode(ir2Pin, INPUT);
pinMode(relais2Pin, OUTPUT);
}
void loop() {
digitalWrite(relais1Pin, HIGH);
digitalWrite(ir1Pin, HIGH);
int i1 = digitalRead(ir1Pin);
int r1 = digitalRead(relais1Pin);
if ((i1 == LOW) && (r1 == HIGH) && (millis() - pausemillis1 > pausezeit1)) {
Serial.println("Sensor 1: Objekt erkannt!");
digitalWrite(relais1Pin, LOW);
laufmillis1 = millis();
}
if ((r1 == LOW) && (millis() - laufmillis1 > laufzeit1)) {
Serial.println("Relais ausgeschaltet!");
digitalWrite(relais1Pin, HIGH);
pausemillis1 = millis();
}
}
Alles drin alles dran. Nichts funktioniert

SObald ich die millis Funktion mit drin hab reagiert weder das Relais noch der Sensor.