Sensor de nivel utilizando hcsr04

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Sensor de nivel utilizando hcsr04

Mensagempor carlucio » 21 Jul 2014 23:06

Ola pessoal,

Recentemente adquiri um sensor hcsr04, percebi que utilizando ele posso conseguir medir nivel de agua desde que o mesmo não fique em um local fechado para a umidade não danificar o mesmo. Pesquisei na internet e não consegui encontrar nenhum projeto basico que ajudasse a pelo menos iniciar o mesmo.

Preciso medir o nivel e indicar em um display o nivel em % e litros.
Abaixo, o codigo que mede em mm do pessoal onde adquiri o sensor.

cpp code
#include <16F877A.h>
#device *=16
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=4000000)

#ZERO_RAM

#include <LCD_MSS.h>
/******************************************************************************
* Ligações do LCD *
* D7 -> RD7 (PORTD 7) *
* D6 -> RD6 (PORTD 6) *
* D5 -> RD5 (PORTD 5) *
* D4 -> RD4 (PORTD 4) *
* RS -> RD3 (PORTD 3) *
* EN -> RD2 (PORTD 2) *
* R/W -> Deve ser conectado ao GND *
* VCC -> Deve ser conectado ao +5V *
* GND -> Deve ser conectado ao GND *
* VO -> Deve ser conectado ao potenciômetro/trimpot de ajuste de brilho *
******************************************************************************/

/******************************************************************************
* Ligações do Sensor HC-SR04 *
* Trig -> Pino RC0 do PORTC *
* Echo -> Pino RC1 do PORTC *
* VCC -> Deve ser conectado ao +5V *
* GND -> Deve ser conectado ao GND *
******************************************************************************/

#use fast_io(c)//O Controle de direção (Entrada/Saida) dos pinos será feito no programa
#use fast_io(d)//O Controle de direção (Entrada/Saida) dos pinos será feito no programa

#byte PORTC = 0x07//Endereço do PORTC
#byte PORTD = 0x08//Endereço do PORTD

#bit Trig = PORTC.0 //pino que dispara o ultrasom
#bit Echo = PORTC.1 //pino que lê a resposta


//Declaração de funções
unsigned int16 ler_US(void); //função que lê e retorna a distância em mm
void exibe_distancia(unsigned int16);//rotina que converte a distância em caracteres e envia para o LCD

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

// TODO: USER CODE!!

//Os Pinos RD2 a RD7 são usados pelo LCD, os pinos RD0 e RD1 estão livre para uso
set_tris_d(0b00000000);//Configurando todos os pinos como saída
//Os pinos Trig e Echo estão conectados no PORTC, Trig -> RC0 e Echo -> RC1
set_tris_c(0b00000010);//Pino RC1 como entrada e o restante como saída

PORTC = 0;//Inicia com todos os pinos que forem saída em zero
PORTD = 0;//Inicia com todos os pinos que forem saída em zero

configura_lcd();//Chama a rotina que faz as configurações básica para o LCD funcionar
inicio_lcd();//Coloca o cursor no inicio
limpa_lcd();//Limpra o LCD

linha_1_lcd(4);//Começa a escrever apartir do caracter 4 na primeira linha
caracter_lcd('D');
caracter_lcd('I');
caracter_lcd('S');
caracter_lcd('T');
caracter_lcd(':');
caracter_lcd(' ');

while(1)//Loop infinito do programa
{
linha_1_lcd(10);//Imprime a distância apartir do caracter 10

delay_ms(250); //Garante o tempo minimo para aquisição de nova distancia (O fabricante exige minimo 50ms)
exibe_distancia(ler_US());//Chama a rotina que exibe a distancia no LCD, e passa como parametro a distancia lida em ler_US()
}

}

unsigned int16 ler_US(void)//Esta rotina realiza a leitura da distancia e a retorna em mm
{
unsigned int16 vl_timer = 0;//Variavel para armazenar o tempo
unsigned int16 distancia = 0;//Armazena a distancia convertida
Trig = 1;//Dispara o Ultrasom
delay_us(20);//Aguarda um tempo (minimo de 10us)
Trig = 0;//Volta para 0 (zero)

while(!Echo){}//Aguarda começar a enviar a resposta

set_timer1(0);//Reinicia o TIMER1

while(Echo){}//Fica parado até receber a resposta

vl_timer = get_timer1();//Le o tempo em que ficou recebendo a resposta (Tempo de instrução / 2 em uS)

distancia = ((((vl_timer * 2) * 10) / 58) + 10);//Como o divisor do TIMER1 estar 1:2, multiplicamos por 10, passo para mm (x 10) e converto ( / 58)
return distancia;//A função retorna o valor convertido em mm
}

void exibe_distancia(unsigned int16 distancia)//Rotina responsavel por converter em caracter e enviar a distância
{
unsigned int16 x;//declara uma váriavel auxiliar

x = distancia / 10000;//Pega a dezena de milhar(Ex: 12345, pega apenas o '1') Inteiro de 12345/10000
x = x + 48; //Converte em caracter ASCII
caracter_lcd(x);//Envia para o LCD

x = distancia / 1000;//Pega a Dezena e Unidade de Milhar (Ex: 12345, pega '12') Inteiro de 12345/1000
x = x % 10; //Pega a Unidade de milhar (Ex: 12345, pega apenas '2') resto da divisão 12/10
x = x + 48; //Converte em caracter ASCII
caracter_lcd(x); //Envia para o LCD

x = distancia / 100; //Pega dezena, unidade de milhar e a centena (Ex:12345, pega '123') Inteiro de 12345/100
x = x % 10; //Pega a centena (Ex: 12345, pega apenas '3') o resto da divisão 123/10
x = x + 48; //Converte em caracter ASCII
caracter_lcd(x);//Envia para o LCD

x = distancia / 10; //Pega dezena e unidade de milhar, centena e desena (Ex: 12345, pega '1234') Inteiro de 12345/10
x = x % 10; //Pega a dezena (Ex: 12345, pega apenas '4') o resto da divisão 1234/10
x = x + 48;//Converte em caracter ASCII
caracter_lcd(x);//Envia para o LCD

x = distancia % 10;//Pega a unidade (Ex: 12345, pega apenas '5') Resto de 12345/10
x = x + 48;//Converte em caracter ASCII
caracter_lcd(x);//Envia para o LCD
caracter_lcd('m');
caracter_lcd('m');//Exibe mm
}



Sera que alguem pode me dar uma mão para ajudar na conversão para % e litros?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor Renie » 22 Jul 2014 00:31

Olá Carlucio,

É claro que o software vai precisar de muitas modificações mas, para medir em percentual e quantidade de litros serão necessários
vários cálculos e todos vão depender da "caixa" onde o líquido será armazenado!!!!
10 cm em um balde de 12 litros equivale a aproximadamente 2 litros e +/- 17%, como o balde vai variando no diâmetro, com 30 cm as
medidas ficam mais complicadas, digamos 7,8 litros e +/- 60% do balde, estas informações são hipotéticas, apenas para lembrar que
qualquer medida de volume depende do recipiente e seu respectivo formato!
Não conheço este sensor, descupe estou afastado há vários anos da eletrônica mas, aconselho uma montagem tipo caneta, um tubo
exclusivo para o sensor que possa ficar acima da "linha d' água" e o dependendo do formato do recipiente as variáveis multipicadoras ou
divisoras sobre o valor obtido no sensor precisam ser calculadas antes para serem implementadas no software!
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Re: Sensor de nivel utilizando hcsr04

Mensagempor carlucio » 22 Jul 2014 10:17

Renie,

Concordo, que ficou faltando informações. No caso, o que medir e um balde que comporta em torno de 100 litros de agua. Medidas são 60cm de altura x 49 cm de diamentro.
O que achava que poderia fazer era utilizar um padráo, onde eu simplesmente entraria com os valores dos litros e altura, sendo assim o programa calcularia para mim a % e faria a referencia em porcentagem dos litros no recepiente

Imagem.

O balde que tenho aqui é o identico ao acima (deste endereço) onde utilizo para armazenar agua de maquina de lavar para limpeza de quintal.

A respeito do que voce me indicou, não entendi o que seria esse tipo de montagem (caneta ?). Tem como mostrar um exemplo?


