Caros amigos, desculpem minhas dúvidas de iniciante.. mas estou fazendo um projeto de automação de nível de H2O para aquários..

Entre outras funcionalidades haverá um botão para lavar o aquário. Cada ciclo de lavagem consiste em esvaziar o tanque até o "SetPointLavagemMin" ( através do acionamento do "Esgoto" ), aí encher o tanque de H2O da torneira ( através do acionamento do "HardH2O") até o "SetPointLavagemMax", então esvaziar novamente e encher com agua purificada ( através do acionamento do "PureH2O" ) até o SetPoint2

Não consigo fazer isso.. acho que porque não sei usar um contador com expressões if dentro.

Tentei assim:

/*

projeto de automação de bomba de agua - 

Features realizadas:

- sensor ( potenciometro ) que simula o sensor analógico de volume de H2O
- leitura do volume em lcd
- minimo e máximo para o automatico
- sensor ( LDR ) de luz ambiente funcionando com um LED de saída
- botão preenche até o maximo

Experimento

- leitura do total de h20
testando uma maneira de guardar o volume preenchido em uma variável e imprimir no lcd

- Ciclo de lavagemb
*/


#include <LiquidCrystal.h> // Inclui a biblioteca para utilizar o LCD.

#define sensor 0 // Define o pino A0 como “sensor”
#define LDR 1 // Define o pino A1 como “LDR”

int ValorSensor; // Variável para ler o sinal do pino do Arduino
int ValorLDR; // Variável para ler o sinal do pino do Arduino do LDR
int EstadoBotaoPreenche = 0; // Variável para guardar o estado do botão
int EstadoBotaoLavagem = 0; // Variável para guardar o estado do botão *NOVO
int EstadoPreenchimento; // Variável para guardar o estado o buzzer *NOVO

int PureH2O = 10; // Pino no qual o H2O Purificada ( led ) está conectado, no caso 10
int backlight = 6; // Pino no qual o backlight ( led ) está conectado, no caso 6
int BotaoPreenche = 16; // Pino no qual o BotaoPreenche está conectado, no caso A2
int BotaoLavagem = 17; // Pino no qual o BotaoLavagem está conectado, no caso A3 *NOVO
int Led13 = 13; // Pino no qual o LED está conectado, no caso 13 *NOVO
int HardH2O = 8; // Saída de H2O da torneira ( LED Amarelo ) e, pino 9 *NOVO
int Esgoto = 7; // Saída de Esgoto ( LED Vermelho ) e, pino 7 *NOVO

int SetPoint = 344; // Set point de nível, acima desse valor dispara o alarme
int SetPoint2 = 379; // Set point de nível, acima desse valor dispara o alarme
int SetPointLDR = 100; // Set point do LDR, abaixo desse valor apaga o led ( backlight )
int SetPointLavagemMin = 80; // Set point de nível minimo de lavagem,
int SetPointLavagemMax = 450; // Set point de nível minimo de lavagem,


float Volume; // Variável que recebe o valor convertido para o volume.
/* float VolumePreenchido; // Variável para guardar o volume preenchido acumulado *NOVO */

LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
/* Esta função acima declara quais os pinos do Arduino serão utilizados para o controle do LCD */

void setup()
{
lcd.begin(16, 2); // Diz para o Arduino que o display é 16x2.
lcd.print("Vol reservatorio:"); // Manda o texto para a tela do display


pinMode(PureH2O, OUTPUT); // Configura o pino do buzzer como saída
pinMode(backlight, OUTPUT); // configura o pino do backlight como saída
pinMode(BotaoPreenche, INPUT); // inicializa o pino do botão como entrada *NOVO
pinMode(BotaoLavagem, INPUT); // inicializa o pino do botão como entrada *NOVO
pinMode(Led13, OUTPUT); // inicializa o pino do LED como saída
pinMode(HardH2O, OUTPUT); // inicializa o pino do LED amarelo como saída *NOVO
pinMode(Esgoto, OUTPUT); // inicializa o pino do LED vermelho como saída *NOVO
Serial.begin(9600); // Cria a comunicação serial


}

