Timer Funktion, millis()

Hallo zusammen,

ich habe ein kleines Problem, ich möchte einen Motor eine gewisse Zeit laufen lassen.
Soweit ich mich informiert habe soll es am besten über den millis() Befehl funktionieren. Jetzt hab ich ein kurzes Programm geschrieben, allerdings funktioniert es nicht so ganz. Der Motor macht dass was er machen soll, auch eine gewisse Zeit, nur ist die Zeit immer unterschiedlich.
Ich bin bis jetzt auf noch keine Lösung gefunden die mir weiter geholfen hat, vielleicht kann mir jemand helfen.

Danke im Voraus.

Sven

void loop() {
    
  BUTTONState = digitalRead(BUTTON);
  if (BUTTONState == HIGH){
    
  if ( millis() < 10000) 
  { 
    cw(255);  //Motorsteuerung
  }
  else
  {
    MotorStop();
    
  }
if ( millis() - prevMillis < 10000)

Sonst geht das nur einmal nach Reset.

und prevMillis vorher als unsigned long prevMillis = 0 festlegen ?

Somox: und prevMillis vorher als unsigned long prevMillis = 0 festlegen ?

unsigned long prevMillis = 0 ;

Durchaus.

eigentlich besser:

unsigned long prevMillis; // ist sowieso 0
void setup()
{
  prevMillis = millis(); // millis() liefert zu dem Zeitpunkt vermutlich auch noch 0
}

Und natürlich, wenn nötig, an der richtigen Stelle:

prevMillis = millis();

Wenn denn die Zeit neu los laufen soll...

Danke für die schnelle Hilfe, werd es später ausprobieren.

Ich spekuliere mal, es geht in die Richtung, wenn der Button gedrückt wird, dreht der Motor für 10 Sekunden:

void loop() {
  BUTTONState = digitalRead(BUTTON);
  if (BUTTONState && !BUTTONStateAlt) {
    cw(255);  //Motorsteuerung
    intervall = 10000;
    prevMillis = millis();
  }
  BUTTONStateAlt = BUTTONState;
  if ( millis() - prevMillis >= intervall) {
    MotorStop();
  }
}

Hallo nochmal, habs jetzt soweit programmiert, funktioniert auch, der Motor stopt aber nur wenn ich ButtonStateAlt nicht ButtonState setze. Was macht ButtonStateAlt?

void loop() {
  
  
  BUTTONState = digitalRead(BUTTON);
  if (BUTTONState && !BUTTONStateAlt){
    cw(127);                    // Motorsteuerung
    intervall = 5000;
    prevMillis = millis();
  }
  // BUTTONStateAlt = BUTTONState;
  if (millis() - prevMillis >= intervall) {
    MotorStop();
  }
}

Den alten Wert speichern von BUTTONState.

Aber das kannst du anders lösen.

if(BUTTONState != BUTTONStateAlt)
{
BUTTONStateAlt = BUTTONState;
if(BUTTONState)
{
prevMillis=millis();
//...
}
}

Somox: ... der Motor stopt aber nur wenn ich ButtonStateAlt nicht ButtonState setze.

Mein Testprogramm funktioniert:

const byte BUTTON = 3;
unsigned long prevMillis;
int intervall;
bool BUTTONState;
bool BUTTONStateAlt;

void setup() {
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  BUTTONStateAlt = digitalRead(BUTTON);
}

void loop() {
  BUTTONState = digitalRead(BUTTON);
  if (BUTTONState && !BUTTONStateAlt) {
    digitalWrite(13, HIGH);
    intervall = 10000;
    prevMillis = millis();
  }
  BUTTONStateAlt = BUTTONState;
  if ( millis() - prevMillis >= intervall) {
    digitalWrite(13, LOW);
  }
}

Danke @agmue

jetzt funktioniert es super. Hatte BUTTONState nicht als bool festgelegt.

Muss man nach dem MotorStop noch irgendwas wieder auf 0 setzen ? Hab eben ein paar Durchgänge gemacht und irgendwann stoppte der Motor nicht mehr.