Olá pessoal, estou com um problema que talvez para muitos de vocês seja fácil de resolver, mas eu estou quebrando cabeça para isso, montei um circuito com arduino que monitora o nível de bateria de um nobreak feito para testes, utilizo 1 entrada analógica com divisor de tensão e 5 saídas digitais, nestas 5 saídas 3 são para led RGB que alteram as cores conforme a carga, 4ª saída vai para um buzzer que bipa quando a carga está baixa e a 5ª para um relé que liga e desliga o nobreak conforme o estado da bateria, de acordo com a programação que fiz tudo funciona, mas gostaria de melhorar meu programa e é ai que não estou conseguindo, o buzzer deveria cortar junto com o relé de saída (via programa) e se fosse possível alterar o tempo de aviso sonoro 60s antes de desligar o relé, este é o programa, desde já agradeço.

#define POT A0 //Define POT como A0//
int L11v = 2; //led vermelho//
int L12v = 3; //azul//
int L13v = 4; //verde//
int alarme = 6; //buzzer//
int rele = 5; //rele//
float tensao;

void setup()
{
pinMode(L11v, OUTPUT);
pinMode(L12v, OUTPUT);
pinMode(L13v, OUTPUT);
pinMode(alarme, OUTPUT);
pinMode(rele, OUTPUT);

}

void loop()
{
//leitura analógica A0//
tensao = analogRead(POT);
tensao = (tensao / 1023) * 5;



//led vermelho acende abaixo de 11v//
if(tensao >= 0 && tensao <= 2.7)
digitalWrite(L13v, HIGH);
else digitalWrite(L13v, LOW);

//led azul acende entre 11 a 12,5v//
if(tensao > 2.7 && tensao < 2.9)
digitalWrite(L12v, HIGH);
else digitalWrite(L12v, LOW);

//led verde acende acima de 12,5v//
if(tensao >= 2.9 && tensao <= 5)
digitalWrite(L11v, HIGH);
else digitalWrite(L11v, LOW);


//relé desliga abaixo de 11v//
if(tensao >= 2.8 && tensao < 5.0)
digitalWrite(rele, HIGH);
if(tensao >= 0 && tensao < 2.5)
digitalWrite(rele, LOW);


//buzzer indica bateria abaixo de 11v//
if(tensao >= 0 && tensao <= 2.6)
digitalWrite(alarme, HIGH);
delay(50);
digitalWrite(alarme, LOW);
delay(5000);
}

Exibições: 170

Responder esta

Respostas a este tópico

Observação: pelo seu programa, o buzzer é do tipo ATIVO que ficará apitando quando o pino do Arduino estiver alto.

Parece tudo OK, bastaria melhorar o  "loop()":

O loop() poderia funcionar desta forma em "Portugol":

// variável que diz se o Nobreak atingiu o nível mínimo de tensão 

bool NivelMínimo = falso;

loop() {

  Lê_a_tensão_de_entrada;

  Se (NívelMínimo == verdadeiro) {

    Se (tensão > 10,9 volts) NivelMínimo = falso;

    Se_Não return;

  }

 

  Se (tensão < 11 volts) acende LED_VERMELHO;

  Se_Não Se (tensão < 12,5 volts) acende LED_AZUL;

  Se_Não acende LED_VERDE;

  Se (tensão < 10,9 volts) {

    ativa_Buzzer;

    delay(60 segudos);

    desarma_relê;

    desativa_Buzzer;

    NívelMínimo = verdadeiro;  

  }

}

O único problema, no modelo original, é que o loop() vai ficar sendo executado constantemente, mesmo após a tensão da bateria cair para um nível de desarmar o relê, fazendo ficar apitando 60 segundos continuamente.

Para isso usamos a variável NívelMínimo, que defini em 10,9 volts, por exemplo.

Assim quando o descarregar o Nobreak, o programa vai apitar e cortar o relê e o loop não rodará mais por causa da variável NívelMínimo, ficando apenas o LED_VERMELHO aceso.

Quando carregar o Nobreak, a tensão vai subir e ficar mais alta que os 10,9 volts, fazendo o loop() voltar a testar a tensão para acender os LEDs correspondentes.

Provavelmente você vai descobrir outros problemas, como a questão do erro e flutuação de leitura da porta analógica, o que pode fazer seus LEDs ficarem piscando ou mesmo o apito ligar sem motivo.

Portanto para que realmente funcione bem, seria melhor ativar os vários níveis de tensão pode meio de Aplificadores Operacionais comparadores de tensão ou mesmo no programa usar média móvel da leitura da porta analógica a fim de filtrar variações indesejadas de leitura.

Outra técnica de programação é o uso de PID para uma transição suave de estados analógicos.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço