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.

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