Mesmo assim ao pessoal do forum, estou disposto a ouvir ideias.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor ze » 22 Jul 2014 12:17

desconsiderando os desafios mecânicos, já pensou em medir o peso? isso pode tonar independente o formato do recipiente. sei lá... só viagem.

1/2 que off topic...certa feita idealizei um conceito para monitorar a "pressão" de um botijão de gás. o desafio foi o custo zero e usar apenas o que estava ao alcance das mãos. Era por "peso". o objetivo era identificar e alarmar o quase fim do gás pra eu não ter que emprestar do 'zoto' em emergências. era um pic10f 2 pilhas, 3 leds, 1 buzzer. o "sensor" era "capacitor" cujo dielétrico era uma borracha ou esponja que alterava capacitância a medida que o botijão "subia". usei o comparador do 10f pra fazer um oscilador com o "capacitor". meio que deu certo mas não evoluí....bom, é só uma ideota que pode servir pra alguma feira de ciências (nem se se existe isso hj em dia) ou algum projetinho tipo macgyver pra tcc de jardim de infância.
hmmm uma aplicação menos idiota seria monitorar-alarmar a água no meu tanquinho pra não transbordar. a muié agradece..talvez ressuscite isso...
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Sensor de nivel utilizando hcsr04

Mensagempor xultz » 22 Jul 2014 13:26

Uma vez eu fiz um sensor de nível, ele media três níveis. O aparelho tinha o tamanho e formato de uma máquina de lavar roupas, e tinha um cano em paralelo ligado no fundo, que devido àquela pira de vasos comunicantes, ficava no mesmo nível da água no tanque. Eu fiz um circuitinho oscilador com uma porta lógica que nem lembro mais qual era, e na placa fiz uma espiral que servia de capacitor. A água entrava em contato com esta placa quando chegava no nível, e mudava a capacitância porque trocava o dielétrico de ar para água, e vendo o desvio de frequência eu sabia que tinha água ali. Ficou barato (que era o que mais importava) e funcionou super bem. Essa plaquinha poderia ter sido colocada dentro do tanque de alguma forma, que sentiria a presença de água, nem precisava do cano parasita.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Sensor de nivel utilizando hcsr04

Mensagempor carlucio » 22 Jul 2014 15:56

Pessoal,

A minha intençao não e me resgardar de transbordo, mas sim realmente ver a % e os litros. Logicamente se der certo neste lugar onde estou querendo vou implementar para medir nivel em uma caixa d'agua da casa sem ter que colocar o sensor dentro da caixa. Por isso que realmente se faz necessario ver % e litros.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor Renie » 22 Jul 2014 19:52

Olá Carlucio,

O Xultz já respondeu o que seria a montagem tipo caneta! :lol:
Seria em um tubo paralelo "parasita" ao recepiente, assim o enchimento se faz de baixo para cima sem agitação, o que evita lançar humidade no sensor.
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Re: Sensor de nivel utilizando hcsr04

Mensagempor carlucio » 22 Jul 2014 22:59

Este tal tubo " parasita " conhecido por mim como nivel por coluna de agua tambem pensei, mas no caso tenho que furar o recepiente para isso acontecer. Agora imagina se voce furar sua caixa d'agua onde a agua esta dentro do tubo " parasita" que geralmente é a mesma que esta dentro da caixa d'agua e que normalmente devera ter a parte superior aberta, estiver recebendo a poeira do forro onde geralmente fica animais tambem como passaros ? Da nojo so de pensar.

No caso acima do balde vou usar como cobaia para se no caso de funcionar passar para minha real necessidade que é medir o nivel de agua da caixa d'agua.


[img]

http://www.dtvb.ibilce.unesp.br/amplia. ... =18&item=1



[/img]



Pois onde moro aqui na minha cidade estou a mais de 10km do centro de distribuição e qualquer problema no meio do caminho falta agua para mim. Agora imagina se eu tivesse jeito de monitorar mesmo que de maneira não precisa, pois este sensor não se compara com os industriais que são extremamente caros, mais precisos. Com certeza saberia dosar o consumo pois mesmo de uma maneira aproximada saberia do nivel la existente.

