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

Boa noite HN,

existem alguns conceitos e lógicas eradas no seu sketchs ,

Testa este que corrigi, e depois conta o resultado pra gente.

RV

Anexos

erradas*

Bom dia Mineirin, seu código funcionou, obrigado pela ajuda.

Só não entendi como funcionou sem ter habilitado e desabilitado a interrupção e substituindo pelo millis(). 

Você poderia me explicar?

Bom dia Rui, 

O nome do arquivo que enviou contem alguns caracteres adicionais que a IDE rejeita. 

I2C_Dispaly(UKaa4m)

Dica para o Hélio, retire os parenteses do nome do arquivo. 

Hélio, você sabe informar a frequência máxima dos pulsos do medidor de vazão? 

Bom dia José, eu retirei os caracteres (UKaa4m) na hora de salvar o código.

Pelo o que eu testei aqui, na minha aplicação não passaria de 200 pulsos.

 Seria 200 pulsos/seg (200 Hz) ?

Exatamente, eu estou pegando esse valor da variável contaPulso.

Olá Hélio.

      Como o RV disse, há alguns conceitos equivocados no seu código.

      Embora o código que o RV ajustou vá permitir vc ver o valor correto da vazão, também alterei o seu código original, de forma mais técnica e sistemática, tentando te mostrar alguns conceitos de medições por amostragem (que provavelmente era o que vc estava tentando fazer).

      Segue o código ajustado:   I2C_x_IRQ_02.zip

      Não se deixe enganar, achando que a técnica é complexa. Olhe bem o código e verá que é simples. Mas caso tenha alguma dúvida, não deixe de perguntar.

      Informação adicional:  no Arduino, a Interface I2C (o "Wire") precisa que as Interrupções estejam habilitadas para funcionar corretamente. Vc pode até desabilitá-las por curtos instantes de tempo (o mais curto possível !!!), que ainda assim o mecanismo do I2C irá conseguir fazer o cadenciamento do protocolo I2C. Mas se desabilitar como vc estava fazendo antes (por cerca de 1 segundo), então isso vai "emperrar" o protocolo I2C, causando falhas na comunicação.

     Uma dica:  para testar, vc pode desconectar o sensor de vazãodo pino de Interrupção (no seu caso, o pino "2"). Então conecte apenas um pedaço de fio (entre 10 e 20 cm) no pino de Interrupção. Com isso, a interferência de 60 Hz da rede elétrica irá gerar IRQs, exatamente na taxa de 60 vezes por segundo. Então no display vc verá o valor 10.91, que é justamente 60/5.5, onde 5.5 é o fator de cálculo que vc usou no seu Sistema.

      Abrçs

      Elcids

olá novamente Hélio.

      Corrigindo uma informação que mencionei acima sobre o seu código original:

      Ao contrário do que mencionei no post anterior, as Interrupções no seu código original, ficam desabilitadas por bem menos de 1 segundo. Veja a figura a seguir:

(clique na figura para "zoom")

      A partir do momento que o "cli()" é executado, as IRQs ficam desabilitadas. Isso bloqueia a cadência do protocolo I2C. Então, o "loop()" termina e reinicia novamente. A partir do "sei()", as IRQs são novamente habilitadas (ficando assim por 1 segundo, para permitir a contagem dos Pulsos na sua ISR). Mas durante o período de tempo que as IRQs estiveram desabilitadas, vc usou justamente o I2C para atualizar os dados no LCD. E como eu disse anteriormente, o I2C precisa que as IRQs estejam habilitadas. E portanto naquele período, o LCD não vai receber os novos dados.

     Mas seu código original, pode funcionar com pequenas alterações, ainda que um tanto "brutas" (ou seja, não é a melhor técnica a usar). Veja na figura a seguir, onde marquei em amarelo estas modificações "brutas":

(clique na figura para "zoom")

     Teste esta modificação "bruta", e veja que também irá funcionar (pra facilitar o teste use o método da interferência de 60 Hz que mencionei no post anterior). Essencialmente, nestas modificações "brutas", eu habilitei e desabilitei as IRQs conforme necessário.

     Mas aconselho usar a técnica de amostragem que mostrei no post anterior, pois ela vai permitir fluidez e mais liberdade no seu código.

     Apenas para curiosidade: fora do "loop", o Arduino executa também algum código, relacionado à Serial e ao USB (se este for "nativo", como é o caso do Arduino Leonardo e outros).

     Abrçs,

     Elcids

Bom dia Elcids, muito boa a explicação, obrigado pela ajuda. Testei o seu código e esse com modificação bruta e nenhum funcionou. O que pode ter acontecido?

olá Hélio.

      Acabei de testar os dois códigos aqui, com Arduino UNO e um LCD I2C 20x4. Ambos funcionaram perfeitamente (o primeiro que postei "I2C_x_IRQ_02.ino", e o seu com as alterações "brutas").

      O endereço do seu LCD I2C é o mesmo que está no código (no caso 0x3F) ?

      Confira o endereço, pois no comentário do seu código, isto estava confuso.

      Peguei seu código original, e acrescentei apenas a parte "bruta" (aquela parte que marquei em amarelo no post anterior). Veja o resultado da compilação:

      Para o sinal do Sensor, injetei diversas frequências, e todas foram medidas corretamente (claro, considerando o seu fator de 5.5). Testei também com a técnica do ruído de 60 Hz, funcionando da mesma forma.

      Para teste, você pode também mudar o fator para "1.0", com o que estará medindo diretamente o valor da frequência (já que o período de medição é de 1 segundo). Testei tanto com "5.5" como "1.0".

      Estou anexando o código:  I2C_x_IRQ_00.zip

      Veja que é exatamente o seu original com o acréscimo das partes "brutas". Tirando isso, não modifiquei absolutamente nada no código.

      Mas veja: a forma adequada de medir, é da forma que mostrei no primeiro post (arquivo "I2C_x_IRQ_02.ino"), com uma amostragem sistemática (a qual também acabei de testar e funcionou perfeitamente).

      Caso vc ache interessante, posso também implementar uma simulação e postar a mesma.

      Abrçs,

      Elcids

Mas você testou com o sensor de fluxo? o display funciona normal com o contador de amostras mas o valor do fluxo não sai de zero mesmo tendo fluxo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço