Hi
Ich bin absoluter Beginner (habe seit ca 3 Wochen einen Arduino Mega) und bastle seit ca 2 Wochen an einem "Projekt", welches eine kleine Zeitmessanlage abbilden soll.
Dazu habe ich "am Start" auf zwei "Fahrspuren" je zwei IR Sensoren (PRE_STAGE und STAGE), welche bei Einfahrt eines Objektes zur Startlinie feststellen, ob das Objekt richtig steht. (Nämlich dann, wenn beide IR Lichtschranken auf der jeweiligen Seite unterbrochen sind).
Das funktioniert soweit ganz gut.
Um nun einen "Startsignal" auszulösen und die Fahrer wissen, wann Sie losfahren dürfen, habe ich eine "Ampel" mit drei gelben LEDs einer grünen LED und einer roten LED.
Löst jemand (per Softwareanwendung) den Start aus, gehen nacheinander die drei gelben Lampen und danach die grüne Lampe an. (Mit einer 500 ms Zeitverzögerung dazwischen).
Auch das funktioniert bereits reibungslos.
Nun möchte ich aber feststellen, ob der Fahrer schon losgefahren ist, BEVOR die grüne Lampe leuchtet (Fehlstarterkennung). Und da ist der Haken. Das logische ermitteln des Fehlstarts ist einfach.
=> Verlässt der Fahrer den PRE_STAGE Bereich (also der IR Sensor gibt dazu ein Signal) bevor das Grüne Licht leuchtet, ist es ein Fehlstart.
Die Startsequenz (momentan nur auf der linken Bahn) wird momentan per C# beim Click auf den Startbutton mittels folgenden Code
// In meiner C# Applikation
private void btnStart_Click(object sender, EventArgs e) {
//...weiterer Code, der aber hier überflüssig ist
SendCommandToArduino ("left_yellow_1");
Thread.Sleep (_treeDelay);
SendCommandToArduino ("left_yellow_2");
Thread.Sleep (_treeDelay);
SendCommandToArduino ("left_yellow_3");
Thread.Sleep (_treeDelay);
SendCommandToArduino ("left_green");
//...weiterer Code, der aber hier überflüssig ist
}
an den Arduino gesendet, welcher dann per folgenden Code
void loop() {
if(Serial.available()){
delay(2);
command = Serial.readStringUntil('\n');
}
////////////
/// TREE ///
////////////
if(command == "left_yellow_1"){
digitalWrite(LED_LEFT_Y_1,HIGH);
Serial.println("Y_1_LEFT_ON");
}else if(command == "left_yellow_2"){
digitalWrite(LED_LEFT_Y_2,HIGH);
Serial.println("Y_2_LEFT_ON");
}else if(command == "left_yellow_3"){
digitalWrite(LED_LEFT_Y_3,HIGH);
Serial.println("Y_3_LEFT_ON");
} else if(command == "left_green"){
digitalWrite(LED_LEFT_G,HIGH);
//Switch off others
digitalWrite(LED_LEFT_Y_1,LOW);
digitalWrite(LED_LEFT_Y_2,LOW);
digitalWrite(LED_LEFT_Y_3,LOW);
} else if(command == "left_red"){
digitalWrite(LED_LEFT_R,HIGH);
//Switch off others
digitalWrite(LED_LEFT_Y_1,LOW);
digitalWrite(LED_LEFT_Y_2,LOW);
digitalWrite(LED_LEFT_Y_3,LOW);
digitalWrite(LED_LEFT_G,LOW);
}
//...weiterer Code, der aber hier überflüssig ist
}
die LEDs anschaltet.
Wenn jetzt das Fahrzeug den PRE_SATGE Bereich verlässt, sendet der IR Sensor den Befehl über den Arduino an das C# Programm. Das wiederum, kann den Befehl aber erst dann entgegennehmen, wenn die Startsequenz abgelaufen ist. Dementsprechend kommt ein eventuelles Fehlstartsignal erst dann an, wenn die grüne Lampe bereits leuchtet.
Wie kann man das programmiertechnisch (entweder am Arduino oder in C#) abbilden?
Vielen Dank für Eure Unterstützung!