Eae pessoal, tudo bem ? então eu a alguns dias fiz umas postagem aqui no fórum a respeito de um projeto que estou desenvolvendo de um sensor de vazão com um display e o pessoal me ajudou muito, e agora estou melhorando o projeto, já coloquei um menu no display pra ter acesso a todas as informações, coloquei 2 LED's para sinalizar algumas situações e etc.

e agora queria fazer a seguinte coisa, colocar um LED que acendesse caso a vazão permanecesse maior que 1 por mais de 5 minutos. Eu estou começando agora no Arduíno e não tenho muito experiencia com programação.

vou disponibilizar a programação que estou usando e um esquema que eu montei no Fritzing do projeto.

Vazao.ino

Exibições: 771

Anexos

Responder esta

Respostas a este tópico

olá novamente J. Leonardo.

      Antes de tudo, gostaria de parabenizá-lo por ter avançado em seu Sistema. Isto também mostra que o objetivo que visamos quando colaboramos aqui, tem resultado. Eu digo isto também por experiência própria, pois quando comecei nesta área a mais de 37 anos atrás, eu procurei seguir os exemplos realmente significativos (com critério e procurando ter bom senso).

      E tenho certeza que todos que colaboram aqui ficam contentes quando estes resultados aparecem (em especial, não posso deixar de mencionar o RV (o "Minerin"), que tem colaborado aqui de forma inigualável).

      E como seu Sistema foi baseado no código que sugeri no seu tópico anterior,  irei postar uma "nova" implementação, partindo deste seu código atual. Mas para um "upgrade" realmente significativo, farei uma implementação "elegante" e muito técnica, que possa permitir vc ir ainda mais além, expandindo-a conforme vc evolui com o Sistema, e assim progredindo com seus conhecimentos na área. Isto também permitirá vc perceber como técnicas simples e clássicas tem resultados impressionantes quando usadas adequadamente.

      Já olhei seu código, e já visualizei as técnicas a serem usadas. A única coisa que não ficou claro, é a figura que vc postou, pois ali tem um módulo Bluetooth HC-05, e no seu código não há nada relacionado.

      Assim que eu tiver elaborado a implementação, postarei aqui, com todas as informações necessárias que permitam evoluir o Sistema.

      Abrçs,

      Elcids

Ola novamente Elcids.

  Eu realmente sou muito grato a ajuda que tanto você quanto o RV me deram no projeto, com isso consegui aprender bastante coisa sobre Arduíno e programação, eu li atentamente suas explicações e a programação no outro post e isso me fez aprender muita coisa legal que usei pra tentar implementar o projeto.

  Inicialmente eu iria fazer algo bem simples mesmo, mas com a ajuda de vcs pude pensar um pouco alem. Andei dando uma pesquisada em como poderia fazer pra armazenar esses dados e vou futuramente colocar um modulo de cartão SD e também um de data e hora (RTC DS3231), com isso vou poder deixar o projeto bem completinho.

  A questão do modulo Bluetooth que coloquei foi um teste que estava fazendo com um app bem simples que estava tentando desenvolver no site Kodular. O app serviria apenas para poder mostrar os dados que aparecem no monitor serial, mas futuramente planejo colocar alguns dados mais precisos, como gráficos de consumo de água e etc. mas ainda estou pesquisando a respeito.

  Novamente agradeço a sua atenção e sua ajuda, que foi muito importante pra minha evolução nessa área.Vou deixar agora algumas fotos do protótipo ( ainda falta colocar algumas coisas que ja estão na simulação como os leds e o botão de reset)  

Abrçs,

J. Leonardo

Boa noite JL,

como você  está muito bem assessorado pelo EC, não tenho tido necessidade de dar meus palpites.

Agradeço muito ao EC, quando cita meu nome referenciando ao fato da minha colaboração aqui no LdG.

Eu considero que tudo que aprendi foi de alguma forma com a ajuda de alguém.