Agora pelo que andei lendo, o maior problema com este sensor que o pessoal tem para ler nivel de um liquido com a agua, é a umidade.
Mas eu tenho uma ideia, que no caso não precisa furar a caixa d'agua para fazer o tubo com a agua "parasita", mas sem testar, não tenho como afirmar se vai dar certo.

Preciso adequar o codigo para ler % e litros (tem que ser % e litros para ser uma informação mais precisa), assim controlar melhor a agua, principalmente neste ano de racionamento de agua.

Estou disposto a ideias do pessoal
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor andre_luis » 22 Jul 2014 23:04

carlucio escreveu:Preciso medir o nivel e indicar em um display o nivel em % e litros.


O balde que voce indicou acima, pode ser modelado como uma seção de cone, de acordo com a imagem abaixo:

volume-of-a-truncated-cone.png


De acordo com o site abaixo, essa é a formula que descreve o volume ( Litros ):
http://calculator.swiftutors.com/trunca ... lator.html



Considerando que na visão real, o cone da figura acima é invertido, podemos simplificar a fórmula, pois sabemos que a base do cone será proporcional á sua altura conforme for enchendo, conforme abaixo:



O problema agora seria como explicitar a variavel P ( que representa % ) em função da variável h.
Te confesso que não consegui deduzir como fazer isso, mas tá quase lá.

P = f ( h )

Onde h é representado pela sua função ler_US().
No caso, a sua função seria alterada para incluir essa equação, conforme abaixo:

cpp code
while(1)
{
linha_1_lcd(10);

delay_ms(250);
exibe_distancia( P ( ler_US() ) );
}


Amanhã quebro um pouco mais a cabeça, se alguem não consegui fechar isso primeiro.


+++
Você não está autorizado a ver ou baixar esse anexo.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Sensor de nivel utilizando hcsr04

Mensagempor Renie » 23 Jul 2014 00:06

Olá Carlucio e pessoALL,

Complementando, o tubo "parasita" não precisa ser implementado externamente, pode ser alocado do lado de dentro do recipiente e transpassar a tampa do mesmo, sendo que na ponta do tubo que tocará o fundo do recipiente será necessário fazer vários rasgos ou arcos para que o líquido entre no tubo facilmente.

No seu caso como o recipiente é cônico perfeito precisaria de um fator de correção simples, para implementar é simples, com a "caneta" já preparada com o sensor faça a leitura do ponto zero, coloque 1 litro d'água nele e veja a leitura do sensor, você terá a marca de 1%, depois coloque mais 1 litro e veja a leitura do sensor novamente, vamos considerar hipotéticamente só para o exemplo, digamos que vazio a 1a leitura seja de 620mm, com 1 litro seja -7mm e com 2 litros seja -12mm.

Cheguei baseado nas informaçôes hipotéticas acima em um fator de 1,67 que tanto seviria para indicar litro como percentual já neste que caso são iguais 100 litros e 100% ! Ainda não fechei as fórmulas mas funciona, lembrando que se a "caneta" for utilizida em caixa d'água de "degraus" será preciso re-calcular o fator a cada degrau, com uma tabela da leitura do sensor para aplicar o fator correto.
Também estou pensando no seu post, quando fechar as fórmulas posto aqui!

As fórmulas que o Amigo Teprom seria o caminho mais correto mas, creio ser bem difícil implementar em micro-processadores e a aplicação, creio que uma diferênça menor que 5% seja aceitável! :wink: Os cálculos que procuro fechar seriam válidos para qualquer formato de recipiente, principalmente os de aprumo retilíneos (paredes totalmente verticais), neste caso não seria necessário fator de ajuste. Para caixas d'água em formato "escada" seriam preciso medições a cada "degrau" e uma tabela comparativa no software para aplicar o valor correto a cada "lance" da escada! :wink:
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Re: Sensor de nivel utilizando hcsr04

Mensagempor andre_luis » 23 Jul 2014 05:39

Minha analise mais acima tinha erro após a 2a formula.
Na verdade, ele pode usar a fórmula diretamente, ao menos para obter o valor em litros.

O fato é que a variavel P acima representaria o seguinte:



No programa ficaria assim:

cpp code
while(1)
{
linha_1_lcd(10);

delay_ms(250);
exibe_distancia( ( (( PI * ler_US()) / 3 ) * ( r1^2 + ( P * ler_US())^2 ) + ( (r1*P) * ler_US())) );
}





+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Sensor de nivel utilizando hcsr04

Mensagempor xultz » 23 Jul 2014 08:39

Quando eu fiz o projeto usando o tubo parasita, eu tinha pensado na época em usar um sensor de pressão na ponta do tubo, só que na época eu não tinha encontrado nada prático, mas ultimamente eu vi muitas opções no mercado.
Se o tubo parasita ficar vazio de água, cheio de ar, e perfeitamente vedado na ponta, com um sensor de pressão dentro em algum lugar, eu ACHO que o volume de água no recipiente gera uma pressão proporcional no tubo parasita. Eu devia ter prestado mais atenção nas aulas de fenômenos de transporte...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Sensor de nivel utilizando hcsr04

Mensagempor ze » 23 Jul 2014 10:12

no passado, também tive a (boa) ideia do xuts. de fato máquinas de lavar usam este princípio mas é uma ou duas chaves

isso passa longe de desaquietá-lo matematicamente no entanto permita-me...
curiosamente também passei por problemas de abastecimento. minha caixa era de 500l e a água da mina estava por um fio quasiliteral. muita roupa pra lavar, varanda, jardim, mulher com obsessão por limpeza, etc. Para dosar o consumo fiz isso: uma bóia com peso acompanhando a superfície da água. um fio de nylon (de pescar) presso a isso. passa por roldanas. do outro lado na parede uma 'pedra' como indicador de nível...bom acho que já entendeu. explicações, motivações, treinamento pra muié e tal...
agora vem a parte do pic (o dono este forum). idealizei (chei de ideia) um redutor cujo eixo o fio enrolasse sobre. do lado reduzido um potenciômetro que leria o pot no ad. aff que complicado. mas dormi muitas vezes embalado por esta ideota. planos, sonhos, enfim teve seu valor. mas perdi o embalo. fiquei com a idade da 'pedra' mesmo. Mas são águas passadas quasiliterais. Reescavei a mina, ligeiro aumento de vazão, comprei uma caixa de 2500L

vc não precisa furar a caixa. basta um T na saída e um cano vertical que fique acima da caixa pra ter seu vasocomunicante

abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Sensor de nivel utilizando hcsr04

Mensagempor carlucio » 23 Jul 2014 11:05

A minha ideia no caso seria utilizar uma boia de caixa d'agua mesmo, so que sem a parte que abre e fecha a agua, ou seja a boia e a haste.
Então colocaria a boia na caixa com um pequeno furo na tampa ( a haste com a ponta virada para o telhado) e um prolongamento da haste para a parte externa da caixa de maneira que a mesma chegasse ate o fundo da caixa. Então adaptaria um tubo parasita so que sem agua em um cano e o mesmo tivesse um parte que se adaptasse a haste de maneira que se a caixa estiver 100% a haste com um pedaço de plastico ou algum material que não pensei, estive na altura maxima do cano, com isso o sensor hcsr04 ficaria no lado inferior (ou seja contrario da parte superior da caixa d'agua) abaixo um pouco do minimo determinado, fazendo a leitura da movimentação deste peça pendurada a haste para determinar a leitura do nivel.
Por isso que se faz necessario a leitura em % e litros. Não sei se minha ideia ficou muito esclarecida, mas e mais ou menos desta forma que pretendo testar no prototipo do balde e caso dando certo, adaptarei na caixa d'agua.

Prolongador --> ______________
| | _|_ | _|_ -----> peça interna a ser estudada
| | | | |
| Haste---> | | | |
| | | | | -----> Tubo parasita para proteção hcsr04
| | | | |
| Boia ----> O | | | |
|________________| |
caixa d'agua V
HCSR04 aqui

O desenho acima na ficou muito ideal mas mostra o que penso para testar. Pode ver que desta maneira o hcsro4 ficara livre da umidade da caixa e ate da poeira no caso de um forro, visto que o mesmo ficaria dentro do tubo com o fundo lacrado.

O que acham , funcionaria?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor carlucio » 23 Jul 2014 11:07

Depois de postado o desenho acima ficou desconfigurado, não entendi porque!
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x