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
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.
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
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);
}
Olá, desculpe a demora! Consegui progredir sim, obrigada pela ajuda 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
}
}
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.