void loop()
{
ValorSensor = analogRead (sensor); /* Manda o Arduino ler o pino e armazena
o valor em “ValorSensor”. */
Volume =(65*ValorSensor)/488; /* Converte o valor de tensão em
Volume e armazena na variável “Volume” */
lcd.setCursor(0, 1); // Move o cursor do display para a segunda linha.
lcd.print(Volume); // Exibe o valor de Volume no display.
lcd.print(" litros"); // Escreve “L” para dizer que a escala é Litros.

delay(200); /* Aguarda 0,2 segundo para efetuar uma nova leitura de
temperatura. */

if (ValorSensor <= SetPoint ) //se o ValorSensor for maior que o SetPoint
{
digitalWrite(PureH2O, HIGH); // ligao o buzzer
}
if (ValorSensor >= SetPoint2) //se o ValorSensor for maior que o SetPoint2
{
digitalWrite (PureH2O, LOW); // desliga o buzzer
}


EstadoBotaoPreenche = digitalRead(BotaoPreenche); // Lê a entrada do BotaoPreenche

if(EstadoBotaoPreenche == HIGH) { // Se o BotaoPreenche for apertado
digitalWrite(PureH2O, HIGH); // Liga o PureH2O
}
if (ValorSensor >= SetPoint2) //se o ValorSensor for maior que o SetPoint2
{
digitalWrite (PureH2O, LOW); // desliga o PureH2O
}

EstadoBotaoLavagem = digitalRead (BotaoLavagem); // Lê o estado do BotaoLavagem e armazena

if (EstadoBotaoLavagem == HIGH) // Se for HIGH


{
digitalWrite(Esgoto, HIGH); // ele liga o esgoto

}
if (ValorSensor <= SetPointLavagemMin) // Até o volume de 10 litros
{
delay(100);
digitalWrite(HardH2O, HIGH); // liga o H2O da torneira
delay(2000);
digitalWrite(Esgoto, LOW); // desliga o esgoto
}

if (ValorSensor >= SetPointLavagemMax) // quando o sensor atingir o SetPointLavagemMax
{
digitalWrite(HardH2O, LOW); // desliga o H2O da orneira
delay(100);
digitalWrite(Esgoto, HIGH); // e liga o esgoto
}


if (ValorSensor <= SetPointLavagemMin) // Até o volume de 10 litros
{
digitalWrite(PureH2O, HIGH); // desliga o H2O da orneira
delay(100);
digitalWrite(Esgoto, LOW); // e liga o esgoto
}

if (ValorSensor >= SetPoint2);
{
digitalWrite(PureH2O, LOW); // desliga o H2O da orneira
delay(100);
digitalWrite(Esgoto, LOW); // e liga o esgoto
}
}

A parte que não funciona está em negrito..ele fica em um loop eterno.. eu queria que fizesse esse ciclo 3 vezes..

Como faço?

:(

Muito obrigado

Exibições: 411

Responder esta

Respostas a este tópico

Obrigado.. eu tentei colocar o while, mas não sei se fiz certo.. 

Então, tentei o while.. assim:

/* O bloco a baixo tem como função automatizar a lavagem do tanque.
Ele deve executar x ciclos de lavagem.

Existem 3 SetPoints; Um que marca o volume mínimo detectável pelo sensor,
um que marca o volume máximo detectado pelo sensor e outro o volume de operação, que fica entre o máximo e mínimo.

Cada ciclo consiste em:
Esvaziar até o mínimo, ligando o esgoto; ligar o HardH2O por um tempo e desligar o esgoto;
Encher até o máximo e parar lá por um tempo;
Esvaziar até o mínimo e uma vez lá, esperar um tempo com o esgoto aberto e desligar

*/


EstadoBotaoLavagem = digitalRead (BotaoLavagem);    // Lê o estado do BotaoLavagem e armazena

if (EstadoBotaoLavagem == HIGH)    // Se for HIGH

int x=0;
while(x<3)

{
digitalWrite(Esgoto, HIGH);    // ele liga o esgoto

if (ValorSensor <= SetPointLavagemMin)       // Até o volume de 10 litros ( mínimo que o sensor detecta )

{
delay(1000);       // espera alguns segundos para esvaziar sem a leitura do sensor
digitalWrite(HardH2O, HIGH);       // liga o H2O da torneira para lavar
delay(2000);        // espera uns segundos para que a agua nova force a saída da agua suja
digitalWrite(Esgoto, LOW);      // desliga o esgoto
}

if (ValorSensor >= SetPointLavagemMax)     // quando o sensor atingir o SetPointLavagemMax
{
digitalWrite(HardH2O, LOW);     // desliga o H2O da torneira
delay(100);       // espera um tempo para dissolver as impurezas
digitalWrite(Esgoto, HIGH);      // e liga o esgoto
}


if (ValorSensor <= SetPointLavagemMin)     // Até o volume de 10 litros
{
digitalWrite(PureH2O, HIGH);     // liga a H2O purificada
delay(100);     // espera um tempo
digitalWrite(Esgoto, LOW);     // desliga o esgoto
digitalWrite(PureH2O, LOW);      // e a H2O purificada
}

x++;

}

Não está funcionando.. aparentemente não muda de estado com a variação do ValorSensor..

Eu posso mesmo colocar essas condições "if" dentro das instruções do "while" ??

Muito obrigado

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço