pulsein()

Descripción

Lee un pulso (HIGHo LOW) en un pin. Por ejemplo, si el valor es alto, pulseIn () espera a que el pin pase a nivel HIGH, se inicia el tiempo, espera a que el pin pase a nivel LOW y para el cronómetro. Devuelve la longitud del impulso en microsegundos o 0 si no se recibe un pulso completo dentro del tiempo de espera.
La temporización de esta función se ha determinado empíricamente y probablemente mostrará errores en los pulsos más cortos. Funciona en pulsos de 10 microsegundos a 3 minutos de duración. Tenga en cuenta también que si el pin ya está a nivel HIGH cuando la función es llamada, se espera que el pin pase a nivel LOW y luego a nivel HIGH antes de que empiece a contar. Esta rutina se puede utilizar sólo si se activan las interrupciones. Por otra parte la resolución más alta se obtiene con intervalos cortos.

Sintaxis

pulseIn (pin, value) 

pulseIn (pin, value, timeout)

Parámetros

pin: el número de pin en el que desea leer el pulso. (int)
value: tipo de pulso a leer: HIGH o LOW. (int)
timeout (opcional): el número de microsegundos que espera a que el pulso se complete: la función devuelve 0 si el pulso completo no se recibe dentro del tiempo de espera. Por defecto es de un segundo (unsigned long).
timeout, si se usa, es recomendable que sea, al menos, 1,3 veces sueperior a la duración del pulso a medir. Por ejemplo, si se mide un pulso de duración 0,01 segundo, timeout deber ser al menos 13000.

Retornos

La longitud del pulso (en microsegundos) o 0 si el pulso no se completa dentro del tiempo de espera (long sin signo)

Ejemplo

Este ejemplo muestra en el monitor serie la duración del impulso aplicado a la entrada 2 del Arduino. 
A partir de la duración del impulso se calcula la frecuencia y el número de pulsos por segundo.

El pulso puede provenir de un generador de pulsos en general o también se puede generar con otra placa Arduino mediante un sketch que simule un tren de pulsos.

float Pulso;
float Tiempo = 0;
float Frecuencia = 0;
int NumeroPulsos = 0;
void setup ()
{
Serial.begin (9600);
}

void loop ()
{
Pulso = pulseIn (2, HIGH, 15000);
Tiempo = Pulso / 1000000;
if (Tiempo > 0.001)
{
Serial.print ("Duracion del pulso: ");
Serial.print (Tiempo);
Serial.println (" segundos");
Serial.println (" ");
}

Frecuencia = 1 / Tiempo;
Serial.print ("Frecuencia: ");
Serial.print (Frecuencia);
Serial.println (" Hz");
Serial.println (" ");


NumeroPulsos = Frecuencia * 60;
Serial.print ("Numero de pulsos/segundo: ");
Serial.println (NumeroPulsos);
Serial.println (" ");
Serial.println (" ");

delay (1000);
}

19 comentarios:

  1. Hola, ¿Como puedo hacer para medir el tiempo de un boton pulsado? por ejemplo "Si pulso boton durante X segundos ejecuta esto.."

    ResponderEliminar
  2. Elimino el post anterior porque entiendo que quieres hacerlo con esta instrucción, pulseIn().

    Ejemplo:

    float Pulso;
    float Tiempo = 0;

    void setup ()
    {
    Serial.begin (9600);
    }

    void loop ()
    {
    Pulso = pulseIn (2, HIGH, 100000000);
    Tiempo = Pulso / 1000000;
    if (Tiempo > 0.05)
    {
    Serial.print ("Duracion del pulso: ");
    Serial.print (Tiempo);
    Serial.println (" segundos");
    }
    }

    Cada ves que el pin 2 pase a nivel HIGH, medirá el tiempo que se tarda en soltar el botón y escribirá este tiempo en el monitor serie.

    A partir de esto se puede hacer una comparación y realizar otras acciones.

    ResponderEliminar
    Respuestas
    1. Hola Manuel Delgado y equipo. Gracias por su trabajo.

      Ya que me has dado una idea, tengo pensado un pequeño proyecto: Activar y desactivar una ALARMA con una puls. prolongada(5sec en mi caso)por el pin 2.
      Una especie de DEBOUNCE (Blink ) Pulsacion de 5sec pin HIGH, pulsacion 5 sec pin LOW.
      He llegado hasta la mitad, enciende bien, pero no se como apagarlo. Porfa si algien me puede echar un cable!!! Grcias

      Aqui les dejo el ejemplo, igual es de ayuda para alguno con la misma duda...
      Saludos

      ----------------------------------------------------------------------

      /************ Activacion ALARMA por tiempo de pulsacion ***************/


      const int ledPin = 13;

      float Pulso;
      float Tiempo = 0;

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

      void loop ()
      {
      Pulso = pulseIn (2, HIGH, 100000000);
      Tiempo = Pulso / 1000000;

      if (Tiempo > 5.00) // Tiempo en segundos transcurido con el pulsador apretado
      {
      Serial.print ("Duracion del pulso: ");
      Serial.print (Tiempo);
      Serial.println (" segundos");

      digitalWrite(ledPin, HIGH); // Activar alarma
      Serial.println (" << Alarma On! >> ");
      }
      }

      Eliminar
  3. Gracias amigo me sirvío de mucho, solo tengo una pregunta. si quisisera hacerlo mas preciso, a un nivel que reconosca un golpe rapido de una piedra como lo haria?

    ResponderEliminar
    Respuestas
    1. Debes especificar más datos. Con que fuerza actuaría la piedra, en que superficie impactaría, etc.

      Si lo deseas, puedes pasarme los datos al email.

      Eliminar
    2. Debes especificar más datos. Con que fuerza actuaría la piedra, en que superficie impactaría, etc.

      Si lo deseas, puedes pasarme los datos al email.

      Eliminar
    3. Ahi es mejor q uses interrupciones

      Eliminar
  4. disculpa como puedo hacer para comparar el tiempo entre pulsos es decir quiero comparar si el tiempo en tre un pulso y otro es el mismo o ed diferente para que realice alguna funcion en cada caso

    ResponderEliminar
  5. Buena noche, ando haciendo un diferenciador de las diferentes monedas con un sensor infrarrojo, como hago para obtener mas datos de tiempo, pues los tiempos son muy parecidos cada ves q interrumpe el pulso del sensor

    ResponderEliminar
  6. Hola tiene algún libro "fuente" de donde extrajo ese dato de que la función pulsein funciona con 10 microsegundos hasta 3 minutos; o el código con que obtuvo ese tiempo tan pequeño empíricamente.

    ResponderEliminar
    Respuestas
    1. Ve a la pagina de referencia del arduino ahi lo encontraras todo eso si en ingles. Saludos

      Eliminar
  7. Talvez algún diagrama q m ayuden ... tngo que hacer un tacometro casero usando un encoder, sensor tipo herradura ...

    ResponderEliminar
  8. Buenas , te hago una consulta, como hago para medir frecuencia a la red 220VAC/50Hz sin usar interrupciones.
    PD: Estoy usando un optoacoplador cruce por cero (H11AA1)
    Muchas gracias

    ResponderEliminar
  9. Disculpen soy nuevo en arduinio, me gustaria hacer que si se presiona el botón, en un periodo de 2 segundos deberá realizar un ciclo de 4 estados:
    Estado 1: Medio Segundo Prendido.
    Estado 2: Medio Segundo Apagado.
    Estado 3: Medio Segundo Prendido.
    Estado 4: Medio Segundo Apagado.
    Si el boton no esta presionado no debera suceder nada.
    Si despues de 2 segundo el botón sigue presionado se repite el cambio de estados.

    alguien me puede ayudar?

    ResponderEliminar
    Respuestas
    1. Hola, utilizando la info de MuRy_74
      puedes agregar las sentencias if
      y tendrás el programa andando

      lo de los estados es lo mas facil

      Eliminar
  10. Hola, Buenas, quiero hacer un copiador, osea grabar una secuencia de pulsaciones de un botón (Cantidad y Tiempo entre pulsaciones) y luego reproducir lo grabado en una salida digital, seria con 2 modos! 1- modo copiador y 2-modo reproducción. lo podre hacer con pulsein?

    ResponderEliminar
  11. Hola todos, veo variedad de aplicaciones con la misma lógica del origen, y yo soy uno mas. Tengo un contador que suma las veces que se pulsa un botón, pero necesito que además de contar, regrese a su estado inicial = 0, pero no lo logro. Agradezco su ayuda, comparto mi código:

    void loop() {
    // read the pushbutton input pin:
    EstadoInicial = digitalRead(buttonPin);

    // compare the EstadoInicial to its previous state
    if (EstadoInicial != nuevoEstadoInicial) {
    // if the state has changed, increment the counter
    if (EstadoInicial == 0) {
    // if the current state is 0 then the button went from on to total:
    Total++;
    Serial.println("on");
    Serial.print("Cantidad ingesada: ");
    Serial.println(Total);
    } else {
    // if the current state is LOW then the button went from on to Total:
    Serial.println("Total: ");
    }
    // Delay a little bit to avoid bouncing
    delay(10);
    }

    ResponderEliminar
  12. Que cantidad de frecuencia. Máxima. Servirá la. Función pulse in(), soporto ra 20 khz

    ResponderEliminar
  13. lo que deseo es como hacer que un pulso del teclado genere 10 pulsos

    ResponderEliminar