Blink w/o Delay "in" Blink w/o Delay, geht das?

Hallo Zusammen,
die trübe Zeit lässt einem wieder mehr "inhouse" sein, und mich mal wieder an meinem Cam/Timelapse Slider weiter machen, nach vielen Versuchen mit Steppern bin ich wieder zurück zu den Getriebemotoren weil die zum vertikalen Sliden/Timelapsen einfach mehr Kraft haben, bzw. meine DSLR wirklich in Position halten, lange Rede kurzer Sinn:

Ich starte und stoppe den Motor mit eine abgewandelten Version von Blink w/o Delay, damit ich während der der Funktion die Richtung wechseln kann bzw. stoppen kann via Buttons.

Nun möchte ich die Laufzeit des Schlitten beim Timelapse, die nach einem Countdown von 3>0 startet auch beliebig kurz oder lange haben, als z.B. 200ms/500ms/750ms/1000ms.

Wie schaffe ich das innerhalb des "Blink w/o Delay" ohne ein "Delay" anzustellen?

Hier mal ein Teil um den es geht, da wo das DELAY(1000) steht sollte wohl die "große Unbekannte" rein.

Vielen Dank vorab für eure Zeit,

Grüße aus Baden,

Fritz

void linear_li() {
  
    if (digitalRead(LEFT_PIN) == LOW) {
    zahler_l = 1;
    zahler_r = 0;
    }

       if(zahler_l == 1 && select == 1){   
                            
            digitalWrite(enA, LOW);
          
            unsigned long currentMillis = millis();
            if(currentMillis - previousMillis05 >= interval05) {

            temp2 -- ;

            if (temp2 == 0) {            

                    int val = analogRead(A0); // Lesen desPoti an Analog Port 0
                    val = map(val, 0, 1023, 0, 255); // Mapen der Potiwerte
                    
                    
                    
                             digitalWrite(enA, HIGH);
                             analogWrite(in1, val);
                             analogWrite(in2, 0);

                             delay (1000); //HIER LÄUFT DER MOTOR 1 SEKUNDE - ABER ES REAGIERT KEIN
                                           // ENDSCHALTER BZW RICHTUNGSWECHSLER - DER MOTOR KNALLT VOLL IN DEN BUTTON
                                           
                             temp2 = 4; // NUN WIRD WIEDER VON 4 > 0 GEZÄHLT BIS DER MOTOR ANLÄUFT                 

                 }
               previousMillis05 = currentMillis;

          }
    }


// HIER LÄUFT DER MOTOR LINEAR NACH LINKS BIS ZUM ENDSCHALTER UM DANN ZU WENDEN 

      if(zahler_l == 1 && select == 0){  
                
              int val = analogRead(A0); // Lesen desPoti an Analog Port 0
              val = map(val, 0, 1023, 0, 255); // Mapen der Potiwerte
              
                     digitalWrite(enA, HIGH);              
              
                     analogWrite(in1, val);
                     analogWrite(in2, 0);
                
              }     
   }

Hallo,

ich gebe dir mal ein Bsp. an Hand das die LED 13 blinkt. Dann kannste den seriellen Monitor öffnen und siehst das hier ohne Verzögerung Text rausgehauen wird. Als wenn der Text und die LED parallel arbeiten würden. Wenn Du das Prinzip mit den millis verstanden hast, kannste alles mögliche damit ohne delay nachbauen. Nur der Code wird etwas umfangreicher. Dafür ohne hartes delay.

// Bsp. ohne delay()

#define LED_PIN    13
unsigned long lastTime;
unsigned long on_time  = 1000;  // ms
unsigned long off_time = 2000;  // ms
bool state_LED;

  
void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN,OUTPUT);
}


void loop() {
  
 if (state_LED == LOW && millis() - lastTime > off_time ) {
   digitalWrite(LED_PIN, HIGH);       // LED einschalten für x ms
   lastTime = millis();             
   state_LED = HIGH;
 }

    
 if (state_LED == HIGH && millis() - lastTime > on_time ) {
   digitalWrite(LED_PIN, LOW);         // LED ausschalten für x ms
   lastTime = millis();  
   state_LED = LOW;
 }

 Serial.println(F("Arduino macht Spass"));
 
}  // Ende loop

Hi Doc,

das sieht ja cool aus, hab es grad mal auf einen blanken Ardu geschoben.
Ich denke damit kann ich arbeiten :slight_smile:

Herzlichen Dank,

Gruß Fritz