Wie kann ich diese delays mit millis ersetzen?
Hallo, ich versuche mir gerade die millis Funktion beizubringen. Zurzeit verstehe ich wie man Blink without delay an der internen LED programmiert, aber ich blicke nicht ganz durch, wie ich mein ganzes Programm mit millis ersetze. Ich möchte nämlich, dass sich zwei Motoren abhängig von den Messwerten eines Ultraschallsensors drehen. Wenn die Distanz >=5 ist, sollen sie sich beide vorwärts drehen ansonsten für 3 Sekunden rückwärts (Im Code sieht es nur so komisch aus mit FORWARD und BACKWARD, weil ich die Anschlüsse bei einem Motor falsch angelötet habe). Ich würde mich sehr über eine Antwort freuen :)
#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;
const long interval_2 = 10;
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){
digitalWrite(trigPin,HIGH);
//delay(1000);
previousmillis = currentmillis;
}
if (currentmillis - previousmillis >= interval_2){
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){
motor3.run(FORWARD);
motor4.run(BACKWARD);
}
//rückwärts
if (currentmillis - previousmillis <= interval_1){
if (distance <=5) {
motor3.run(BACKWARD);
motor4.run(FORWARD);
//delay(3000);
previousmillis = currentmillis;
}
}
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...
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;
}
}
}
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...