viernes, 5 de abril de 2013

hc sr04 con pic en ccs (Medida distancia por sensor de ultrasonido)





#include <16F877.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP    
#use delay(clock=4000000)
                         
#include <lcd.c>


int16 distancia, tiempo;
#define trig pin_B1
#define echo pin_B0
#USE standard_io(b)

void main()
{
   lcd_init();                            
printf(LCD_PUTC, "\f Iniciando.");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando..");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando...");
delay_ms(500);
                           
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

while(1)
{
output_high(trig);                  
delay_us(20);                      
output_low(trig);
while(!input(echo))                    
{}
set_timer1(0);                        
while(input(echo))                    
{}
tiempo=get_timer1();
distancia=(tiempo*10)/(58.0);
printf(LCD_PUTC, "\fTiempo :%Lu \nDistancia = %Lu",tiempo,distancia);
delay_ms(500);
}
}



92 comentarios:

  1. Respuestas
    1. hola, tengo cristal de 8 mhz q parte de la formula o codigo cambiaria con pic 16f887

      Eliminar
  2. De la linea:
    printf(LCD_PUTC, "\fTiempo :%Lu \nDistancia = %Lu",tiempo,distancia)

    Puedes explicarme porfa que significa "%Lu" ?

    PD. Excelente trabajo, yo creí que solo se podía con arduino

    Gracias

    ResponderEliminar
    Respuestas
    1. hola amigo, en la imagen que acabo de montar lo que significa, es para poder expresar los valores que arroja la LCD en este caso Decimal Largo sin Signo

      Eliminar
    2. Es decir, el tiempo es el primer %Lu, y la distancia el 2do %Lu, como son variables, ya que estan cambiando durante el proceso...

      Eliminar
  3. Hola muy buen trabajo. Pero me podrias explicar por qué en esta parte: "distancia=(tiempo*10)/(58.0);"
    el tiempo lo multiplicas por 10 y lo divides por 58?

    Por favor espero tu respuesta.
    Gracias

    ResponderEliminar
    Respuestas
    1. en realidad la ecuacion que recomienda el datasheet es esta,
      range = high level time * velocity (340M/S) / 2 ... pero con el crista que use de 4MHz no funciono.. y saque esa y si me funciono

      Eliminar
    2. hola que tal muy buen trabajo....mi pregunta es y como sacaste esa ecuacuón yo utilizo el pic16f877a pero me da muchos saltos en los valores de distancia y velocidad quisiera que fuera mas exacta como lo logro?

      Eliminar
  4. Oye otra duda!!
    Quiero programar un pic16f84a para el mismo sensor... crees que sea posible? o no son lo mismo con los TIMERS??

    ResponderEliminar
    Respuestas
    1. si se puede, solo que cambiaria la ecuacion ya que el ese pic solo tiene el timer0 de 8 bits...

      Eliminar
    2. Buenas noches, disculpa mi ignorancia pero como quedaría la ecuación modificada????

      Eliminar
  5. que programas usas para programar qe lenguaje

    ResponderEliminar
  6. Disculpa, tengo una duda con respecto a esta parte

    while(!input(echo))
    {}
    set_timer1(0);
    while(input(echo))
    {}

    si estas abriendo y cerrando los while sin ponerlos a hacer algo, son necesarios?

    ResponderEliminar
    Respuestas
    1. La condicion while(!input(echo)); el signo (!) es una negación, es decir, cuando no se detecte nada se mantenga en el ciclo (seria while(true) ya que se cumple la condición) y apenas termine reinicio el timer1 (set_timer1(0); )... pero la siguiente condición: while(input(echo)), es decir cuando detecto un objeto, ahora si empiece el conteo el timer, y el tiempo es el que demoro el devuelto a echo... espero haber explicado bien.

      Eliminar
  7. amigo quisiera una ayuda, como haria para que al estar a una distancia de unos 10 cm me encienda un led o una alerta algo asi ayudame por fa

    ResponderEliminar
  8. amigo solo coloca debajo de la linea:
    distancia=(tiempo*10)/(58.0);
    if (distancia== 10cm){
    output_high(pin_c0); // enciende el pin c0
    }
    output_high(pin_c0); // lo apaga si no esta en 10cm, si lo quieres menor igual a 10cm solo coloca la condicion <= en vez de == .

    Espero haber aclarado tu duda

    ResponderEliminar
    Respuestas
    1. Hola, y si yo quiero variar el nivel deseado al que se encienda el pin c0, digamos que lo aumento con un pulso manual en alto en el pin B2 y lo disminuyo con otro pulso en alto en el pin B4.
      Como se haria esa parte, soy nuevo en esto de la programacion.
      Gracias !!!

      Eliminar
    2. tendrias que declarar como entradas un puerto Disponible ..luego pasar el valor a una variable que llamaremos limite que reemplaza a 10cm del comentario de arriba.

      Eliminar
  9. uff que ayudota me has dado... tengo otra duda y que pena la molestia, resulta que quiero q si esta en 10 cm me haga la rutina una sola ves si sigue estando en 10 no importe solo lo tome si varia, espero me hayas entendido

    gracias por todo

    ResponderEliminar
  10. Estimado, felicitaciones excelente trabajo una duda es no declaraste hecho, esta en la libreria del PIC, que significa, espero me ayudes

    ResponderEliminar
    Respuestas
    1. amigo, no entiendo tu pregunta disculpa, aclaramela porfa y con gusto te ayudo...

      Eliminar
  11. amigo muchas gracias por compartir este proyecto, tengo una prengunta; en el display se muestra la distancia con decimales o solo enteros?

    ResponderEliminar
  12. esta con enteros, con decimales es asi: cambiando distancia a variable flotante

    #include <16F877.h>
    #FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
    #use delay(clock=4000000)

    #include


    int16 tiempo;
    float distancia;
    #define trig pin_B1
    #define echo pin_B0
    #USE standard_io(b)

    void main()
    {
    lcd_init();
    printf(LCD_PUTC, "\f Iniciando.");
    delay_ms(500);
    printf(LCD_PUTC, "\f Iniciando..");
    delay_ms(500);
    printf(LCD_PUTC, "\f Iniciando...");
    delay_ms(500);

    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

    while(1)
    {
    output_high(trig);
    delay_us(20);
    output_low(trig);
    while(!input(echo))
    {}
    set_timer1(0);
    while(input(echo))
    {}
    tiempo=get_timer1();
    distancia=(tiempo*10)/(58.0);
    printf(LCD_PUTC, "\fTiempo :%Lu \nDistancia = %0.4f",tiempo,distancia);
    delay_ms(500);
    }
    }

    ResponderEliminar
  13. Hola que tal amigo felicidades y gracias por compartirlo y ayudar, yo uso un pic16f887 pero este funciona a 8 Mhz, la programacion seria la misma? y otra cosa, en el ccs no tenemos que agregar alguna libreria del sensor? gracias espero me puedas ayudar

    ResponderEliminar
    Respuestas
    1. hola amigo, sin usar librerias sirve... y con ese pic, tendría que mirar, que tiempos manejan los timers de ese pic... saludos

      Eliminar
  14. hola amigo! que buen proyecto, quiero saber como colocarle un aviso en la lcd donde a los 3cm me diga cerca y a los 9cm lejos! gracias y espero que me puedas ayudar

    ResponderEliminar
    Respuestas
    1. Pasate por aqui amigo tal vez te pueda ayudar

      http://campos-inventronica.blogspot.mx/2012/04/como-usar-sensor-ultrasonico-hc-sr04.html

      Eliminar
    2. amigo solo coloca debajo de la linea:
      distancia=(tiempo*10)/(58.0);
      if (distancia<= 3cm){
      printf(LCD_PUTC, "\f cerca...");
      delay_ms(100);
      }
      if (distancia>= 9cm){
      printf(LCD_PUTC, "\f lejos...");
      delay_ms(100);
      }


      Espero haber aclarado tu duda

      Eliminar
  15. Buenos dias amigo, he implementado su codigo y funciona muy bien hasta los 20cm es exacto, pero para mayores distancias tiene fallas de 5cm, depronto le ha psado esto, uso un 16f877, el sensor ya lo ensaye con arduino y es exacto hasta los 5 metros, por tanto descarto el modulo, uso cristal de 4 Mhz. gracias por cualquier ayuda que me pueda brindar

    ResponderEliminar
    Respuestas
    1. Buenos días, a mi me esta ocurriendo la misma falla , la medición es exacta hasta los 9 cm , de ahi en adelante el error va aumentando , podrías decirme como lo corregiste ? , estoy usando el pic 16f877a y un cristal de 4Mhz , este es mi correo n.gonzalez.v@outlook.com , Gracias.

      Eliminar
  16. buenas amigo.. como cambio los pines de la lcd, ya que usaré PIN_D0 para Rs, PIN_D1 para EN, y PIN_D2 a PIN_D5 para datos, en LCD.c?

    ResponderEliminar
  17. hola muy buen trabajo, yo tengo un sensor DYP ME007 tx se podria usar para este mismo efecto? y si se puede, podrias explicar como?

    gracias

    ResponderEliminar
  18. hola, alguien podria mandarme el programa en .hex para quemarlo, no tengo el compilador, gracias
    e_tosca@hotmail.com

    ResponderEliminar
    Respuestas
    1. hello , i hope someone would help me to compile this because i don't have the compiler either. thanks.. me@melromeo.com <-- my email . thank you so much and great post

      Eliminar
  19. hola, me gustaría saber si el programa también sirve para el PIC 18F4550 y como seria su implementación, ademas si no es mucho podrías decirme como se podría hacer la simulación con ISIS Proteus.
    Gracias

    ResponderEliminar
  20. Esta excelente, muchas gracias por la información. Tengo una duda: si dejo de medir distancia por un periodo de 1 minuto la pantalla se congela. No sé que pueda ser. Me podrías colaborar. Gracias.

    ResponderEliminar
  21. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  22. hola que tal con que programa "programas" el pic? si entiendo que compiles con ccs pero para meter el programa al pic como le haces espero tu ayuda de antemano muchas gracias
    felipeduarte1088@hotmail.com

    ResponderEliminar
    Respuestas
    1. so pick it 2 para realizar el paso del archivo .hex al pic... saludos

      Eliminar
    2. oye ya lo programe el pic y conecte todo asi como esta ahi arriba y el lcd prende pero se ven puros cuadros █ █ █ █ █ <---- asi ,. no se que este haciendo mal, no hay algun detalle que se tenga que hacer que se me este pasando?
      muchas gracias por responder :)

      Eliminar
    3. creo que el RW de la LCD lo estas mandando a tierra (0v) debes conectarlo al pic tambien a pesar de que solo estes escribiendo, ese debe ser el problema. Conectalo a RD2

      Eliminar
    4. podemos chatear? para que no se haga tanto desorden aqui? en skype si gustas o en facebook te lo agradeceria bastante

      Eliminar
    5. Hola tengo el mismo problema..me podrías ayudar

      Eliminar
  23. Buenas tardes, para preguntarle si este mismo programa funciona para el PIC18F4550, lo intente copiar de la misma manera, excepto lo del include, pero solo me aparece lo del lcd "iniciando...", pero no me aparece despues nada sobre la distancia, de antemano muchas gracias

    ResponderEliminar
  24. Hola una pregunta estoy haciendo un proyecto donde necesito usar 2 sensores ultrasonicos, crees que se pueda usar dos timer diferentes? por ejemplo el mismo programa,con variables diferentes y uno con el Timer 1 y otro con el timer 0??

    ResponderEliminar
  25. amigo y cual seria la diferencia en poder hacer el codiggo en un 18f4550

    ResponderEliminar
  26. Excelente proyecto realmente es muy bueno. Tengo una pregunta, como podría establecer un intervalo de medida, es decir por medio de dos pulsadores definir una medida, por ejemplo desde 10cm hasta 15cm mantenga una salida en bajo y si se sale de ese rango prenda una salida del puerto x y posteriormente cambiar ese intervalo de 20cm a 40cm ?. Gracias.

    ResponderEliminar
  27. Buenas Amigo estoy muy interesado en ese proyecto , nose si me podrias explicar mas acerca de esoy el uso del timer gracias, adjunto mi correo y espero una respuesta seria de gran ayuda. sanchez.millae@gmail.com

    ResponderEliminar
  28. Hola amigo, que buen proyecto, queria saber si me puedes conseguir la programacion para basic compiler, ya que estoy trabajando en el software PIC Simulator IDE

    ResponderEliminar
  29. Hola amigo, estoy trabajando este sensor pero para detectar proximidad. es decir que cuando me detecte algo cerca o menor que tantos centimetros, me ponga a girar unos motores en dirección a donde se encuentra el objeto. Con palabras podrías darme una guía de como hacerlo?

    ResponderEliminar
  30. hola amigo ... una consulta mira estamos ocupando tu programacion, tengo el sensor ultrasonico hc-sr04 y sabes no puedo ver la distancia con la pantalla serial... este es el programa me podrias ayudar
    #include <16F877a.h>
    #FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
    #use delay(clock=4000000)
    #use rs232(baud=9600, xmit=PIN_C6)

    int16 distancia;
    float tiempo;
    #define trig pin_B0
    #define echo pin_B1
    #USE standard_io(b)

    void main()
    {
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

    while(true)
    {
    output_high(trig);
    delay_us(20);
    output_low(trig);
    while(!input(echo))
    {}
    set_timer1(0);
    while(input(echo))
    {}
    tiempo=get_timer1();
    distancia=(tiempo*10)/(58.0);
    printf("\fTiempo :%Lu \nDistancia = %0.4f",tiempo,distancia);
    delay_ms(500);
    }
    }

    saludos quedo a tus comentarios.

    ResponderEliminar
  31. hola como estas ...tengo una duda ..quisiera como votar voltaje dependiendo de la distancia osea que este en un rango de 0-2m y me vote de 0-10 V me ayudarias mucho...Gracias.

    ResponderEliminar
  32. como sabemos el pic tiene un voltaje maximo para la salida 5V ,pero como hago las ecuaciones que este me vote de 0-10 v que varie con respecto a la distancia de 0-2m ,tendria que utilizar 2 pines ....quisiera que me ayudes con esa programacion..Gracias

    ResponderEliminar
  33. Una pregunta como se podria simular en proteus

    ResponderEliminar
  34. amigo quisiera una ayuda, como haria para que al estar a una distancia de X cm, me mande una señal pwm para un buzzer.

    ResponderEliminar
  35. Hola que tal? Debo felicitar tu trabajo realmente! Yo estoy en una misma ruta, te comento, debo hacer un codigo en el pic 16f628a y con el mismo sensor HC-SR04, con los mismos compiladores que usas, consta basicamente en programar al sensor ultrasonico al fin de que a una distancia de un metro active un motorcito, Como he visto tu codigo y soy novato en esta linea pic queria pedirte una mano, espero que puedas ayudarme!! Un abrazo!!

    ResponderEliminar
  36. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  37. Hola. Soy nuevo en esto de los foros pues normalmente probando y buscando por internet he solucionado mis problemas. El problema que tengo es que pedi 10 HC-SR04 y me ha llegado el modelo que no tiene cristal de cuarzo y sustituyendo uno por el otro que si tiene cristal no funciona bien, lo que le pasa es que mide bien la distancia pero hara unas 6 lecturas por segundo nada mas y ya he probado mil cosas.
    ¿Tienes conocimiento de la diferencia entre uno y otro?

    ResponderEliminar
  38. amigo puedes subir el codigo en .c

    ResponderEliminar
  39. Amigo, que tal. Muy buen aporte, quisiera saber como seria la ecuación para un pic 18f4550. Agradecería tu respuesta.

    ResponderEliminar
  40. Gracias por el aporte, esta muy bueno el Blog y los proyectos. Saludos.

    ResponderEliminar
  41. buenas tardes....tengo un proyecto y necesito utilizar tres sensores de proximidad ultrasonido con un solo pic 16f628a ... si es posible? y como se aria?

    ResponderEliminar
  42. buenas tarde tengo un proyecto y nesesito su ayuda....
    quiro poner un sensor que mida distacia y cuando tenga la distacia que ocupo prender un servomotor
    estoy usando un compilador en mikroC si tine un ejempolo me lo podrian mostrar



    saludos gracia

    ResponderEliminar
  43. Saludos, buen trabajo me sirvió de mucha ayuda.

    ResponderEliminar
  44. Buena noche, me sirvió su codigo pero la variable distancia me da el tiempo y la variable tiempo me da la distancia, a partir de 10cm me cuenta mas centimetros, tuve que poner:
    time=get_timer1();
    time=time-4;
    distance=time;
    printf(LCD_PUTC, "\fDistance = %Lu",distance);

    para que me imprima el valor de distancia, no se en que consista que me de alreves las variables... Uso un pic 18f4550 a 4mhz, saludos

    ResponderEliminar
  45. hey man muy buen codigo pero tengo un problema lo que pasa es que nesecito es que al yo presionar una tecla en mi teclado matricial el programa se devuelva al menu incial en mi lcd el problema es que cuando llego a la funcion del codigo del ultrasonido se queda alli infinitamente debido al while (1) o lo mismo while(true) esa misma tecla me sirve para devolverme en cualquier punto de mi programa no es configurada por interrupcion solo esta tecla=kbd_getc y desde alli las comparaciones por ejemplo en mi programa es if(tecla=='*'){
    x=0;
    tecla=0;
    y limpio mi lcd con el contra slash f
    }
    como hago para que se devuelva???

    ResponderEliminar
  46. puedes poner una imagen de todo el circuito donde se vea todo

    ResponderEliminar
  47. Buenas tardes el codigo en que lenguaje esta ?

    ResponderEliminar
  48. Saludos.
    He probado tu código en un 18F4550 (con cristal a 20Mhz) y funciona... a medias.
    La parte que dice "Iniciando..." se tarda entre 20-30 (entre que inicializa y se quita ese mensaje).
    Sólo aparece 1 de 2 lineas (la del tiempo) y también cambia de medición bastante lento de valores (entre 5-10 segundos por medición).
    Leí que en base al microcontrolador se cambia la fórmula para obtener distancia ¿crees que puedas explicarme un poco mejor esto? (o en su caso donde puedo revisar esto)
    Y lo de la línea que no me aparece... ¿en que crees que puedo estar fallando? Por que he conectado todo tal y como está en tu esquemático

    ResponderEliminar
  49. Hola Estimado,

    Puedo usar la programación en el pic 16f870.

    gracias

    ResponderEliminar
  50. Hola Estimado,

    Puedo usar la programación en el pic 16f870.

    gracias

    ResponderEliminar
  51. amigo que ´programa o compilador ocupas para ese código que subiste

    ResponderEliminar
  52. amigo me podias explicar de donde sacas

    {
    output_high(trig);
    delay_us(20);
    output_low(trig);
    while(!input(echo))
    {}
    set_timer1(0);
    while(input(echo))
    {}
    tiempo=get_timer1();
    distancia=(tiempo*10)/(58.0);
    printf(LCD_PUTC, "\fTiempo :%Lu \nDistancia = %0.4f",tiempo,distancia);
    delay_ms(500);


    y si es ees picc

    ResponderEliminar
  53. Hola,Saludo desde de Brasil. Muchas gracias por compartir los datos. me fue de grand valia.

    ResponderEliminar
  54. SALUDOS DESDE MEXICO, EXELENTE CODIGO ME FUE DE GRAN AYUDA YA QUE LO TENIA IMPLEMENTADO Y PARA ENTENDERLO MEJOR, PERO TENGO EL SIG. PROBLEMA: SE QUEDA PAUSADO. MANDO ENCENDER 3 LEDS DEPENDIENDO DELA DISTANCIA Y LO HACE BIEN SI ES ALGO SOLIDO. PERO AL COLOCARLO EN LA PILA DE AGUA EN MOVIMIENTO, QUE DESPRENDE VAPOR CALIENTE COMIENZA A DAR VALORES MUY DISPARES CON ERROR DE ASTA 30 CMS, Y DESPUES ME PARECE QUE NO REGRESA LA ONDA QUE ENVIA EL SENSOR POR QUE SE PAUSA. AUN NO LO PUEDO CORREGIR ALGUNA SUGERENCIA? GRACIAS DE ANTEMANO. edgi_luze@hotmail.com

    ResponderEliminar
  55. hola me sirvio de mucha ayuda pero necesito ayuda para poder integrarlo con 3 sensore mas ya que e tratado pero las variables se me relaciona y los sensores de ver de votar cada uno su datos de distancia ellos se suman entre si dichas distancias como hago para que esos valores me sean independientes seria de mucha ayuda ya q con el puedo terminar el robot detector de obstáculos con este micro
    18f452, muchas gracias por tu ayuda espero tu respuesta.

    ResponderEliminar
    Respuestas
    1. hola k tal oye disculpa pero agradecieria si me pudises ayudar quiero conectar 4 sensores en un pick pero no puedo conectarlos tengo uno y ya lo he probado fisicamente y funciona perfecto pero al conectar dos no hace nada y noce como hacer para conectar mas de 1 sensor espero me puedas ayudar
      te dejo mi correo
      zidaryel@gmail.com
      gracias

      Eliminar
  56. Respuestas
    1. buenas que tal alguien me puede pasar el codigo en hex.

      Eliminar
  57. Hola amigo, ¿Porque no puedo realizar medidas con la misma conexión pero con el PIC18F4550 a 8Mhz y configuro el mismo TIMER1 con el ejemplo y no me hace medicicones? una explicacion por favor vicomtz14@hotmail.com

    ResponderEliminar
  58. Como Haría Esto En Un Pic18F4550?

    ResponderEliminar
  59. Tengo una inquietud estoy realizando un proyecto donde hago uso de un sensor y con ete codigo me funciona muy bien pero quiero conectar otro sensor, y tengo duda de como se deberia de configurar, no se si me podria colaborar muchas gracias........

    ResponderEliminar
  60. Buenas tardes... el LCD que tipo es??

    ResponderEliminar
  61. buenas dia bro.
    espero me puedas ayudar mi problema es el sig.
    hola k tal oye disculpa pero agradecieria si me pudises ayudar quiero conectar 4 sensores en un pick pero no puedo conectarlos tengo uno y ya lo he probado fisicamente y funciona perfecto pero al conectar dos no hace nada y noce como hacer para conectar mas de 1 sensor espero me puedas ayudar
    te dejo mi correo
    zidaryel@gmail.com
    gracias

    ResponderEliminar
  62. le falto al ckto ponerle un resistor de 10k entre 5v positivos y el pin 1 del microcontrolador !!!

    ResponderEliminar
  63. Hola, buenas noches. Si quiero agregar otros dos ultrasonicos tendria que cambiar algo en la programacion?

    ResponderEliminar
  64. Saludos felicitaciónes por el proyecto y el codigo por gavor me puedes aydar deseo hacer un medidor de altura para personas hasta 2.20 de alto en 90 cm led rojo en 1.10 led amarillo y en 1.20 led verde la altura de la persona wue mida sw refleje en 3 display gracias poe su ayudaelnpic seri el 16f628a y el sensor ultrasonovo hs4 mi correo es victor_tixe@hotmail.com victortixe49@gmail.com gracias

    ResponderEliminar
  65. 12bet : What are the best 7bet casinos? | Vntopbet
    12bet 11bet are some of the best 7bet slots 메리트카지노 online. They are considered ラッキーニッキー as a top 10 slots on the list.

    ResponderEliminar