Sistema Hidrômetro Remoto

Estou com um projeto de Hidrômetro remoto, onde o Arduino irá ler os valores de um sensor anexado a um hidrômetro. Para simular no arduino antes de implementar o sensor de vez, decidi utilizar um led que faz uma contagem de pulsos (vezes que ele liga) e é controlado por um botão. Além disso o projeto está sendo simulado na plataforma SimulIdle, e é aí que entra minha dúvida. Para começar a introduzir o sensor, que eviará pulsos ao arduino, implementei um gerador de ondas quadradas (clock) no círcuito. Gostária de saber como posso fazer para que o meu código do arduino leia essas alterações e a cada pulso contabilize mais um valor, e quando chegar em 10 pulsos, reinicie a contagem. Além disso, cada pulso indica a passagem de 0,001L pelo hidrômetro, e eu gostaria de que o meu código fizesse a soma.
É minha primeira vez utilizando o fórum e gostaria de saber como faço para adicionar imagens, assim eu consigo mostrar meu círcuito também!
Obrigada pela atenção, qualquer dúvida sobre o projeto estou a disposição :slight_smile:

const int botao = 2; 
const int led = 13; 

int contador = 0;// Define o estado inicial de contador como 0 

boolean state = 0; // Cria uma condição de estado booleano 

void setup() {
  pinMode(13, OUTPUT);   // Define o pino do LED como saída
  pinMode(2, INPUT_PULLUP); // Define o pino 2 como entrada 
Serial.begin(9600); 
}
void loop() {
  if (!digitalRead(botao)) // Se o botão é lido 
  state = !state; // Inverto o estado do botão 
  if (state) { // If com estado do botão inalterado 
      digitalWrite(led, HIGH);
      delay (50); 
      digitalWrite(led, LOW); // Cria o pulso do led 
    delay(50); 
    contador++
    if (contador>10) 
    Serial.print
    Serial.print("");
    Serial.println (contador);// Imprime o contador no monitor serial

  } 
  else {
   digitalWrite(led, LOW); // Caso aconteça algo além do if 
  }
  while (!digitalRead(botao)) {} // Aguarda soltar o botão
    delay(50);
}

Para fazer upload de imagem voce tem opções.
Usar o copy/paste copiando a imagem e colando na area de replay ou clicando
no icone indicado pelo circulo vermelho.
image

No seu projeto que dispositivo será usado para ler o hidrômetro?
Qual a frequência destes pulsos vindo do hidrômetro? (min e max).

Não uso este simulador que voce citou, mas uso o Wokwi que é online.
Vou similar o seu código nele.

PS: existem erros de sintaxe no seu código, faltam ; no final de 2 linhas.
Da forma que está não compila.

1 Like

Olá, obrigada :slight_smile:
Vou utilizar um sensor chamado Sirius ACBR da sensorLab, ele consegue emitir até 7 pulsos por segundo (max) e nao tem uma minima.
Fiz umas correções no código, pois eu quero que a cada pulso simbolize +0,001 m^3. Entretando, a soma não está funcionando da forma esperada, ao invés de somar na ultima casa de 0,001 ele soma na primeira, então fica 1,001. Vou tentar arrumar hoje durante o dia.
Obrigada novamente

const int botao = 2; 
const int led = 13; 

float contador = 0.001;// Define o estado inicial de contador como 0.001

boolean state = 0; // Cria uma condição de estado booleano 

void setup() {
  pinMode(13, OUTPUT);   // Define o pino do LED como saída
  pinMode(2, INPUT_PULLUP); // Define o pino 2 como entrada 
Serial.begin(9600); 
}
void loop() {
  if (!digitalRead(botao)) // Se o botão é lido 
  state = !state; // Inverto o estado do botão 
  if (state) { // If com estado do botão inalterado 
      digitalWrite(led, HIGH);
      delay (1000); 
      digitalWrite(led, LOW); // Cria o pulso do led 
    delay(1000);
     Serial.println (contador,3);// Imprime o contador no monitor serial
     contador++,3; 
    }
 
  else {
   digitalWrite(led, LOW); // Caso aconteça algo além do if 
  }
  while (!digitalRead(botao)) {} // Aguarda soltar o botão
    delay(50);
}

Sem olhar para o resto, você precisa trocar essa linha aqui:

contador++,3;

por

contador+=0.001;

Há outros problemas com o seu código. Você conseguiu progredir no seu projeto?

Olá, desculpe a demora! Consegui progredir sim, obrigada pela ajuda :slight_smile: atualmente fiz diversas mudanças no código, vou anexar ele nessa mensagem, por mais que no momento eu nao esteja com nenhuma dúvida e o código funcionce, seria super legal receber algumas dicas do que melhorar

 const int sensor = 13; // Pino onde o sensor está conectado