Sejam meus professores, sejam artigos de revistas técnicas escrito por alguém,, sejam papos com amigos do

trabalho ou pessoais,

Enfim não é nada pra que eu leve embora para o além.

Se eu conseguir transferir para outros amigos meu conhecimento e experiências, irei feliz.

RV

olá RV.

      Sua contribuição aqui é inestimável.  E mesmo seus mais de 6 mil posts, não refletem sua colaboração, que é equivalente a 10 vezes isso.

      Espero que em breve possamos fazer uma parceria de colaboração aqui.

      Abrçs,

      Elcids

olá J. Leonardo.

      Desculpe a demora em responder. Há dias concluí o design que me propus a implementar, mas a publicação é geralmente mais demorada.

      Esse design poderá ser utilizado como referência para seu Sistema atual e suas futuras implementações. E depois de publicado este, irei fazer uma pequena melhoria em termos de desempenho na precisão do processo de medir o Fluxo (ou a RPM de algo em um Sistema), e publicarei aqui também.

      Não deixe de ler todo o texto, pois há considerações importantes nele.

 

      Lembrando que este tópico é praticamente uma continuação de outro do J. Leonardo, onde publiquei uma implementação inicial,  e que está neste link:   "Medição Vazão 1"

 

 

      Mas antes, comentando sobre as fotos do seu Sistema, ficou bem legal, e tem até uma personalização identificando o equipamento ("Hidrômetro Digital"). Vi também que o módulo Bluetooth HC-05  já está conectado no Sistema, e sobre isto, comento no final do post.

 

      Como de costume, quando possível implemento também uma simulação, o que permite que aqueles que não tem o Hardware em mãos, possam testar, fazer experimentações, e aprender com isso.

 

      Para a simulação, aproveitei o Sistema que eu já tinha publicado antes naquele seu outro tópico. Apenas tive que acrescentar no Hardware, a parte dos dois Botões de Controle e dos dois LEDs de sinalização de alertas. Também fiz um pequeno ajuste no circuito que "emula" o Sensor de Fluxo, a fim de que ele tivesse uma faixa de ajuste da "Vazão" mais de acordo com a faixa que vc está usando. O arquivo para simulação no Proteus  está anexado no final do post.

 

      Então começando pela simulação, o circuito pode ser visto na figura a seguir:

 (clique na figura para "zoom") 

 

      Na figura a seguir, pode-se ver o resultado após quase 14 segundos de simulação (este tempo é "virtual").

 (clique na figura para "zoom")

 

 

      No Display LCD é exibida a informação conforme selecionada via Botões de controle "Up" e "Down", e no Terminal do Arduino são "printados" dados a cada segundo (ou seja, a cada vez que é obtida uma nova amostragem da Vazão).

      Nota-se que além da Vazão "instantânea", também é "printado" no Terminal do Arduino, a Vazão Média (sobre a qual falo mais adiante), a qual vai aumentando até praticamente se igualar ao valor instantâneo (como esperado).

 

      Mas após isso, eu aumentei em "TP10" (o Trimpot para ajuste do Fluxo), para que a Vazão ficasse acima do Limite (que é 1 L/minuto).

      O tempo necessário para detectar a Vazão Limite é de 5 minutos conforme o J. Leonardo especificou, ou seja, a Vazão tem que ficar acima do Limite por 5 minutos para que seja emitido um alerta. Porém, apenas na simulação eu diminui este tempo para 1 minuto, para não ter que esperar muito para ver o resultado.

      E este resultado pode ser visto na figura a seguir, que mostra ligado o LED vermelho  "Alerta Vazão":

 (clique na figura para "zoom")

 

  

      Nota-se também que pelo tempo decorrido, que novamente o valor da Vazão Média praticamente já igualou a Vazão instantânea.

 

 

      Agora falando sobre o código, cujo link para download está no final do post.

 

      Um ponto importante a salientar, é que o Sistema calcula continuamente a Vazão Média, e usa esse valor como referência para determinar se a Vazão Limite (no caso, 1 L/minuto) foi excedida (claro, após se manter assim por tempo determinado). Isso é necessário porque a Vazão "instantânea" terá variações, o que poderá impedir o Sistema de detectar o limite e emitir um alerta. Exemplo:  a Vazão Limite é de 2 L/minuto  e a Vazão instantânea está em 2,1 L/min a algum tempo, mas cai por 3 segundos para 1,9 L/min, e em seguida volta a subir indo para 2,3 L/min. Neste caso, quando a Vazão caiu momentaneamente para 1,9 L/min,  isto interromperia a contagem de tempo para emissão de um alerta, o que seria um problema caso essas quedas ficassem ocorrendo e impedindo o alerta de ser emitido. Usando a Vazão Média, diminui-se a possibilidade desse problema, uma vez que variações momentâneas na Vazão, terão efeito menor no valor da Vazão Média.

      No código, você pode determinar quantas amostras irão compor a Vazão Média, conforme mostro mais adiante.

 

      Além de usar a Vazão Média para o alerta, o código também tem uma tolerância para o valor da Vazão Limite, sendo esta tolerância sempre "para baixo" (já que não teria sentido ser também "para cima"). Exemplo: se a Vazão Limite é de 2 L/min, e a tolerância é definida para 10%, então o Sistema considera como valor limite efetivo, os 2 L/min menos 10% de 2 L/min. Ou seja, 2 - 0.1 x 2 = 1,8 L/minuto. A tolerância pode ser facilmente alterada no código (como mostro adiante), e caso não se deseje utilizá-la basta então especificar uma tolerância de 0%.

 

      A verificação para alerta de Vazão Limite, é temporizada, ou seja, é feita em intervalos de tempo. No código, este intervalo de tempo está especificado em segundos (como mostro logo adiante). Como resultado, esta temporização também ajuda a minimizar alertas errôneos, uma vez que pequenas variações podem até ser ignoradas pelo Sistema. Exemplo: a Vazão Média está próxima ao limite mas abaixo dele, e fica acima desse limite por 5 segundos, voltando a ficar abaixo em seguida, e como isso ocorre entre dois intervalos de verificação, a variação acaba não sendo detectada (mas seria, se fosse efetiva e ficasse mais tempo acima do limite).

 

 

      Outros detalhes de definições no código, são descritos a seguir na ordem que eles aparecem no próprio código. Lembrando que logo no início do código, estão definidos os parâmetros mais significativos e que são normalmente os mais alterados em implementações diversas. A quantidade de parâmetros é um pouco extensa, e além das definições de parâmetros constantes, há também algumas variáveis/flags importantes para o funcionamento do Sistema. No texto a seguir, descrevo os tais parâmetros mais significativos e aponto algumas funções mais relevantes para o Sistema.

 

 

      A figura a seguir, mostra a definição dos fatores para cálculo da Vazão "instantânea" e da conta de água.

 (clique na figura para "zoom")

  

 

      O "fator_Vazão" permite o cálculo da Vazão "instantânea" em mili-Litros por segundo. Assim no código, para se obter a Vazão em Litros por minuto, basta multiplicar a Vazão instantânea por 60 (já que 60 segundos= 1 minuto) e dividir por 1000 (já que 1000 mili-Litros = 1 Litro).

 

 

      Na figura a seguir, são mostrados os parâmetros usados para determinar se o Sistema deve emitir um alerta de Vazão acima de um limite definido. A figura é auto-explicativa, uma vez que os comentários no código descrevem cada parâmetro e explicam como são usados.

 (clique na figura para "zoom")

 

  

      O Sistema emite também um alerta quando o consumo total (o fluxo total acumulado), ultrapassa um limite estabelecido. A figura a seguir, mostra a definição deste limite, em metros cúbicos:

 (clique na figura para "zoom")

 

  

      Observar que como o fluxo é sempre cumulativo, não é necessário tratamento especial (como calcular um valor médio) para se detectar um limiar e consequentemente emitir um alerta.

  

 

      Além de mensagem no Display LCD, dois LEDs são usados para sinalizar o alerta de Vazão Limite  e  alerta de fluxo total acumulado. A figura a seguir mostra as definições para uso destes LEDs no Sistema:

 (clique na figura para "zoom")

 

 

      Sinalizar através de LED é uma forma eficiente de emitir um alerta (alertas auditivos geralmente são mais eficientes, mas nem sempre são os mais adequados devido ao "barulho" resultante). Mas é preciso considerar a cor usada para o alerta visual, neste caso a cor da luz que os LEDs emitem. Eu projetei Equipamentos Eletro-Médicos por 25 anos, e conheço bem as normas relacionadas a alertas naqueles equipamentos (normas compulsórias neste caso), onde alertas visuais devem se restringir a cores como "amarelo", "laranja", "vermelho", e tons semelhantes. Ou seja, não tem sentido sinalizar um alerta com uma cor como "verde" ou "azul" (ou mesmo "branco"). Aqui neste tópico não estamos tratando de equipamentos médicos, mas observem que o bom senso do uso das cores também se aplica de forma muito natural para sinalizarmos alertas.

 

 

      Para selecionar a informação exibida no Display, são usados dois Botões chamados de "Up" e "Down". Acredito que apenas um Botão seria suficiente para esta função, mas o J. Leonardo optou por dois. Mas além disso, um Botão a mais permite mais opções de uso, e isso certamente será necessário se as funcionalidades do código forem expandidas por quem assim desejar (é bem provável que um terceiro e um quarto Botão sejam bem vindos). Os dois Botões são definidos conforme mostra a figura a seguir:

 (clique na figura para "zoom")

  

 

      Como o Sistema é originalmente para o Arduino UNO (ou seja, com Processador "AVR"), o código automaticamente ligará o Resistor de Pullup interno  no pino dos Botões, caso o Nível Lógico de acionamento (com nome "logica_Botao_ON" na figura anterior) seja "LOW", assim dispensando um Pullup externo. Lembrando que o Pullup interno do AVR tem um valor com alta-tolerância, podendo ir de 20 kΩ a 50 kΩ (depende da tensão de alimentação, sendo que tensões mais altas neste caso implicam em impedâncias mais baixas, pois são usados MOSFETs para "construir" os Resistores de pullup). Caso o código seja usado em Sistemas com outros Processadores que permitam também "Pulldown" (como ESP32, STM32, Arduino Due, etc), então pode-se usar a mesma técnica para ligar automaticamente ou o "Pullup" ou o "PullDown" (ou mesmo nenhum deles, caso se especifique que um Resistor externo esteja sendo usado).

 

 

      Para eliminar o "bouncing" (ou trepidação mecânica) resultante do acionamento de um Botão, e assim impedir acionamentos errôneos consecutivos, o Sistema implementa um "tempo de debouncing". Assim quando um Botão é acionado, o Sistema ignora qualquer outro acionamento no mesmo botão, pelo "tempo de debouncing", e isso faz com que a trepidação mecânica não tenha efeito. Como existem Botões de todo tipo no mercado e com maior ou menor trepidação mecânica, é preciso definir qual o tempo de "debouncing" a ser utilizado no Sistema, e isto pode ser visto na figura a seguir:

 (clique na figura para "zoom")

  

 

      Por razões óbvias, este tempo está especificado em unidades de mili-segundos. O tempo de 100 [ms]  definido na figura anterior, é geralmente mais que suficiente mesmo para os "piores" Botões, mas pode-se diminuir ou aumentar o mesmo caso seja desejado.  Este tempo não tem efeito na detecção imediata do Botão, ou seja, quando um Botão é acionado ele será imediatamente detectado. Claro, se o tempo for especificado como "0" (zero), então o "tempo de debouncing" não terá efeito (ou seja, as trepidações mecânicas no acionamento provocarão diversos acionamentos).

 

 

      Como já dito, o Sistema emite dois alertas: um de Vazão Limite e um alerta de Fluxo acumulado (um "alerta de consumo" total). Para ambos, há LEDs específicos para emissão de alerta visual. O alerta de Vazão Limite também é exibido periodicamente no Display (conforme descrito mais adiante). Caso seja desejado emitir outras formas de alerta, pode-se testar as Flags específicas para cada um dos dois alertas. Estas Flags são variáveis do tipo "bool" (ou "boolean"), e assumem o valor "true" ou o valor "false". Quando um alerta é emitido, a Flag respectiva vai ao valor "true". As variáveis correspondentes a estas Flags, são definidas conforme mostrado na figura a seguir:

 (clique na figura para "zoom")

  

 

      Logo, estas Flags podem ser testadas a qualquer momento e em qualquer ponto do código, para se saber se o alerta correspondente foi emitido. Lembrando que o  consumo acumulado  só aumenta, e portanto quando fica além do limite definido para alerta, este alerta passa a ser constante, ou seja, o LED de alerta fica permanentemente ligado e a Flag de alerta passa a ficar em "true" (e não volta mais para "false").

 

 

      Também como dito antes, o Sistema calcula continuamente a Vazão Média em Litros por minuto,  e para isso ele mantém um registro das últimas "N" amostras da Vazão instantânea. Esta quantidade "N" é definida conforme mostrado na figura a seguir:

 (clique na figura para "zoom")

 

  

      A Vazão Média será então o resultado do somatório das últimas "N" amostras, dividido pelo valor "N". No código este total de registros está definido como sendo 10 (dez), mas pode ser alterado conforme desejado (lembrando que quanto maior a quantidade de registros, mais memória RAM é usada para manter estes registros, e mais tempo o Sistema gasta para fazer os cálculos da Vazão Média).

 

 Nota: a página do post não comporta o restante do texto, então estou continuando logo a seguir:

Nota: esta é a continuação do post ( "link" ):

      Para o controle dos dados a serem exibidos no Display, o J. Leonardo usou originalmente uma seleção tipo "Menu", e conforme se aciona os Botões "Up" ou "Down", se seleciona quais dados são atualmente mostrados. Originalmente, eram exibidos 4 opções (Vazão instantânea em Litros/minuto, Fluxo acumulado em Litros, consumo total em metros cúbicos, e o valor da conta de água em R$), mas com a inclusão do cálculo da Vazão Média, esta informação também foi incluída para ser exibida, e dessa forma a seleção no Display tem agora 5 opções. Eu mantive a denominação original das opções, que eram chamadas de "Menu 1", "Menu 2", etc. Mas reformulei a forma como isso é implementado, para facilitar a alteração das opções (seja deletar alguma, seja acrescentar alguma outra). A definição das opções para exibir no Display, podem ser vistas na figura a seguir:

 (clique na figura para "zoom")

  

 

      Trata-se de uma Lista Enumerada (via statement "enum"), com a opções de exibição. A ordem de exibição é exatamente a que se encontra na Lista. Assim se for colocado "Menu_3" antes de "Menu_2", será esta a ordem de exibição. Notar que é preciso definir qual o primeiro item exibido e qual o último item exibido (neste caso o "Menu_1" e o "Menu_5"). Como explicado nos comentários no código mostrado na figura anterior, o primeiro item da Lista deve ser o valor "nenhum_item", embora este item nunca seja usado (o motivo disto é simples mas muito técnico, e por isso não entrarei em detalhes, mas caso alguém queira saber, basta perguntar).

 

      Caso em algum momento se deseje saber no código qual o item atualmente selecionado para ser exibido no Display, basta consultar a variável "item_menu".  Esta variável é definida conforme mostrado na figura a seguir:

(clique na figura para "zoom") 

 

 

      Na definição, também é especificado qual o valor inicial que esta variável assume quando o Sistema é iniciado (após ser ligado ou após um RESET), e claro, é o valor que foi definido para "primeiro_item_Menu".

 

 

      Como dito anteriormente, também é exibido no Display, mensagens de alerta para a Vazão Limite (se houver um alerta). Esta mensagem é exibida a intervalos regulares definidos, e essa exibição dura um tempo também definido. Após terminado esse tempo de exibição, então o Sistema volta a exibir no Display o item atualmente selecionado que estava sendo exibido normalmente. O mecanismo é cíclico, sendo assim repetido no intervalo definido. A figura a seguir mostra a definição do intervalo de tempo entre exibições da mensagem de alerta e quanto tempo dura tais exibições:

 (clique na figura para "zoom")

  

 

      Os dois períodos de tempo estão especificados em segundos. Na definição mostrada na figura anterior, se houver um alerta, a cada 15 segundos será exibida no Display uma mensagem de alerta e cada exibição será de 3 segundos.

 

 

      Para otimizar a exibição no Display, o Sistema só atualiza o mesmo quando é realmente necessário. Isto é particularmente importante se a Interface com o Display for via I2C, que é muito mais lenta que a Interface Paralela (pode ser de 10 a 40 vezes mais lenta). Para tal, apenas quando novos dados estão disponíveis, o Sistema requisita que o Display seja atualizado. Como os dados são atualizados a segundo (devido à taxa de amostragem da Vazão instantânea), então temos uma atualização do Display por segundo. A requisição é feita através de uma Flag booleana, que quando setada em "true" indica que o Display deve ser atualizado. Então quando a função que atualiza o Display detecta que tal Flag foi setada, ela faz a atualização conforme a informação atualmente sendo exibida (claro, após fazer essa detecção, esta função reseta a Flag para "false"). É esta mesma função que também verifica que uma mensagem de alerta deve ser exibida (e neste caso isso depende apenas de que o alerta esteja vigente e que seja o momento de exibir a mensagem de alerta).

      A definição da Flag booleana de requisição de atualização do Display é mostrada na figura a seguir:

 (clique na figura para "zoom")

  

 

      O valor inicial da Flag é setado em "true", o que força uma atualização imediata do Display mesmo que uma amostragem da Vazão ainda não tenha sido obtida (embora uma atualização explícita também seja feita no "setup" do Arduino).

      Como utilizar esta Flag? Quando vc expandir o código, use a mesma técnica, setando a Flag e atualizando o Display apenas quando necessário.

 

 

      No código que eu publiquei no tópico anterior do J. Leonardo, para a medição da Vazão e cálculo dos parâmetros relacionados, eu implementei algo que lembrava uma Máquina de Estados para fazer estas operações. Mas a rigor eu não posso assim classificar porque nem todos os elementos de uma Máquina de Estados estavam definidos naquele código.

      Nesta nova implementação, usei de fato uma Máquina de Estados para controlar aquelas mesmas operações. Isto torna o processo mais simples e permite que quaisquer mudanças no funcionamento sejam facilmente implementadas. Para isto, apenas dois estados seriam necessários:  um para esperar e obter uma amostra da Vazão, e outro estado para calcular a Vazão e os demais parâmetros relacionados. Mas acrescentei um estado a mais, apenas para fazer uma inicialização sistemática do funcionamento do processo (ou seja, este estado é executado apenas uma única vez logo que a Máquina inicia, e depois não é mais executado).

      A figura a seguir mostra a definição destes estados:

 (clique na figura para "zoom")

  

 

      O controle do processo de medição da Vazão e cálculo dos parâmetros relacionados, ou seja, a execução da Máquina de Estados, pode ser vista na figura a seguir:

 (clique na figura para "zoom")

 

  

      A função que executa a Máquina de Estados  é a "executa_MAQ_Monitorar_Vazao", e sua chamada é feita no "loop" do Arduino. Para quem não está familiarizado com o funcionamento de Máquinas de Estados, é interessante comparar esta função com o processo do tópico "anterior" do J. Leonardo e que foi implementado no "loop" do Arduino, pois certamente isso agregará um bom know-how. Como dito, o funcionamento é muito simples, mas extremamente técnico e rigoroso, e por isso mesmo muito eficiente e confiável (ou seja, livre de "bugs").

 

 

      No "setup" do Arduino, não há nenhuma novidade. Mas é importante observar a sequência em que as coisas vão sendo inicializadas para preparar o Sistema para o pleno funcionamento. Também deve-se notar a "limpeza" do processo executado no "setup", evitando-se deixar ali, linhas e linhas de código detalhado (ou talvez melhor dizer "espalhado"). Para conseguir isto, as inicializações são feitas em funções específicas para cada elemento que precisa ser inicializado, deixando claro no "setup" o que está sendo feito e a sequência em que isto é feito. Isto também facilita futuras alterações no funcionamento do Sistema, devido à melhor organização. O "setup" pode ser visto na figura a seguir:

 (clique na figura para "zoom")

  

 

      Finalmente, no "loop" do Arduino, graças a toda a metodologia que foi usada na implementação do restante do código, podemos ver facilmente todos os processos que são continuamente executados  e que o mantém o Sistema funcionando de forma simples e robusta. Isto pode ser visto na figura a seguir, que mostra 5 processos sendo executados no "loop" do Arduino:

 (clique na figura para "zoom")

  

 

      É interessante notar que mesmo que se altere a sequência de execução dos processos no "loop" do Arduino, ainda assim o Sistema funcionará corretamente. Isto é devido à toda a técnica usada na implementação (como uso de Flags de sinalização, Flags de requisição, Processos "fechados", etc, além da própria Máquina de Estados). Mas obviamente, há uma sequência lógica que pode ser percebida, e o bom senso nos diz que é melhor deixar a execução seguir conforme esta sequência lógica, pois isto irá facilitar o entendimento do funcionamento do Sistema, o que facilitará muito o nosso trabalho.

 

 

      Algumas considerações finais:

 

      1)  nesta implementação, observar que apenas no "setup" do Arduino  e eventualmente em alguma função de inicialização (chamada no próprio "setup"), é que se utiliza a função "delay" do Arduino. Então  não utilize  o "delay" fora destas áreas. E cuidado com a enorme quantidade disponível na Internet, de Bibliotecas que fazem uso deliberado do "delay", provocando "travamento" da execução de todo o Sistema (infelizmente o "pessoal" parece que escreve as Bibliotecas esquecendo que o restante do Sistema precisa continuar executando).

 

      2)  sobre a simulação no Proteus, sempre é bom lembrar que dependendo do Computador, o I2C do PCF8574  pode "travar" com mais frequência. Pelas minhas investigações, o problema se restringe realmente ao PCF8574, pois com outros dispositivos I2C isto não ocorre. A performance da simulação no Proteus também cai sensivelmente quando se acessa o PCF8574, e isto afeta a simulação de outros circuitos que não tem relação alguma com o I2C. Assim a simulação do LCD via I2C no Proteus pode exigir uma certa dose de paciência.

 

      3)  sobre acrescentar o módulo Bluetooth HC-05, isto é tranquilo de fazer. Na foto que vc publicou, parece que vc conectou na Serial de Hardware do UNO (pinos "0' e "1" do UNO),  a qual é "compartilhada" com a Interface USB. Isto não está errado, mas deveria ser evitado, pois causa alguns transtornos de desenvolvimento, como o fato de vc ter que desconectar o sinal TX do módulo HC-05  sempre que precisa gravar um código no UNO, além de que causa conflitos quando vc "printa" na Serial para ver no Terminal do Arduino no PC. Assim eu aconselho usar uma "SoftSerial" para evitar os problemas que mencionei. Veja: muita gente critica a "SoftSerial", mas é preciso saber usar adequadamente a mesma. Eu uso o HC-05 com SoftSerial  e funciona perfeitamente via APP no Android, além de não afetar o funcionamento dos demais processos no código executando no Arduino (seja UNO, seja qualquer outro). Como há diversos detalhes sobre como fazer isso de forma adequada (tanto no código no Arduino como no APP no Android), não irei me estender sobre isso aqui, mas saiba que é perfeitamente factível usar no Arduino a "SoftSerial" com o HC-05.

 

  

      O código para o Arduino, incluindo os arquivos para executar a simulação no Proteus, estão aqui:  "vazao_LCD_I2C_LED_02.zip"

 

      A Biblioteca LCD I2C  que o J. Leonardo usou, é esta:  "LiquidCrystal_I2C.zip"

      Mas é simples alterar o código que postei, a fim de se usar outra  LIB LCD I2C (por exemplo para usar a LIB I2C "padrão", no máximo duas linhas precisariam ser alteradas no código de Medição de Vazão).

 

      Espero ter ajudado.  Caso tenha alguma dúvida, não deixe de perguntar.

 

      Abrçs,

      Elcids

Olá Ecilds.

  Fico até sem jeito pra agradecer por essa verdadeira aula que você deu, queria agradecer por toda a atenção e tempo que você se dispôs a me ajudar no projeto e também pela forma altamente detalhada e técnica com que você explicou cada processo que você implementou, você tem realmente uma didática incrível.

  Eu li toda a publicação e consegui entender bem cada passo do projeto, você alem do projeto trouxe informações bastante interessantes que planejo pesquisar mais sobre futuramente. Com sua explicação consegui abrir a mente pra novas coisas que posso estar fazendo para melhorar o projeto ainda mais.

  Agradeço a dica referente ao Bluetooth e vou pesquisar mais sobre o SoftSerial que você falou. Consegui desenvolver um APP bem básico com o que eu já tinha, ele apenas mostrava os valores que apareciam no monitor serial, agora com essa implementação vou melhorar ele e deixar bem mais informativo.

 Novamente agradeço a sua ajuda e vou pesquisar ainda mais para conseguir aprimorar meus conhecimentos na área. Como falei futuramente planejo comprar os módulos de cartão SD e o RTC, para poder armazenar esses dados e atribuir uma marcação de tempo a cada medida, para que assim consiga fazer gráficos mais detalhados sobre o consumo de água. E quando fizer isso postarei aqui no fórum o resultado final.

Abrçs,

J. Leonardo

olá J. Leonardo.

      Nenhum agradecimento é necessário. Apenas espero que os pontos descritos no meu primeiro post neste tópico, tenham sido alcançados. Espero que as informações aqui postadas ajudem a quem precisar de orientação, e se esse alguém aprender mais com o conteúdo aqui colocado, e for além, então melhor ainda.

      Se possível, nos atualize aqui conforme seus testes evoluem. Isto também é importante para outras pessoas também se orientarem.

      Eu publicarei aqui neste tópico uma versão com uma pequena melhoria em relação à precisão da medição da Vazão instantânea, onde irei mostrar o que mudou no código para se obter essa melhoria, e como ela pode ser mensurável (ou seja, qual o real efeito da mesma).  Mas antes dessa publicação, seria preferível ter algum retorno de como o Sistema evoluiu com vc em termos de funcionamento (ou seja se vc alcançou os resultados que esperava).

 

      Abrçs

      Elcids

Olá Elcids.

 Eu já adicionei ao protótipo a parte referente a sinalização e ela esta funcionando perfeitamente. Uma coisa que eu mudei foi a logica referente a contagem da vazão instantânea, eu andei pesquisando e achei o DataSheet do sensor que estou utilizando e fiz as mudanças de acordo com ele. Vou deixar o arquivo PDF do DataSheet anexado pra você dar uma olhada.

g3_4_water_flow_sensor_-_wiki.pdf

E também algumas fotos do protótipo, por enquanto coloquei os 2 LED'S e o botão de reset em uma protoboard mas só para teste

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço