Boa tarde, estou tentando ler um sensor de fluxo com um display lcd usando comunicação i2c.

Pelo o que eu percebo, há um conflito entre esses dois pois quando eu uso o lcd normal (sem conunicação i2c) usando o exemplo clássico Hello World do LiquidCrystal funciona.

Eu peguei um exemplo simples do sensor de vazão e juntei com um exemplo simples display lcd com i2c e só de habilitar e desabilitar a interrupção o lcd nem pega.

Ao que parece, essa pessoa passou pela mesma situação mas não obteve ajuda:

http://labdegaragem.com/forum/topics/sensor-de-fluxo-d-agua-integra...

fiz uns testes e só a palavra "teste" apareceu (olhar o código) por estar antes da interrupção e também um contador i e só aparece uma única vez. O código parece não rodar.

https://pastebin.com/hVYibFY4

Alguma dica de como proceder?

Exibições: 1579

Responder esta

Respostas a este tópico

olá Hélio.

      Acho que vc está fazendo alguma confusão com o processo. Vou esclarecer em detalhes.

      Mas antes, vou postar a simulação que fiz agora a pouco, pois será mais um recurso que vc poderá utilizar, já que pode poupar tempo de desenvolvimento (claro, a simulação deve ser utilizado com critério, senão não tem sentido, e aí as pessoas vem dizer que a simulação não funciona ou não corresponde à realidade - mas na verdade são as pessoas que não sabem usar a simulação de forma adequada para que corresponda à realidade).

      Veja o resultado:

(clique na figura para "zoom")

      Alguns pontos importantes sobre esse resultado:

      1) para o Sensor de Fluxo, foi utilizado um Gerador de Sinais, o qual está gerando uma onda quadrada na Frequência que o Sensor de Fluxo envia para o pino "2" do Arduino. No resultado da simulação mostrado na figura anterior, esta Frequência está em 217 Hz, o que no seu Sistema corresponde  a 39.45 L/min (ou seja, o resultado de  217 / 5.5). Para alterar a Frequência, altere as propriedades do Gerador de Sinais, mudando o parâmetro "Frequência" (no circuito aparece com o nome "CLOCK"). Neste circuito, usei um Gerador que não permite alterar a Frequência enquanto a simulação está rodando. Mas existe uma imensidade de geradores disponíveis para o Proteus, que permitem mudar a Frequência durante a simulação. Vc pode usar qualquer um deles, o que será interessante porque vc verá a alteração da Vazão em "tempo real". Se vc não encontrar um Gerador assim, me avise que eu implemento um para vc.

      2) no Osciloscópio usado na simulação, você pode ver os Pulsos gerados pelo Sensor de Fluxo. No Datasheet do Sensor que vc está utilizando, diz que o "duty cycle" é de 50%, e vc pode ver isso na onda mostrada, além é claro de conferir a Frequência e amplitude do Sinal gerado.

      3) o Módulo I2C para LCD, está como o Hardware da plaquinha comercializada aos montes por aí. No entanto existem versões usando o PCF8574 e o PCF8574A. A diferença, é apenas a faixa de endereços I2C do Módulo. A plaquinha que tem o PCF8574 tem endereço default em 0x27, e a que tem o PCF8574A tem endereço default 0x3F. No módulo que implementei na simulação, você encontrará um "DIP Switch", onde pode mudar o endereço (baseado no endereço default), o que permite utilizar até 8 Módulos deste tipo, simultaneamente (cada um com um endereço diferente configurado no "DIP Switch").

      4) O Terminal do Arduino está incluído, e pode ser usado exatamente como se usa na prática. Embora no seu código original ele não esteja sendo usado, achei conveniente deixá-lo ali, pois poderá ser útil para depuração na simulação.

      Segue então o código e simulação correspondente:    I2C_x_IRQ_00.zip

      Observe que há duas pastas com arquivos de simulação:  uma para quem está usando a plaquinha I2C com o PCF8574 (endereço base 0x27), e outra para quem está usando como o PCF8574A (endereço base 0x3F, que é o seu caso Hélio). Testei ambas, e funcionaram perfeitamente.

      Mesmo assim uma observação: a simulação do I2C do Arduino no Proteus, tem uma certa sensibilidade à performance do computador onde está rodando. Se o seu computador tiver uma boa performance, não ocorrerá nenhuma falha (se tiver baixa performance, durante a simulação evite rodar outras programas pesados que requisitam uma certa performance do computador, evitando "competição" com o simulador).

      Agora, falemos sobre o processo.

      Vc disse que o código "I2C_Dispaly.ino" do RV, funcionou corretamente. E realmente deveria funcionar, pois da forma como está, irá medir corretamente a Vazão.

      Veja Hélio:  o que o Sistema precisa fazer, é medir a quantidade de Pulsos vindos do Sensor de Fluxo, em um certo período de tempo. Como isto está sendo medido durante 1 segundo, essa medição corresponde exatamente à Frequência dos Pulsos vindos do Sensor de Fluxo.

      Vc disse que não entendeu como o RV conseguiu medir "sem ter habilitado e desabilitado a interrupção". Veja: o RV fez uma condicional com "if" onde ele espera (através do "millis"),  que se passe 1 segundo. E quando se passa esse 1 segundo, ele simplesmente lê a contagem de pulsos que está na variável "contaPulso" e calcula a vazão. E depois, essa contagem "contaPulso" tem que ser zerada, para permitir reiniciar um novo ciclo de contagem. E para permitir que se conte novamente mais 1 segundo, ele usa o "millis" atual como uma referência para cronometrar mais 1 segundo a partir dessa contagem do "millis" atual.

      No "background", as Interrupções estão sendo cadenciadas pelos pulsos vindos do sinal do Sensor de Fluxo. A cada novo pulso, uma nova Interrupção ocorre, e a cada Interrupção o contador "contaPulso" é incrementado. Assim após 1 segundo, terá sido contado exatamente a quantidade correspondente à Frequência dos Pulsos. Mas como o "if" do código do RV zera o "contaPulso" a cada segundo, então, cada vez que o código dentro do "if" for executado, lendo o "contaPulso" teremos exatamente a Frequência dos pulsos medida.

      Então veja:  tudo se resume a medir a quantidade de pulsos,  dentro do período de 1 segundo. É isso que vc tentou fazer no seu código original, mas como as Interrupções estavam ficando desabilitadas quando vc acessava o LCD, isso acabava travavando o I2C do Arduino (como eu disse em post anterior, as Interrupções tem que estar habilitadas para o I2C funcionar). Siga a sequência de execução do código, que está na figura onde mostro as "setas na cor rosa", e vc verá exatamente isso acontecendo.

      Assim o que precisa, é habilitar e desabilitarIRQ (Interrup Request), de forma a detectar que passou 1 segundo, mas sem corromper o protocolo I2C. Nas alterações "brutas" (que foram inclusive usadas na simulação), é exatamente isso que faço.  Pegue o código com as alterações "brutas", e siga a sequência de execução como mostrei na figura com as "setas na cor rosa", e verá isso.

      Agora o dilema (será?):   qual técnica usar?

      A técnica que o RV usou, está perfeitamente correta. Mas é uma técnica usada para testes. É ótima para isso.

      E a técnica "bruta", é simplesmente "bruta"!!!!  A técnica "bruta" é muito "primitiva", e não permite flexibilidade alguma no código. Nem para testes eu usaria. Só usei para tentar demonstrar a vc, o problema que estava ocorrendo no seu código, que era o "travamento" do protocolo I2C.

      Se vc estiver implementando algo mais profissional, então use uma metodologia de Amostragem (como a que eu usei e que está no arquivo "I2C_x_IRQ_02.zip" no meu primeiro post). Há diversas técnicas de amostragem. Eu usei uma bem simples ("Amostragem Síncrona"), pra evitar confundir os princípios básicos com elementos mais sofisticados, pois o objetivo era apenas conseguir uma medição correta, usando uma técnica de amostragem simples (mas posso te garantir que existem técnicas muito mais sofisticadas, "Assíncronas").

      Então aqui vai uma sugestão:  teste com o código que o RV postou (o "I2C_Dispaly.ino"). Então imediatamente a seguir, compile e teste com o código "bruto". Eu fiz isso exatamente assim, e funcionou perfeitamente.  Se não funcionar, é porque alguma coisa "diferente" vc está fazendo, e só acompanhando isso ou conversando sobre o procedimento, pra descobrir o que é.

      Espero ter ajudado.

      Abrçs,

      Elcids

