#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);
}
}
por favor comenta.. gracias
ResponderEliminarhola, tengo cristal de 8 mhz q parte de la formula o codigo cambiaria con pic 16f887
EliminarDe la linea:
ResponderEliminarprintf(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
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
EliminarEs decir, el tiempo es el primer %Lu, y la distancia el 2do %Lu, como son variables, ya que estan cambiando durante el proceso...
EliminarHola muy buen trabajo. Pero me podrias explicar por qué en esta parte: "distancia=(tiempo*10)/(58.0);"
ResponderEliminarel tiempo lo multiplicas por 10 y lo divides por 58?
Por favor espero tu respuesta.
Gracias
en realidad la ecuacion que recomienda el datasheet es esta,
Eliminarrange = high level time * velocity (340M/S) / 2 ... pero con el crista que use de 4MHz no funciono.. y saque esa y si me funciono
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?
EliminarOye otra duda!!
ResponderEliminarQuiero programar un pic16f84a para el mismo sensor... crees que sea posible? o no son lo mismo con los TIMERS??
si se puede, solo que cambiaria la ecuacion ya que el ese pic solo tiene el timer0 de 8 bits...
EliminarBuenas noches, disculpa mi ignorancia pero como quedaría la ecuación modificada????
Eliminarque programas usas para programar qe lenguaje
ResponderEliminarccs compiler... saludos
EliminarDisculpa, tengo una duda con respecto a esta parte
ResponderEliminarwhile(!input(echo))
{}
set_timer1(0);
while(input(echo))
{}
si estas abriendo y cerrando los while sin ponerlos a hacer algo, son necesarios?
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.
Eliminaramigo 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
ResponderEliminaramigo solo coloca debajo de la linea:
ResponderEliminardistancia=(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
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.
EliminarComo se haria esa parte, soy nuevo en esto de la programacion.
Gracias !!!
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.
Eliminaruff 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
ResponderEliminargracias por todo
Estimado, felicitaciones excelente trabajo una duda es no declaraste hecho, esta en la libreria del PIC, que significa, espero me ayudes
ResponderEliminaramigo, no entiendo tu pregunta disculpa, aclaramela porfa y con gusto te ayudo...
Eliminaramigo muchas gracias por compartir este proyecto, tengo una prengunta; en el display se muestra la distancia con decimales o solo enteros?
ResponderEliminaresta con enteros, con decimales es asi: cambiando distancia a variable flotante
ResponderEliminar#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);
}
}
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
ResponderEliminarhola amigo, sin usar librerias sirve... y con ese pic, tendría que mirar, que tiempos manejan los timers de ese pic... saludos
Eliminarhola 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
ResponderEliminarPasate por aqui amigo tal vez te pueda ayudar
Eliminarhttp://campos-inventronica.blogspot.mx/2012/04/como-usar-sensor-ultrasonico-hc-sr04.html
amigo solo coloca debajo de la linea:
Eliminardistancia=(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
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
ResponderEliminarBuenos 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.
Eliminarbuenas 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?
ResponderEliminarhola muy buen trabajo, yo tengo un sensor DYP ME007 tx se podria usar para este mismo efecto? y si se puede, podrias explicar como?
ResponderEliminargracias
hola, alguien podria mandarme el programa en .hex para quemarlo, no tengo el compilador, gracias
ResponderEliminare_tosca@hotmail.com
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
Eliminarhola, 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.
ResponderEliminarGracias
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.
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarhola 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
ResponderEliminarfelipeduarte1088@hotmail.com
so pick it 2 para realizar el paso del archivo .hex al pic... saludos
Eliminaroye 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?
Eliminarmuchas gracias por responder :)
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
Eliminarpodrias ayudarme?
Eliminarpodemos chatear? para que no se haga tanto desorden aqui? en skype si gustas o en facebook te lo agradeceria bastante
EliminarHola tengo el mismo problema..me podrías ayudar
EliminarBuenas 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
ResponderEliminarHola 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??
ResponderEliminaramigo y cual seria la diferencia en poder hacer el codiggo en un 18f4550
ResponderEliminarExcelente 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.
ResponderEliminarComo lo simulo en proteus......
ResponderEliminarBuenas 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
ResponderEliminarHola 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
ResponderEliminarHola 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?
ResponderEliminarhola 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
ResponderEliminar#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.
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.
ResponderEliminarcomo 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
ResponderEliminarUna pregunta como se podria simular en proteus
ResponderEliminaramigo quisiera una ayuda, como haria para que al estar a una distancia de X cm, me mande una señal pwm para un buzzer.
ResponderEliminarHola 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!!
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola. 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.
ResponderEliminar¿Tienes conocimiento de la diferencia entre uno y otro?
amigo puedes subir el codigo en .c
ResponderEliminarAmigo, que tal. Muy buen aporte, quisiera saber como seria la ecuación para un pic 18f4550. Agradecería tu respuesta.
ResponderEliminarGracias por el aporte, esta muy bueno el Blog y los proyectos. Saludos.
ResponderEliminarbuenas tardes....tengo un proyecto y necesito utilizar tres sensores de proximidad ultrasonido con un solo pic 16f628a ... si es posible? y como se aria?
ResponderEliminarbuenas tarde tengo un proyecto y nesesito su ayuda....
ResponderEliminarquiro 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
Saludos, buen trabajo me sirvió de mucha ayuda.
ResponderEliminarBuena 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:
ResponderEliminartime=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
el ldc esta a 4 bits ??
ResponderEliminarhey 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=='*'){
ResponderEliminarx=0;
tecla=0;
y limpio mi lcd con el contra slash f
}
como hago para que se devuelva???
puedes poner una imagen de todo el circuito donde se vea todo
ResponderEliminarBuenas tardes el codigo en que lenguaje esta ?
ResponderEliminarSaludos.
ResponderEliminarHe 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
Hola Estimado,
ResponderEliminarPuedo usar la programación en el pic 16f870.
gracias
Hola Estimado,
ResponderEliminarPuedo usar la programación en el pic 16f870.
gracias
amigo que ´programa o compilador ocupas para ese código que subiste
ResponderEliminaramigo me podias explicar de donde sacas
ResponderEliminar{
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
Hola,Saludo desde de Brasil. Muchas gracias por compartir los datos. me fue de grand valia.
ResponderEliminarSALUDOS 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
ResponderEliminarhola 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
ResponderEliminar18f452, muchas gracias por tu ayuda espero tu respuesta.
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
Eliminarte dejo mi correo
zidaryel@gmail.com
gracias
cual es el diagrama ?
ResponderEliminarbuenas que tal alguien me puede pasar el codigo en hex.
EliminarHola 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
ResponderEliminarComo Haría Esto En Un Pic18F4550?
ResponderEliminarTengo 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........
ResponderEliminarBuenas tardes... el LCD que tipo es??
ResponderEliminarbuenas dia bro.
ResponderEliminarespero 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
le falto al ckto ponerle un resistor de 10k entre 5v positivos y el pin 1 del microcontrolador !!!
ResponderEliminarHola, buenas noches. Si quiero agregar otros dos ultrasonicos tendria que cambiar algo en la programacion?
ResponderEliminarSaludos 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
ResponderEliminar12bet : What are the best 7bet casinos? | Vntopbet
ResponderEliminar12bet 11bet are some of the best 7bet slots 메리트카지노 online. They are considered ラッキーニッキー as a top 10 slots on the list.