Sensor de nivel utilizando hcsr04

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: Sensor de nivel utilizando hcsr04

Mensagempor ze » 23 Jul 2014 11:55

não conheço o HCSR04...
pensando... a haste prolongada apoiando no eixo de um potenciômetro. numa caixa de 1000L estimo girar só uns 60º. bom, isso foi só um registro autorreflexivo pra provável uso futuro
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 13:56

Para aqueles que não conhecem hcsr04, um pouco de informação abaixo:


Imagem


Imagem





Um video acima de um possivel exemplo do que se pode fazer com esse sensor, no caso do video foi feito com arduino, eu preciso que seja feito no pic.


Aguardando sugestões do pessoal.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor Eduardo Augusto » 23 Jul 2014 15:24

Já vi um amigo meu implementar esse sensor para leitura de distâncias, não sei direito como o código dele funciona, posso tentar falar com ele; mas vi uma aplicação interessante utilizando um PIC16

http://tutorial.cytron.com.my/2013/11/1 ... nt-page-1/
Não é possível dormir com todas mulheres do mundo, mas deve-se fazer o esforço.
Avatar do usuário
Eduardo Augusto
Byte
 
Mensagens: 105
Registrado em: 03 Mar 2014 08:57
Localização: São Paulo, SP

Re: Sensor de nivel utilizando hcsr04

Mensagempor andre_luis » 23 Jul 2014 18:59

Renie escreveu:As fórmulas que o Amigo Teprom seria o caminho mais correto mas, creio ser bem difícil implementar em micro-processadores


Mas nesse caso a função original dele já atenderia, pois a medida da altura de uma coluna d´água cilindrica ou quadrada é diretamente proporcional ao seu volume. Outro aspecto é que em se programando em C, e utilizando um microcontrolador mesmo com um cristal abaixo do 'teto', o processamento já é suficiente. Repare que quanto a complexidade mencionada em principio não existe, já que o compilador é quem vai fazer todo o trabalho.



+++
"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 carlucio » 23 Jul 2014 21:02

Este outro video é bem aproximado do que eu estou querendo fazer. O problema maior meu são as formulas para os calculos (% e litros), que ate o nosso amigo andre ja deu um dica. Mesmo assim tenho que tentar entender onde alterar, para conseguir modificar e fazer funcionar bem proximo do que o video abaixo se refere.



Espero conseguir entender o que tenho que modifcar para alterar o programa. Como sou um programador vamos dizer "nivel intermediario" ( mas apanho demais em coisas simples ainda) aceito sugestões para chegar onde quero.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor carlucio » 23 Jul 2014 21:16

A outra situação da qual falei.



[youtube]
http://www.youtube.com/watch?feature=pl ... zKgsr_qK7o
[/youtube]
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor andre_luis » 23 Jul 2014 21:21

Não ficou claro ainda o que você já tentou fazer, ou o que tá dando errodo, mas vamos ao que você precisa fazer:

  • Compilar o programa original sem erros e conseguir gravar no microcontrolador e funcionar como no video
  • Medir o balde onde vai testar, e obter as medidas h1 e h2, e depois calcular P em função dessas medidas
  • Colocar esses valores no programa utilizando a diretiva #define h1 xxxx e #define h2 yyyy
  • Alterar a fóruma original para a que sugeri, compilar, ver se dá erro e fazer os testes


+++
"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 carlucio » 23 Jul 2014 21:29

Andre desculpe,

Ainda não tentei pois não entendi ainda o local especifico de se alterar, ou seja como incrementar a formula passada.

Código: Selecionar todos
#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   
   }




Esclareça para mim novamente os pontos a serem alterados e vou tentar logo para ver o que que dá (medidas do balde 60 cm de altura x 49 cm de diametro)
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor andre_luis » 23 Jul 2014 22:09

