Als erstes solltest Du mal die Klammern in Deinem Programm ein wenig aufräumen, die sind zwar nicht falsch, aber an einigen Stellen unnötig und damit verwirrend.
Klammern umschliessen Blöcke, wie z.B. von Schleifen, Verzweigungen (if - else) oder auch Funktionen.
Sowas wie
void loop() {
{
//Fahren
analogWrite(motor_RechtsPWM, 200);
digitalWrite(motor_Rechts1, HIGH);
digitalWrite(motor_Rechts2, LOW);
analogWrite(motor_LinksPWM, 200);
digitalWrite(motor_Links1, HIGH);
digitalWrite(motor_Links2, LOW);
}
{
SRF02::update();
if (millis() > nextPrint)
{
Serial.println(sensor.read());
nextPrint = millis () + 500;
}
}
Ist identisch mit
Damit Du den Ablauf Deines Programms besser überblicken kannst, würde ich z.b. die einzelnen Teile in Funktionen packen, und die in der Loop nur noch aufrufen.
z.B.
void fahren() {
//Fahren
analogWrite(motor_RechtsPWM, 200);
digitalWrite(motor_Rechts1, HIGH);
digitalWrite(motor_Rechts2, LOW);
analogWrite(motor_LinksPWM, 200);
digitalWrite(motor_Links1, HIGH);
digitalWrite(motor_Links2, LOW);
}
void loop() {
fahren();
SRF02::update();
if (millis() > nextPrint)
{
Serial.println(sensor.read());
nextPrint = millis () + 500;
}
...
Das Gleiche dann für das Drehen und Messen mit dem Servo und dem Sensor. Ansonsten sehe ich in Deinem Code auch nichts, was die 30 Sekunden umsetzen würde, die Du als Zeitrahmen für das Fahren und dann Messen angegeben hast. Aktuell macht Dein Programm in der loop() folgendes:
{
Fahren
Sensor update
alle 0,5 Sekunden den gemessenenAbstand seriell ausgeben
wenn abstand < 30:
- anhalten
- servo nach rechts drehen (2 sek. warten)
- IR-messen (0,1 sek. warten)
- servo nach links drehen (2 sek. warten)
- IR-messen (0,1 sek. warten)
- wenn rechts < links:
- linkskurve für 0.1 sekunde fahren
- return (springt aus der loop / beendet loop, die dann aber gleich wieder aufgerufen wird)
- wenn rechts > links:
- rechtskurve für 0.1 sekunde fahren
- return (springt aus der loop / beendet loop, die dann aber gleich wieder aufgerufen wird)
}