Wie kann ich diese delays mit millis ersetzen?

1 Antwort

So zumindest nicht... Das erste If für den Rückwärtsgang wäre die Entfernung und nicht die Zeit... Dann muss für 3sek diese aktiv bleiben. Dafür musst Du für jeden eigenen Timer mit dazugehörigen Variable programmieren... Auf die Schnelle bekomm ich das aber nicht runter geschrieben... denn da passt noch bissl mehr in dem Zusammenhang nicht. Du musst ja auch dafür sorgen, dass wärend den 3sek Rückwärts kein neuer Vorwärtsbefehl gesetzt wird ect... Der Rest des Programm läuft ja auch einfach weiter und überschreibt sonst deinen Rückwärtsgang wieder mit dem Vorwärtsgang... Also mehrere Abhängigkeiten voneinander definieren... Ist schon etwas aufwendiger und man muss an mehr denken, wenn das Programm nicht einfach stoppt, sondern parallel andere Schritte trotzdem ausführt...


RareDevil  22.12.2020, 18:32

Ergänzung... Auch das Ansteuern des Ultraschallsensors wird so nicht gut klappen, da Du auch da 2x den gleichen Zeitwert nutzt, und in beiden If jeweils zurück setzt... Somit setzt das If mit dem Interval 2 (da nur 10ms lang) immer den Zeitspeicher zurück und das If vom Interval 1 kann nie erfüllt werden...

RareDevil  22.12.2020, 18:56
@RareDevil

Ich hab es mal auf die schnelle angepasst. Hab aber einmal Delay drin, aber nur 5µs um den Puls für den Ultraschallsensor zu generieren...

Fehlerfrei kompiliert für Uno, aber ungetestet.. Könnte also noch was falsch sein...

#include <AFMotor.h>
#include <Servo.h>

//AF_DCMotor motor1(1);
//AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

int trigPin = 9;
int echoPin = 10;
unsigned long currentmillis;
unsigned long previousmillis;
const long interval_1 = 1000; //1sek Interval Abfrage Distanz
const long interval_2 = 3000; //3sek für Rückwärts
bool backw = false; //Variable für Rückwärts aktiv
unsigned long backmillis; //Zeitvariable für Dauer Rückwärtsfahrt

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  //  motor1.setSpeed(250);
  //  motor1.run(RELEASE);
  //  motor2.setSpeed(250);
  //  motor2.run(RELEASE);
  motor3.setSpeed(250);
  motor3.run(RELEASE);
  motor4.setSpeed(250);
  motor4.run(RELEASE);
}

void loop() {
  //Ultraschallsensor
  currentmillis = millis();
  long duration, distance;

  if (currentmillis - previousmillis >= interval_1) { //Start jede Sekunde
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(5); //5µSekunden dürften als Delay nicht stören...
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration / 2) / 29.1;
    Serial.print(distance);
    Serial.println("CM");
    //delay (10);
    previousmillis = currentmillis;
  }

  //Motoren

  //vorwärts
  if (distance >= 5 && backw == false) { //Distanz plausibel und Rückwärts blockiert nicht
    motor3.run(FORWARD);
    motor4.run(BACKWARD);
  }
  //rückwärts
  if (distance <= 5 && backw == false) {
    backw = true;
    backmillis = currentmillis;
  }
  if (backw == true) {
    motor3.run(BACKWARD);
    motor4.run(FORWARD);
    if (currentmillis - backmillis >= interval_2) {
      backw = false;
    }
  }
}