Boa tarde Elcids, 

Veja as especificações do sensor YF-S401 que ele esta usando.

Os seus cálculos são para outro tipo de sensor. 

Flow Rate Range: 1~ 5 L/min  ( máximo 5 litros/minuto) 

Flow pulse characteristics F = (98 * Q) ± 2%    Q = L / MIN

Frequencia = (98 * Q )      Q = Litros/minuto 

Q = Frequencia / 98 

Exemplo ( 217 Hz) :

Q = Frequencia / 98  = 217 / 98 = 2,21 L/min

Hélio, o seu sensor de fluxo de vazão é igual à esse ?

http://labdegaragem.com/profiles/blogs/tutorial-como-utilizar-o-sen...

Tutorial muito bom :

http://wiki.seeedstudio.com/G3-4_Water_Flow_sensor/

Eu usei esse tutorial do LdG mas eu tenho esse modelo de sensor aqui:

https://www.google.com.br/url?sa=t&rct=j&q=&esrc=s&...

modelo YF-S401 caso não baixe o pdf acima.

OK , você viu isso ?

Flow Rate Range: 1~ 5 L/min  ( máximo 5 litros/minuto) 

Water Pressure: ≤1.75MPa  (pressão d'agua máxima) 

Error: +/-2 L/min (o que é isso?? esse erro esta muito grande - deve ser tradução incorreta do Mandarim)

O erro é de 2% +ou-

Flow pulse characteristics F = (98 * Q) ± 2%    Q = L / MIN

Frequencia = (98 * Q )      Q = Litros/minuto 

Q = Frequencia / 98 

Você precisa implementar essa operação no seu programa. 

Exemplo ( 200 Hz) :

Q = Frequencia / 98  = 200/98 = 2,04 L/min

Foi desse valor mesmo que eu tava falando. Tenho que trocar o 5.5 do código por 98 pra ter um valor mais preciso. Nos testes que eu fiz, ele já dava um valor bem diferente do real e com esse fator de divisão de 98 vai melhorar com certeza.

Eu imagino que esse erro de +/- 2L/min seja por deslizamento, porque eu consigo ouvir como se ele deslizasse às vezes.

Complementando os cálculos para o sensor YF-S401:

https://forum.arduino.cc/index.php?topic=538366.0

Volume  = 1 Litro corresponde a 5880 pulsos            1 minuto = 60 segundos

Para a vazão de 1 Litro / minuto => 

Frequência  = 5880 pulsos / 60 seg =  98 pulsos/seg = 98 Hz  

 

Verifique se o seu sensor é igual ao dos tutoriais.

Faça uma montagem primeiro com o sensor enviando os dados para a Console Serial da IDE.

Depois implemente o uso do LCD. 

E assim terá sucesso! 

Eu já usava esse sensor pela Serial e também pelo LCD utilizando a ligação comum pelo tutorial Hello World do LiquidCrystal.

Só agora quando adquiri o módulo I2C pro display que deu esse conflito.

O que eu já vi é que pro meu sensor eu não uso a constante 5.5 e sim outro valor.

Se a frequência for calculada com o período em milisegundos :

Frequência = 1.000 / periodo


Vazão (L/min) = Frequência / 98 

tente substituir isso lcd.print(vazao);

por lcd.print (vazao, DEC);

e vê se vai exibir.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço