Programa temporizado

Hola, me acabo de iniciar en Arduino, no tengo ni idea de programación y he encontrado un programa que me va muy bien para lo que quiero hacer pero me falta añadir como poder parar el programa después de un tiempo determinado.

Es un motor con 3 pulsadores (stop, marcha velocidad 1, marcha velocidad 2) el programa que he encontrado me hace esa función pero no la de temporizador y no tengo ni idea de como modificar el programa, a ver si me podéis ayudar.
Lo que quiero hacer es que cuando se pulse un botón, la tarea dure 5 minutos y se pare, vuelva al stop. Y su pulso el otro botón que haga lo mismo.

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int servoPin = 9;// this pin must be of those with PWM ~


#define STOPpin 3 // push button pin  for STOP
#define CWpin 2 //  push button for CW
#define CCWpin 4 // push button for CCW

int sc[]={106, 58, 0};// servo commands are in order 
       //CCW, STOP,CW
       
String scText[]={"CCW","Stop","CW"};// define texts for 3 action
int statusText;
int CWBS, CCWBS, SBS;
     //CW button status (CWBS)
     //CCW button status (CCWBS)
     //stop button status (SBS)

void setup() {
 Serial.begin(9600);
 pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
 pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW  
 pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW
   
 myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
 myservo.write(sc[1]);// send STOP command
 statusText=1;// initial value is STOP
}



void loop() {

   CCWBS = digitalRead(CCWpin);// read status of button CCW
   SBS = digitalRead(STOPpin);// read status of button STOP
   CWBS = digitalRead(CWpin);// read status of button CW
       
   if(CCWBS ==LOW)
   {
     servoCommand(0);
   }else if(SBS ==LOW)
   {
     servoCommand(1);
   }else if(CWBS ==LOW)
   {
     servoCommand(2);
   }
   
 Serial.println(scText[statusText]);
 delay(50);
}// loop 



void servoCommand(int n)
{
  statusText = n;
  myservo.write(sc[n]); 
  Serial.print("Going to  ");
  Serial.print(scText[n]);
  Serial.print( "(");
  Serial.print(sc[n]);
  Serial.println(")");
}

Hola Santos83, bienvenido. Lo primero pedirte que leas las normas del foro y edites tu mensaje. Todo código debe ir entre las etiquetas adecuadas.

Luego debes especificar que significa para ti "temporizador" un retardo ? que tiempo ? que lo debe activar ? como se desactivara luego ?

Hola Kike, gracias por contestar, ya he modificado el mensaje, a ver si ahora se entiende bien.

A ver si me puedes ayudar.

Gracias.

Hola Santos, aquí tienes tu código modificado con todo lo que necesitas.

Me extraña que utilices la librería Servo.h si estas controlando un Motor, pero bueno, desconozco el tipo de Driver que usas y si dices que te funciona así, pues me he basado en tu código.

Lo he modificado y he añadido la funcionalidad de estar girando hacia una dirección durante un tiempo determinado y que pare, igual seria hacia la otra dirección. Ademas como extra te he añadido la funcionalidad de que puedes añadir un retraso al empezar a girar (para que no empiece justo cuando pulsas) aunque esta puesta a 0.

#include <Arduino.h>
#include <Servo.h>

Servo myservo;

const int servoPin = 9;
const int STOPpin = 3;
const int CWpin = 2;
const int CCWpin = 4;

unsigned long TiempoPulsadoCW; 
unsigned long TiempoCW; 
unsigned long RetardoEncendidoCW = 0; //Tienpo que tarda en empezar a girar desde que pulsas el boton de giro CW (Derecha)
unsigned long RetardoApagadoCW = 300000; //Tiempo que dura girando desde que empieza
bool CWListo = false;
bool CWEstado = false;

unsigned long TiempoPulsadoCCW;
unsigned long TiempoCCW;
unsigned long RetardoEncendidoCCW = 0; //Tienpo que tarda en empezar a girar desde que pulsas el boton de giro CCW (Izquierda)
unsigned long RetardoApagadoCCW = 300000; //Tiempo que dura girando desde que empieza
bool CCWListo = false;
bool CCWEstado = false;

int sc[]={106, 58, 0};
String scText[]={"CCW","Stop","CW"};
int statusText;
int CWBS, CCWBS, SBS;

void setup() {

    Serial.begin(9600);
    pinMode(STOPpin,INPUT_PULLUP);
    pinMode(CCWpin,INPUT_PULLUP);
    pinMode(CWpin,INPUT_PULLUP);
   
    myservo.attach(servoPin);
    myservo.write(sc[1]);
    statusText=1;
}



void loop() {

    unsigned long TiempoActualCW = millis();
    unsigned long TiempoActualCCW = millis();

    CWBS = digitalRead(CWpin);
    CCWBS = digitalRead(CCWpin);
    SBS = digitalRead(STOPpin);

    if (CWBS == LOW) {
        TiempoPulsadoCW = TiempoActualCW;
        CWListo = true;
    }

    if (CWListo == true) {

        if ((unsigned long)(TiempoActualCW - TiempoPulsadoCW) >= RetardoEncendidoCW) {
            servoCommand(2);
            CWEstado = true;
            TiempoCW = TiempoActualCW;
            CWListo = false;
        }
    }

    if (CWEstado == true) {

        if ((unsigned long)(TiempoActualCW - TiempoCW) >= RetardoApagadoCW) {
            CWEstado = false;
            servoCommand(1);
        }
    }

    if (CCWBS == LOW) {
        TiempoPulsadoCCW = TiempoActualCCW;
        CCWListo = true;
    }

    if (CCWListo == true) {

        if ((unsigned long)(TiempoActualCCW - TiempoPulsadoCCW) >= RetardoEncendidoCCW) {
            servoCommand(0);
            CCWEstado = true;
            TiempoCCW = TiempoActualCCW;
            CCWListo = false;
        }
    }

    if (CCWEstado == true) {

        if ((unsigned long)(TiempoActualCCW - TiempoCCW) >= RetardoApagadoCCW) {
            CCWEstado = false;
            servoCommand(1);
        }
    }

    if (SBS == LOW) {
        servoCommand(1);
    }

    Serial.println(scText[statusText]);
    delay(50);

}

void servoCommand(int n) {

    statusText = n;
    myservo.write(sc[n]);
    Serial.print("Yendo a ");
    Serial.print(scText[n]);
    Serial.print( "(");
    Serial.print(sc[n]);
    Serial.println(")");

}

Que mákina angelxulo, funciona perfecto, Muchas gracias man!!!!!.

Una pregunta cómo podría aprendr a programar así? lo que encuentro són la mayoría led que se programamn de manera sencilla pero que no entran realmente ne la programación para entender realmente el lenguaje.

Muchas gracias de nuevo.