[RESOLVIDO]sensor de vazão com display I2C em conflito

Eae pessoal, tudo bem ? então eu estou desenvolvendo um projeto de hidrometro digital para o meu TCC só que estou com problemas na parte da programação, o que acontece é o seguinte, eu ja tenho a programação do projeto sem o display pronta e quando tento colocar a programação referente ao display ele meio que entra em conflito e o display n funciona, mas se eu apago por exemplo a programação do TCC e deixo só a parte do display ele funciona normalmente
e eu segui todos os passos para poder adicionar o display

coloquei corretamente as bibliotecas

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

instanciei os objetos 

LiquidCrystal_I2C lcd(0x27,16,2);

e o código que coloquei referente ao que devia aparecer no display foi a seguinte

lcd.begin(16,2);

lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Litros p/m”);
lcd.print(calculoVazao);

o sketch completo eu deixei anexado na postagem

Exibições: 695

Anexos

Responder esta

Respostas a este tópico

Bom dia Sr. JL, (se não gosta que te chame pelas iniciais, avise),

   gostaria muito de te ajudar, mas para isto recomendo as seguintes ações:


1. Remova seu sketch da área de texto do seu tópico;

    Remova todos!!!!!!

2Clique em : " Arquivos "  e depois anexe o arquivo  com o seu sketch completo;


3. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar


4. Comente as linhas do seu sketch. Fica mais fácil entender o que vc quer fazer

     com cada linha e facilita a ajuda.

Mas fique 'a vontade caso não queira seguir minhas recomendações.

RV

Fiz as modificações obrigado 

JL,

1. Que tipo de erro você está tendo com seu projeto?

2. Qual o link que usou para baixar esta biblioteca?

