Medidor de tiempo de respuesta

Hola a todos, estoy intentando crear con arduino un dispositivo que me sirva para medir el tiempo de respuesta de un dispositivo pero no se como programarlo y me gustaria que me echasen una mano. Lo que quiero es medir el tiempo que transcurre desde que se manda cerrar a un relé hasta que este devuelve la señal de feedback de cierre. Si por ejemplo monitorizo en el pin 8 cuando se la ha mandado cerrar me tiene que indicar el tiempo hasta que ha llegado la señal de respueta al pin 9, vamos el tiempo que transcurre entre ambas simplemente. Para el pin 8 la señal de cierre no la dará el arduino, el simplemente estara a la escucha para medir ese tiempo pero sin formar parte del mecanismo.

Gracias

Explícate mejor: de señal del pin al momento de que el interruptor mecánico hace contacto? O es directamente de pin a pin?

Digamos que me llegara una señal a un pin y entonces debe de empezar a contar el tiempo que terminara cuando llegue la señal al otro. Así que se puede decir que uno activa el cronometro y el otro lo detiene. Ambas serán señales de entrada.

A ver si entendí:

Un pin recibe una señal, comienza la cuenta. Correcto?

Ahora bien, qué la detiene? Otra entrada de señal? (que supongo tu sabrás qué retraso medir)

Lucario448: A ver si entendí:

Un pin recibe una señal, comienza la cuenta. Correcto?

Ahora bien, qué la detiene? Otra entrada de señal? (que supongo tu sabrás qué retraso medir)

Por ejemplo el pin 8 recibe una señal y comienza la cuenta y la detiene la entrada de señal al pin 9.

Que tal algo así?

volatile unsigned long triggerDelay;
volatile boolean triggered = false;
boolean contando = false;
unsigned long onTime;

void setup() {
  Serial.begin(9600);
  attachInterrupt(0, activado, RISING); // Señal de parada debe ir sí o sí, al pin 2
  while (!(PINB & 1)); // PINB & 1 es el equivalente a digitalRead(8); solo que mucho más rápido
  // Espera a recibir una señal
  onTime = micros();
  contando = true;
  while (!triggered);
  contando = false;
  Serial.println(String(triggerDelay - onTime) + " microsegundos.");

}
void activado() {
  if (contando) {
    triggerDelay = micros();
    triggered = true;
    detachInterrupt(0);
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

Pin 8 es el que inicia la cuenta. Pin 2 la detiene (el tiempo de parada es más preciso determinarlo mediante interrupciones, de ahí el pin 2).

Lucario448: Que tal algo así?

volatile unsigned long triggerDelay;
volatile boolean triggered = false;
boolean contando = false;
unsigned long onTime;

void setup() {   Serial.begin(9600);   attachInterrupt(0, activado, RISING); // Señal de parada debe ir sí o sí, al pin 2   while (!(PINB & 1)); // PINB & 1 es el equivalente a digitalRead(8); solo que mucho más rápido   // Espera a recibir una señal   onTime = micros();   contando = true;   while (!triggered);   contando = false;   Serial.println(String(triggerDelay - onTime) + " microsegundos.");

} void activado() {   if (contando) {     triggerDelay = micros();     triggered = true;     detachInterrupt(0);   } }

void loop() {   // put your main code here, to run repeatedly:

}



Pin 8 es el que inicia la cuenta. Pin 2 la detiene (el tiempo de parada es más preciso determinarlo mediante interrupciones, de ahí el pin 2).

Muchísimas gracias, perfecto.

Debo de estar haciendo algo mal. Estoy de momento para probarlo alimentando el pin 8 con los 5v de alimentacion y dejandolo conectado alimento el pin 2 tambien con esos 5v pero en el monitor serie no me imprime el tiempo. Me podeis decir que hago mal o algun esquema de como debe ser correctamente?

Oh vaya, parece que no me habías especificado si las señales se activaban en estado bajo (“falling”), o estado alto (“rising”). El código lo que espera es primero un pulso en pin 8, luego en el pin 2.
Lo que no me queda claro, es en qué estado es ese pulso: alto (3v-5v) o bajo (< 3v o a tierra).

Veo 0 esfuerzo de tu parte. Lucario te hizo el programa y no fuiste capaz de adaptar los puntos de disparo? Si son FALLING o RISING? Entiendo que no sepas cómo empezarlo, pero luego de recibir el empujón, debes dar algo de tu parte, por eso este foro es de ayuda cuando el que lo solicita colabora y se esfuerza, por ahora no veo esfuerzo de tu parte por el momento.

No te molestes por este comentario, encontrarás las justificaciones en las normas del foro.

Lucario448:
Oh vaya, parece que no me habías especificado si las señales se activaban en estado bajo (“falling”), o estado alto (“rising”). El código lo que espera es primero un pulso en pin 8, luego en el pin 2.
Lo que no me queda claro, es en qué estado es ese pulso: alto (3v-5v) o bajo (< 3v o a tierra).

En este caso es en estado alto, para simular probaré con los 5v de la placa. En el proyecto real tendré que usar octocopladores porque recibiré señales de 24v provenientes de un PLC.

Sigo probando, muchisimas gracias por tu aportacion, me es de gran ayuda.

surbyte: Veo 0 esfuerzo de tu parte. Lucario te hizo el programa y no fuiste capaz de adaptar los puntos de disparo? Si son FALLING o RISING? Entiendo que no sepas cómo empezarlo, pero luego de recibir el empujón, debes dar algo de tu parte, por eso este foro es de ayuda cuando el que lo solicita colabora y se esfuerza, por ahora no veo esfuerzo de tu parte por el momento.

No te molestes por este comentario, encontrarás las justificaciones en las normas del foro.

No me molesta en absoluto tu comentario, visto desde fuera es normal que parezca que quiera que me lo den hecho, pero llevo sin usar arduino un tiempo y para este caso concreto tengo muchas dudas

Bien, pero como te dije.. ya te dieron el empujon, ahora intenta por tu cuenta. Ve a documentación y mira los Cursos de 0 a 7 y de 8 en adelante.. te pondrán al corriente. Luego si aún no entiendes pregunta.