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
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por