const int bomba = 2; // Pino onde a bomba está conectada 
float valorHidrometro = 2.705; // Valor inicial do hidrômetro
float volume = 0; // Variável para armazenar o cálculo do volume
float vazaoinstantanea = 0; // Variável para armazenar o cálculo da vazão
float duracaoMinuto = 0; 
unsigned long tempoInicio = 0; // Variável para armazenar o início da contagem de tempo
unsigned long tempoFim = 0; // Variável para armazenar o fim da contagem de tempo
unsigned long duracao = 0; // Duração do pulso


extern volatile unsigned long timer0_millis;

void setup() {
  pinMode(sensor, INPUT); // Configura o pino do sensor como entrada
  pinMode (bomba, OUTPUT); // Configura o pino bomba como saída 
  Serial.begin(9600); // Inicializa a comunicação serial para monitorar o valor
}

void loop() {
  unsigned long tempoAtual = millis(); // Pega o tempo atual em milissegundos
  
  // Detecta o início do pulso
  if (digitalRead(sensor) == HIGH && tempoInicio == 0) { 
    tempoInicio = millis(); // Marca o tempo de início do pulso
    ultimoPulso = tempoAtual; // Atualiza o último pulso detectado
  }

  // Detecta o final do pulso
  if (digitalRead(sensor) == LOW && tempoInicio > 0) { 
    duracao = tempoAtual - tempoInicio; // Calcula a duração do pulso em milissegundos
    noInterrupts();
    timer0_millis = 0; // Reset do millis()
    interrupts();

    valorHidrometro += 0.001; // Incrementa o valor do hidrômetro a cada pulso
    volume = valorHidrometro * 1000; // Calcula o volume

    duracaoMinuto = duracao / 6000.0; // Converte a duração para segundos e calcula a vazão
    if (duracaoMinuto > 0) { 
      vazaoinstantanea = volume / duracaoMinuto; // Calcula a vazão
    }
    

    // Exibe os valores no monitor serial
    Serial.print("Valor do Hidrometro: ");
    Serial.println(valorHidrometro, 3); // 3 casas decimais
    Serial.print("Volume: ");
    Serial.println(volume, 1); // 1 casa decimal
    Serial.print("Duracao (s): ");
    Serial.println(duracaoMinuto, 5); // 3 casas decimaiss
    Serial.print("Vazao: ");
    Serial.println(vazaoinstantanea, 3); // 3 casas decimais

    tempoInicio = 0;
    duracao = 0;
    duracaoMinuto = 0;
    delay(1000); // Atraso de 1 segundo
  }


  // Verifica se passou mais de 5 segundos desde o último pulso
  if (tempoAtual - ultimoPulso > 5000) {
    // Reset dos valores para 0
    volume = 0;
    duracaoMinuto = 0;
    vazaoinstantanea = 0;
    
    // Exibe que os valores foram zerados
    Serial.println("Nenhum pulso detectado nos ultimos 5 segundos:");
    Serial.print("Valor do Hidrometro: "); // Exibe os valores no monitor serial
    Serial.println(valorHidrometro, 3); // 3 casas decimais para o hidrômetro
    Serial.print("Volume: ");
    Serial.println(volume, 1); // 3 casas decimais para o volume
    Serial.print("Duracao (m): ");
    Serial.println(duracaoMinuto, 3); // Duração do pulso em segundos
    Serial.print("Vazao: ");
    Serial.println(vazaoinstantanea, 3); // 3 casas decimais para a vazão

  }
  
}

Qualquer dúvida é só me chamar

Olá!

Pequena observação:

0,001L = 0,000001 m^3 e não 0,001 m^3

Olá, cassikomaiwick. Como está o desenvolvimento deste teu projeto com o hidrômetro remoto? Pergunto porque tenho um amigo que está interessado nesta solução. É possível vc enviar seu contato caso tenha interesse em fornecer tua solução para comercialização?

Boa noite.
Muito bom esse projeto. Um tempo atrás havia procurado algo assim para iniciar um projeto similar e não achei muita coisa. Também estou desenvolvendo um sistema similar a esse. Mas no caso desse sensor que você utiliza, vamos usar um hidrômetro real que já foi comprado. No entanto, para simular o pulso, usei um push de click e estou usando a função de interrupção do microcontrolador para dar mais confiabilidade onde o pulso só é contado após a simulação do sensor do hidrômetro passar, que no caso seria ao soltar o botão.

Notei que está usando muito delay, isso acaba travando todo o código. No que pesquisei, não estou muito certo disso, mas usando interrupção e millis, o código continua fluindo enquanto se processa a leitura do pulso em vez de parar todo o processamento do microcontrolado.

Seria legal podermos trocar mais ideias sobre esse assunto.