Arrancar temporizador con interruptor [SOLUCIONADO]

Hola a todos.
Soy nuevo en Arduino y estoy dando mis primeros pasos, en mi época laboral trabajé con STEP7 de Siemens y estoy intentando trasladar mis pocos conocimientos de programación de PLC al entorno Arduino solo en plan didáctico.
Mi problema:
En STEP7 hay un tipo de temporización que se denomina "temporizador como impulso prolongado" , dicho temporizador arranca con una condición y dicha condición se tiene que mantener mientras transcurre el tiempo, si la condición cae el tiempo y lo que queramos activar también.
El código es este:

bool puls2=false;
bool puls3=false;
unsigned long tinicio;//Aqui se vuelca el valor de los millis
unsigned long tcorre;//Valor del tiempo desde tinicio
unsigned long tpulsado;
int valortiempo=5000;//Tiempo deseado
const int marcha=2;//Pulsador de marcha
const int paro=3;//Pulsador de paro o reset
const int lmarchatiempo=8;//led de tiempo corre
const int lfinaltiempo=9;//Led de tiempo finalizado
bool tactivo=false;//Temporizador en marcha

void setup() {
pinMode(marcha, INPUT) ;//Declaramos el pulsador marcha como entrada
pinMode(paro, INPUT) ;//  Declaramos el pulsador paro como entrada 
pinMode(lmarchatiempo,OUTPUT);//Led de marcha como salida
pinMode(lfinaltiempo,OUTPUT);//Led de final como salida
Serial.begin(9600);//Activamos la comunicacion Serie  
bool tactivo=0;
//int pulsado=0;
unsigned long tinicio=0;
unsigned long tcorre=0;
unsigned long tpulsado=0;

}

void loop() {
  if (digitalRead(marcha)==HIGH)
  {
    puls2=true;
    tinicio=millis();
  }
  if (puls2==true)
  {
    tactivo=true;
//    tcorre=millis()-tinicio;
    puls2=false;
  }
  
  if (tactivo == true && puls2==false)
  {
    tcorre=millis()-tinicio;
  }

  if (digitalRead(paro)==HIGH || millis()-tinicio>=valortiempo)
  {
    puls2=false;
    tcorre=0;
  }

  Serial.println(tcorre);
}

El caso es que si uso un pulsador el código funciona correctamente pero siempre al soltar el pulsador, si lo mantengo pulsado el tiempo no arranca hasta que no lo suelto.
He probado a poner condiciones que simulen soltar el pulsador pero no funciona, siempre arranca el tiempo al soltar físicamente el pulsador por lo que si en vez de un pulsador conectara un interruptor el tiempo no corre.
No sé si hay alguna solución a esto.
Muchas gracias de antemano.

Si lo hago de esta manera tampoco funciona:

 if (puls2==true)
  {
    tactivo=true;
    tcorre=millis()-tinicio;
    puls2=false;
  }
  
//  if (tactivo == true && puls2==false)
//  {
//    tcorre=millis()-tinicio;
//  }

He escrito solamente el código modificado

El problema reside en usar solo digitalRead. Deberías detectar un cambio en el pin, y activar el temporizador hay. Cuando vuelva a haber otro cambio, tienes que desactivar el temporizarador y la salida.

Para simular correctamente un flanco ascendente o descendente te recomiendo que leas el tutorial que hice: Como NO leer un botón y como SI debemos hacerlo. El tutorial está pensado para pulsadores, pero se puede usar también para interruptores.

He añadido a tu sketch "Leyendo un botón con antirebote por software" la parte del mio que me interesa y funciona correctamente.
El problema es que vengo del mundo del PLC donde estos problemas de rebotes y estados no existen y me resulta lioso entenderlo.
Evidentemente tengo que dedicar mas horas al tema.
Muchas gracias por tu dedicación.

Es que ahora trabajas directamente con el microcontrolador, no tienes toda la circuitería adicional que tiene el PLC alrededor del microcontrolador.
De a poco, tranquilo, y cuando menos lo pienses ya lo tienes dominado.

Muchas gracias por tus palabras.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.