Dá uma olhada nas postagens anteriores, eu informei que a única alteração seria naquela linha do programa onde é instanciado a função exibe_distancia, e no caso nem precisaria dos #defines que citei mais acima, pois os valores podem ser inseridos direto na fórmula dentro dessa função.

Observei também que você informou apenas uma medida da largura para o balde, o que me faz supor que provavlemente voce simplificou a matemática, conforme sugerido pelo Renie. Nesse caso, a solução seria mais simples ainda. Apenas substitui a linha abaixo:
Código: Selecionar todos
exibe_distancia( ler_US() );

Por isso:
Código: Selecionar todos
exibe_distancia( K*ler_US() );


Onde K é um valor que voce vai ajustar empiricamente até casar o valor de litros.
Na verdade, trata-se propriamente de uma calibração.

Assim que voce sinalizar ter conseguido concluir essa etapa com sucesso, passamos pra próxima, que é o valor %.



+++
"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 23:45

Olá Carlucio,

Desculpe as perguntas mas, o projeto é só para o controle da caixa d'água? Quais utilidades/vantagens que pretende com este projeto?
Estudo/teste?
Se for só para o controle de ligar uma bomba para reabastecer a caixa d'água a partir de uma cisterna, acho um desperdício de tecnologia
pois no mercado temos bóias elétricas para esse objetivo e são bem baratas!

Conta mais o que deseja/objetivo! :wink: :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 carlucio » 24 Jul 2014 00:13

Renie,

Em primeiro lugar, aprender a usar o hcsr04 que é um sensor barato (R$10,00), e o uso principal é sim a caixa d'agua da casa. E para poder acompanhar de maneira visual "lcd" o que anda acontecendo la no forro, para evitar ficar sem agua (ou seja racionar o consumo de maneira inteligente), sendo que posso tambem num futuro adequar outras funçoes sabendo destes detalhes.

Objetivo principal: Controlar de forma racional o consumo de agua.

Assim que conseguir esta parte, quero adaptar um sensor de fluxo hall para saber ate da vazão por minutos do consumo de agua na casa.

Aqui onde moro tenho um certa rotina de falta de agua. Acaba dia dia e volta no outro dia ou seja 24hs sem abastecimento, imagina voce passar por isso ?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor Renie » 24 Jul 2014 01:11

Olá Carlucio,

Tranquilo, estudo e "controle da família", neste caso o envolvimento é correto! :wink: :wink:

Muito válido seu empenho, e deve ser seguido por muitos moradores de Sampa! Se não tiver mais, não tem como comprar na esquina! :o

Felizmente não tenho esse problema aqui, apesar de ter fornecimento de água disponível na porta, não uso, minha água é de poço artesiano
e o controle do abastecimento da caixa d' água é por bóia elétrica, meu problema maior era com a rede elétrica mas parece ter estabilizado! :wink:

Tentarei continuar ajudando mas, além de afastado da eletrônica há anos, de C minha experiência é 0,01%! :oops:
[]'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 » 24 Jul 2014 14:54

Andre,

Sera que meus calculos estão certos?

600mm (60cm) x 109 litros ( capacidade real do balde) = 0,182 l / mm.

Então devo declarar:

const float k = 0,182 ( que o compilador não esta aceitando declarar e não entendi o porque).


Então:

exibe_distancia( K*ler_US() ); (0,182 x ler_Us). É isso mesmo?

Porque não consigo lançar o valor 0,182 no programa, o que esta errado?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Sensor de nivel utilizando hcsr04

Mensagempor ze » 24 Jul 2014 15:50

tente
#define k 0.182
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Sensor de nivel utilizando hcsr04

Mensagempor Renie » 24 Jul 2014 19:28

Olá Carlucio,

...Porque não consigo lançar o valor 0,182 no programa, o que esta errado?


Você tem que usar ponto ao invés de virgula! :wink:

Ps: para obter o percentual é só multiplicar o valor em litros por 0.9174
[]'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

AnteriorPróximo

Voltar para PIC

Quem está online

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

cron

x