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.
Alguma dica de como proceder?
Tags:
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
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ão, do 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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por