3. Comente a linha 57 (para que fique assim: // lcd.init();) e teste novamente.

4. Use a função " lcd.clear();" só na função setup().

  depois conta o resultado pra gente.

RV

1.o problema é que o seguinte quando eu coloco a parte da programação referente ao display no Arduíno nem o sensor mostra os dados no monitor serial e nem o display passa informação

2.o link da biblioteca que usei foi esse aqui https://drive.google.com/file/d/1bSa5tyCN3MOfJj4zkT1RD-bnLCxr6tFv/view

3. fiz a modificação mas continuo com o msm problema 

Olá,

Por favor descreva as conexões da sua placa (qual é mesmo? É um UNO?) com o LCD.

Se puder tirar uma foto do do circuito também será útil.

Sobre a inicialização do LCD:

void setup () {

  lcd.init();               // inicializa o lcd    -- não precisa do begin() - somente se faz isso uma vez!
  lcd.backlight();      // liga o backlight
  Serial.begin(9600);  // inicializa a porta serial em 9600 bps

  // codigo abaixo...

  pinMode(2,INPUT);
  attachInterrupt(0,Vazao,RISING);   // Se vai usar interrupções... não deve usar noInterrupts()

}

void loop() {
   contador = 0;
   //interrupts();               // NAO vejo pra que desabilitar ou habilitar interrupções
   delay(1000);

  // desabilitar as interrupções impede seu sketch de funcionar corretamente...
  //noInterrupts();            // NAO vejo pra que desabilitar ou habilitar interrupções


  calculoVazao= (contador * 2.25);
  fluxoAcumulado = fluxoAcumulado + (calculoVazao / 1000);
  metroCubico = fluxoAcumulado / 1000;
  ContaAgua = metroCubico * 3,59;
  calculoVazao = calculoVazao * 60;
  calculoVazao = calculoVazao / 1000;


  Serial.println("Litros por minuto : ");              // Serial depende das interrupções estarem habilitadas!
  Serial.println(calculoVazao);
  Serial.println("Gasto total L :");
  Serial.println(fluxoAcumulado);
  Serial.println("Metros cubicos totais : ");
  Serial.println(metroCubico);
  Serial.println("R$ : ");
  Serial.println(ContaAgua);

  //lcd.init();                 // NAO se faz isso no loop()
  //lcd.backlight();        // NAO se faz isso no loop()
 

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Litros p/m");
  lcd.print(calculoVazao);


}

void Vazao() {
  contador ++;

}

Muito obrigado pela explicação consegui ver bem onde estava errando na programação. Agradeço muito pela atenção.

olá J. Leonardo.

      A algum tempo atrás, ajudei em um tópico muito parecido com este seu, porém aquele era pouca coisa mais "complexo". Assim, acredito que vc pode aprender algumas coisas lá. O link do referido tópico é este aqui:   "usando dois Sensores de Fluxo"

      Sobre seu código original, percebe-se que vc tem alguns problemas com conceitos de programação, e uma falta de intimidade com isso no Arduino. Por isso, aproveitei o código daquele tópico que mencionei, e adaptei o mesmo para estar de acordo com as funcionalidades do seu código original (o "TCC_S.ino"). Como a simplicidade se manteve, acredito que isto poderá ajudar para que vc vá muito além no desenvolvimento do seu código.

      Para ver este código funcionando, você pode usá-lo diretamente no seu Sistema, sem modificação, pois eu usei as mesmas definições que vc usou no seu Hardware. No final deste post está disponível o arquivo.

      Mais à frente, explico porque seu código original não funcionou como esperado.

      Mas agora, falando um pouco mais sobre esta implementação que estou postando aqui.

      Os fatores numéricos  para os cálculos dos diversos parâmetros derivados do Fluxo de Água, vc pode alterar facilmente logo no início do código, conforme mostro na figura a seguir:

(clique na figura para "zoom")

      Para o teste, fiz a simulação no Proteus, onde emulei o Sensor de Fluxo via um circuito oscilador, o qual gera os Pulsos do Sensor. A frequência do oscilador pode ser ajustada durante a simulação, e consequentemente alterar a vazão "on the fly". Com os valores que usei no circuito oscilador, a vazão pode ser ajustada entre cerca de 5 L/min a 50 L/min.

      O resultado da simulação, vc pode ver na figura a seguir:

(clique na figura para "zoom")

     Com pequenas alterações no código, é possível aumentar a precisão da medição do Fluxo de água. Essencialmente isto consiste em mover a "Janela de Amostragem" para dentro da ISR que é cadenciada pelos pulsos do Sensor de Fluxo, e gerar um evento sinalizando a amostragem e disponibilizando a Contagem dos Pulsos. Mas talvez para uma medição inicial do Fluxo, a precisão atual provavelmente será satisfatória (por isso não fiz esta implementação "mais precisa").

      Observe que utilizei a mesma  LIB  LCD  I2C que vc disse estar usando. Isto justamente para facilitar as coisas. No entanto, eu aconselho que vc utilize uma outra LIB I2C mais comum no mundo Arduino. Claro, se isso for possível. Caso venha a fazer isso, apenas duas ou três linhas de código teriam que ser alteradas (no instanciamento do LCD I2C e usar o método "begin" ao invés do "init"). Mas isso não é necessário, se vc estiver satisfeito com a performance da LIB atual.

      Sobre seu código original não ter funcionado, veja o porquê:  vc criou no "loop" uma "Janela de Amostragem" de 1 segundo,  usando o habilitar e desabilitar as IRQs (Interrupções). Isto não está errado, mas não é a técnica mais adequada, e não irá funcionar em todos os cenários. Quando vc desabilita as Interrupções,  algumas funções que precisam delas, não irão funcionar adequadamente. É o caso do I2C:  a LIB I2C do Arduino (a "Wire"),  é cadenciada por Interrupções, e além disso os eventos que geram estas IRQs são temporizados e únicos, ou seja, se ocorreu e vc não tratou, já era:  alguma parte no código vai ficar a "ver navios", e no caso do I2C, isso pode travar a execução. Então por este motivo, quando vc desabilita as IRQs e acessa o LCD I2C, certamente as funções da LIB não irão funcionar.

      A Serial  também depende de IRQs habilitadas, mas devido à buferização dos dados e a não existência de um protocolo (o I2C tem um), permite que os dados sejam transmitidos logo que vc habilita as IRQs (o que ocorria assim que o "loop" era reiniciado no seu código original).  Mas no caso de recepção via Serial, isto já não se aplica, porque se a Interrupção correspondente não for executada dentro de um certo tempo, dados recebidos via Serial serão perdidos.

      Então como vc vê, o controle de habilitar/desabilitar Interrupções é algo que só deve ser feito se vc tiver o know-how  de como fazê-lo. Do contrário, as coisas vão dar bem errado (ou no mínimo algum efeito colateral irá ocorrer, ainda que "imperceptível").

      O código implementado é este aqui:   "vazao_LCD_I2C_02.zip"

      No arquivo zipado, vc encontrará também os arquivos para simulação no Proteus, caso deseje fazer alguns experimentos. Obs.: dependendo do seu computador, o modelo I2C  do Arduino  no Proteus, pode eventualmente travar, e isto é um problema conhecido por quem usa o Proteus.

      Veja: o código é bem simples e te permitirá ir em frente. E não deixe que a documentação e a organização te passem outra impressão.  Mas a organização e a documentação  são imprescindíveis em termos de excelência profissional, e só agregam vantagens e facilidades. Então use isso a seu favor.

      Espero ter ajudado.

      Abrçs,

      Elcids

Agradeço muito pela atenção Elcids, eu li toda sua postagem e realmente me ajudou bastante com o projeto, consegui ver os pontos onde estava errando e concertar tudo. Mais uma vez muito obrigado pela ótima explicação.

Bom dia JL,

por favor escreva  [ R E S O L V I D O ] antes do titulo do seu tópico,

pois sem isto os amigos ficam pensando que ainda está com problema e ficam gastando o tempo deles

tentando alguma solução para seu problema.

Obrigado pela compreensão.

RV

Gostaria de saber uma coisa... o Leo parece que tinha que fazer um TCC. Com a resposta excelente dada pelo colega Elcids, na prática, ele escreveu o TCC pro Leo.

Isso é bom? Ajudou de fato o Leo em seu futuro profissional?

Bom dia Rodrigo,

então acredito que o post do Elcids me ajudou muito pois eu não só copiei oq ele falou mas também li tudo e consegui ver os pontos onde estava errando. E também tive uma longa conversa com o RV no chat onde ele me explicou bastante coisa sobre o projeto. Mas agradeço pela preocupação e estou estudando mais sobre o Arduíno para poder melhorar.

Abrçs,

José 

Bom dia RV,

desculpa só vim ver agora já fiz a correção, obrigado.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço