Estoy intentando que con pulsein me devuelva por serial el tiempo que se tiene presionado un boton, el codigo que estoy usando es el siguiente:
int boton = 7;
unsigned long time;
void setup ()
{
Serial.begin(9600);
pinMode(7,INPUT);
}
void loop ()
{
time = pulseIn(7,HIGH);
if (time > 0)
{
Serial.println(time);
}
}
Los resultados que no acabo de entender son estos:
116568
132507
49819
55191
134373
201456
126634
131996
144085
159352
260292
51343
38294
103622
74522
116732
23027
184341
999114
324213
1127960
62875
531987
118993
132622
637835
Son todo pulsaciones cortas inferiores a 3 segundos, asi que no entiendo a que corresponden los valores que me devuelve...
Asi que aqui van las preguntas, para entender que estoy haciendo mal:
¿Que valores me está devolviendo?
¿Como modifico el codigo para que me devuelve el valor del tiempo en milis que el boton ha estado presionado?
Si el codigo estuviera correcto... por que no me devuelve el tiempo en pulsaciones mayores a 3 segundos? Dejo presionado el boton mas de tres segundos y no me devuelve nada por serial.
Segun la referencia de esta funcion ,el tiempo se devuelve en microsegundos,o sea que deberias dividir por 1 millon para obtener el tiempo en segundos o por 1000 para milisegundos..... https://www.arduino.cc/en/Reference/PulseIn
Gracias jose esa parte solucionada entonces, me devuelve la duración de la pulsacion, ahora... alguien sabría decirme por que no me devuelve pulsaciones de mas de 3 segundos? o como hacer que me de la pulsacion en milis?
en cuanto a lo primero,no lo se ,segun la referencia deberia funcionar bien hasta pulsos de 3 minutos.en cuanto a lo segundo ,ya te lo he puesto arriba :
Gracias por vuestras respuestas, jose con time/1000 se soluciona el problema de los microsegundos, muchas gracias
Go_zalo, no te voy a negar que soy muuuyyy novato, asi que te cuento lo que he conectado por que lo mismo me falta algo,
He probado con un pulsador de arduino bq que es este, en low Redirect Notice
Y en high estoy probando con un mando a distancia, que es lo que usaré para el proyecto. en un proyecto anterior con el mismo mando, antes de descubrir pulseIn, use esto y funcionaba correctamente:
int tiempo = 0;
int tiempo2 = 0;
int tiempo3 = 0;
....
buttonState = digitalRead(buttonPin);
//Cuando esta presionado el boton mide cuanto tiempo esta presionado
if (buttonState == HIGH) {
tiempo=millis();
while(buttonState == HIGH) {
tiempo2=millis();
buttonState = digitalRead(buttonPin);
}
tiempo3=tiempo2-tiempo;
//1ª posibilidad si está presionado menos de tres segundos next
if (tiempo3 <= 2999){
mp3.next();
}
Hola si esperas un pulso HIGH deberás haber colocado una resistencia pulldown a GDN y el pulsador hacia VCC
Esto esta correcto? por ir descatando problemas
Lo he montado con boton directamente, sin mando a distancia con resistencia pulldown a gng y el pulsador hacia vcc, pero no me devuelve pulsaciones de mas de un segundo, he cambiado la placa de arduino, he probado con una freeaduino de bq versión v 1.81 y con una atmega 328p, en los dos casos me sigue dando el problema de no devolver el tiempo en pulsaciones mayores a 1 segundo, también he probado a ponerlo en low, cambiando las conexiones etc, y nada... me tiene loco esto.
pulsein tiene un tercer parametro,timeout,que si se omite tiene un valor de un segundo,esto delimita el tiempo que va a tardar pulsein en recibir el comienzo del pulso ,si no se ha recibido impulso en ese tiempo ,la funcion devuelve 0 ,a ver si va a ser eso lo que te esta fallando .prueba a poner un parametro mayor que un segundo (en microsegundos) a ver que pasa. https://www.arduino.cc/en/Reference/PulseIn