Amigos resulta ser que tengo un problema con un sensor HC-SR04, lo tengo programado para cuando un objeto este a menos de 20 cm se encienda un Led o de lo contrario se apague...
Mi inconveniente es que el sensor arroja por unos instantes el valor "0" (cero centímetros) sin que tenga ningún tipo de obstáculo presente y hace encender mi Led por un instante cosa que no quiero que pase :
O en el peor de los casos se queda congelada en "0" todo el tiempo sin importar lo que haga, hasta apretar de nuevo el botón de reset del arduino...
ESTE ES EL CÓDIGO QUE ESTOY USANDO
#define trigPin 9
#define echoPin 8
#define led 12
void setup()
{ Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
}
void loop()
{
long duracion, distancia ;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracion = pulseIn(echoPin, HIGH) ;
distancia = duracion / 2 / 29.1 ;
Serial.println(String(distancia) + " cm.") ;
if ( distancia < 20 )
digitalWrite ( led , HIGH) ;
else
digitalWrite( led , LOW) ;
delay (500) ;
}
Hola yo utilizo este código te lo dejo para ver si te sirve es similar al que usas solo que yo puse en el rango de distancia mínima 10 cm. También podrías usar la librería NewPing que esta muy bien optimizada para este tipo de sensores. Saludos
Código:
#define Pecho 6
#define Ptrig 7
long duracion, distancia;
void setup() {
Serial.begin (9600); // inicializa el puerto seria a 9600 baudios
pinMode(Pecho, INPUT); // define el pin 6 como entrada (echo)
pinMode(Ptrig, OUTPUT); // define el pin 7 como salida (triger)
pinMode(13, 1); // Define el pin 13 como salida
}
void loop() {
digitalWrite(Ptrig, LOW);
delayMicroseconds(2);
digitalWrite(Ptrig, HIGH); // genera el pulso de triger por 10ms
delayMicroseconds(10);
digitalWrite(Ptrig, LOW);
duracion = pulseIn(Pecho, HIGH);
distancia = (duracion/2) / 29; // calcula la distancia en centimetros
if (distancia >= 500 || distancia <= 0){ // si la distancia es mayor a 500cm o menor a 0cm
Serial.println("---"); // no mide nada
}
else {
Serial.print(distancia); // envia el valor de la distancia por el puerto serial
Serial.println("cm"); // le coloca a la distancia los centimetros "cm"
digitalWrite(13, 0); // en bajo el pin 13
}
if (distancia <= 10 && distancia >= 1){
digitalWrite(13, 1); // en alto el pin 13 si la distancia es menor a 10cm
Serial.println("Alarma......."); // envia la palabra Alarma por el puerto serial
}
delay(400); // espera 400ms para que se logre ver la distancia en la consola
}
lo acabo de probar... me soluciono el problema del parpadeo del led por unos instantes pero el otro problema sigue el de quedarse congelado
ah y gracias por la ayuda
mike_117:
Hola yo utilizo este código te lo dejo para ver si te sirve es similar al que usas solo que yo puse en el rango de distancia mínima 10 cm. También podrías usar la librería NewPing que esta muy bien optimizada para este tipo de sensores. Saludos
Yo creo que no existen distancias negativas, en todos caso usaría una variable tipo float
float distancia;
Y como la tienes definida como long lo que sigue es una barbaridad (desde el punto de vista de programación) y ya lo explico.
distancia = (duracion/2) / 29;
Divides un numero largo x 2 y luego por 29, lo que genera un resultado del tipo long tamb.
Asi que supongamos que la lectura fuera menor a 29x2 = 58.
Supongamos 57, tendrías 57/2/29 = 0 y cualquier valor que entregue duración entre 1 y 57 dará 0
Ahora si lo pones como float mira el cambio
para duracion = 1 => distancia = 1/2/29 = 0.17
para duracion = 57 => distancia = 57/2/29 = 0.983
Mira que cambio por definir correctamente el tipo de variable.
Prueba y nos cuentas.
Aha! ahora lo tengo claro... disculpa estoy empezando recién en el mundo de arduino y la programación
pero sigue con los dos problemas incluso cambiando a (float), el parpadeo lo pude solucionar con el código de @mike_117
pero sigue quedándose congelado he notado que me pasa cuando llego a tocar físicamente el sensor, si no lo llego a tocar funciona bárbaro... Hice un vídeo para que entiendan mejor lo que ocurre...
surbyte:
Y como la tienes definida como long lo que sigue es una barbaridad (desde el punto de vista de programación) y ya lo explico.
distancia = (duracion/2) / 29;
Divides un numero largo x 2 y luego por 29, lo que genera un resultado del tipo long tamb.
Asi que supongamos que la lectura fuera menor a 29x2 = 58.
Supongamos 57, tendrías 57/2/29 = 0 y cualquier valor que entregue duración entre 1 y 57 dará 0
Ahora si lo pones como float mira el cambio
para duracion = 1 => distancia = 1/2/29 = 0.17
para duracion = 57 => distancia = 57/2/29 = 0.983
Mira que cambio por definir correctamente el tipo de variable.
Prueba y nos cuentas.
dices que el código que te postee te sirvio no? podrías volver a subir el nuevo código que estas usando incluyendo las modificaciones que has hecho
Otra observación, eh visto el video que has incluido y se me hace muy raro el hecho de que cuando tocas el sensor este se "buguea" por así decirlo, mi experiencia no es mucha pero pues has intentado cambiar ese sensor por otro y probar? digo esto porque cuando recién empecé a usar estos sensores en una ocasión termine quemando uno, por curiosidad lo deje enfriar como 10 min y lo volví a probar a ver si funcionaba, me sorprendió el hecho de que si lo hiciera pero minutos después de hacer algunas pruebas me pasaba algo similar a lo que te esta pasando ahorita, el caso es que termine por reemplazar ese sensor por otro y nuevamente pude trabajar bien.
Pues la verdad tengo 2 sensores y son nuevos y el fallo ocurre con los 2...
Este es el código que me pasaste solo le cambie los pines:
#define Pecho 8
#define Ptrig 9
float duracion, distancia;
void setup() {
Serial.begin (9600); // inicializa el puerto seria a 9600 baudios
pinMode(Pecho, INPUT); // define el pin 6 como entrada (echo)
pinMode(Ptrig, OUTPUT); // define el pin 7 como salida (triger)
pinMode(12, 1); // Define el pin 13 como salida
}
void loop() {
digitalWrite(Ptrig, LOW);
delayMicroseconds(2);
digitalWrite(Ptrig, HIGH); // genera el pulso de triger por 10ms
delayMicroseconds(10);
digitalWrite(Ptrig, LOW);
duracion = pulseIn(Pecho, HIGH);
distancia = (duracion/2) / 29; // calcula la distancia en centimetros
if (distancia >= 500 || distancia <= 0){ // si la distancia es mayor a 500cm o menor a 0cm
Serial.println("---"); // no mide nada
}
else {
Serial.print(distancia); // envia el valor de la distancia por el puerto serial
Serial.println("cm"); // le coloca a la distancia los centimetros "cm"
digitalWrite(12, 0); // en bajo el pin 13
}
if (distancia <= 10 && distancia >= 1){
digitalWrite(12, 1); // en alto el pin 13 si la distancia es menor a 10cm
Serial.println("Alarma......."); // envia la palabra Alarma por el puerto serial
}
delay(400); // espera 400ms para que se logre ver la distancia en la consola
}
Probé con un arduino mega ese mismo código se congela al empezar , cambie el codigo y funciona, solo que con el problema de siempre al tocarlo se queda congelado
mike_117:
dices que el código que te postee te sirvio no? podrías volver a subir el nuevo código que estas usando incluyendo las modificaciones que has hecho
Otra observación, eh visto el video que has incluido y se me hace muy raro el hecho de que cuando tocas el sensor este se "buguea" por así decirlo, mi experiencia no es mucha pero pues has intentado cambiar ese sensor por otro y probar? digo esto porque cuando recién empecé a usar estos sensores en una ocasión termine quemando uno, por curiosidad lo deje enfriar como 10 min y lo volví a probar a ver si funcionaba, me sorprendió el hecho de que si lo hiciera pero minutos después de hacer algunas pruebas me pasaba algo similar a lo que te esta pasando ahorita, el caso es que termine por reemplazar ese sensor por otro y nuevamente pude trabajar bien.
Pon el esquema de conexionado.
Cambia los pines de echo y trigger.
He visto que en el video que usas un micro (o nano), si tiene un uno a mano prueba el codigo.
En codigo prueba esto y dinos versión del ide.
duracion = pulseIn(Pecho, HIGH);
distancia = (duracion/2.0)/29.0;
Acabo de cambiar los pines y el pedazo de código y sigue con lo mismo, al tocar varias veces el sensor se traba, estoy usando la versión 1.0.6 de arduino
algunas veces ni el botón de reset del arduino lo hace funcionar de vuelta tengo que desconectar de la fuente
enseguida subo el esquema
victorjam:
Pon el esquema de conexionado.
Cambia los pines de echo y trigger.
He visto que en el video que usas un micro (o nano), si tiene un uno a mano prueba el codigo.
En codigo prueba esto y dinos versión del ide.
No es lógico que se quede colgado el arduino solo por eso, y más que colgado cuando al hacerle un reset tampoco funciona... Como te he dicho antes prueba, si puedes, a cambiar el arduino por otro, a ser posible que no sea micro... para mi gusto son malisimos...
esto es muy raro si lo dejas funcionando se congela solo, luego vuelve a funcionar por un rato después se congela y asi continua....
tengo un mega voy a probar con eso y les aviso gracias a todos!
victorjam:
No es lógico que se quede colgado el arduino solo por eso, y más que colgado cuando al hacerle un reset tampoco funciona... Como te he dicho antes prueba, si puedes, a cambiar el arduino por otro, a ser posible que no sea micro... para mi gusto son malisimos...
Intenta alimentarlo con una fuente que al menos entregue 7V, 9 o 12 estan bien. Mira bien de respetar la polaridad del conector externo.
Por otro lado verifica esos cables con los que tienes conectado el sensor ultrasonido. No es posible que lo toques y se tilde el arduino.
Algo esta mal, o algo hace una mala conexión. Son suposiciones, no afirmaciones.
Un modulo puede tener algo malo pero 2 no. Asi que suena a un error de conexionado o de alimentación.
Revisa todo con espíritu crítico. Lo que veas raro, pues lo cambias o mejoras.
He probado cambiando los cables, de pines, de fuente (le puse una de 9V) pero estando el arduino quieto sin moverse no se congela pero cuando empiezo a mover de un lado para el otro funciona por un momento luego se queda congelada... no se mas que puedo hacer amigo
surbyte:
Intenta alimentarlo con una fuente que al menos entregue 7V, 9 o 12 estan bien. Mira bien de respetar la polaridad del conector externo.
Por otro lado verifica esos cables con los que tienes conectado el sensor ultrasonido. No es posible que lo toques y se tilde el arduino.
Algo esta mal, o algo hace una mala conexión. Son suposiciones, no afirmaciones.
Un modulo puede tener algo malo pero 2 no. Asi que suena a un error de conexionado o de alimentación.
Revisa todo con espíritu crítico. Lo que veas raro, pues lo cambias o mejoras.
Si te refieres a la última parte del todo, es el uso de un "fuera de tiempo" o timeout. Ello hace que la función pulseIn pasado un tiempo, termine de ejecutarse.
Por ejemplo:
duracion=pulseIn(echo, HIGH, 1000);.
Transcurridos 1000 microsegundos (1 milisegundo), si no se ha recibido ningún pulso, entonces deja de esperar y sale de la función, devolviendo el valor 0.
Es como si no hubiera recibido nada del sensor de ultrasonidos y sale.
En teoria, eso evitaría que el arduino se bloquease en esa función y se quedará parado cuando estas midiendo, cosa que creo que no es tu caso.
Sigo pensando que sea un problema del arduino, ¿has probado con el mega?
Ah entiendo! Pensaba que era mi caso como se me trababa y mostraba 0cm en el monitor ya he probado con el mega y es lo mismo, si dejas el sensor quieto no hace nada pero empiesas moverlo y tarde o temprano se traba...
Pensaba que era algun cable que estaba flojo pero tampoco...
Que mas podria ser?
victorjam:
Si te refieres a la última parte del todo, es el uso de un "fuera de tiempo" o timeout. Ello hace que la función pulseIn pasado un tiempo, termine de ejecutarse.
Por ejemplo:
duracion=pulseIn(echo, HIGH, 1000);.
Transcurridos 1000 microsegundos (1 milisegundo), si no se ha recibido ningún pulso, entonces deja de esperar y sale de la función, devolviendo el valor 0.
Es como si no hubiera recibido nada del sensor de ultrasonidos y sale.
En teoria, eso evitaría que el arduino se bloquease en esa función y se quedará parado cuando estas midiendo, cosa que creo que no es tu caso.
Sigo pensando que sea un problema del arduino, ¿has probado con el mega?