Boa tarde pessoal,
Fiz o teste desse sistema no proteus e parece ter funcionado, mas ao montar, o relé permanece ligando a bomba, será problema no código ou nessa montagem de circuito?
#include <LiquidCrystal.h>
#include <SPI.h>
int BOMBA = 3;
int BUZZER = 4;
int LedVerde = 5;
int LedAmarelo = 6;
int LedVermelho = 7;
int SENSOR_CAIXA1 = A0; int SENSOR_CAIXA2 = A1;
int SENSOR_RESERVATORIO1 = A2; int SENSOR_RESERVATORIO2 = A3;
double cont = 0;
LiquidCrystal lcd(8,9,10,11,12,13);
void setup() {
pinMode(LedVermelho,OUTPUT);
pinMode(LedAmarelo,OUTPUT);
pinMode(SENSOR_CAIXA1,INPUT);
pinMode(SENSOR_CAIXA2,INPUT);
pinMode(SENSOR_RESERVATORIO1,INPUT);
pinMode(SENSOR_RESERVATORIO2,INPUT);
pinMode(BOMBA,OUTPUT);
pinMode(LedVerde,OUTPUT);
pinMode(BUZZER,OUTPUT);
lcd.begin(16, 2);
delay(100);
}
void EscreverLCD() { // Escrever na primeira linha do LCD.
lcd.clear();
lcd.setCursor(0,0);
}
void ModuloALOFF() { // Módulo de alerta desligado.
digitalWrite(LedVerde,LOW);
digitalWrite(LedAmarelo,LOW);
digitalWrite(LedVermelho,LOW);
digitalWrite(BUZZER,LOW);
}
void ModuloALVERDE(){ // Módulo de alerta com bomba com apenas o LED verde on.
digitalWrite(LedVerde,HIGH);
digitalWrite(LedAmarelo,LOW);
digitalWrite(LedVermelho,LOW);
digitalWrite(BUZZER,LOW);
digitalWrite(BOMBA,LOW);
}
void ModuloALVER(){ // Módulo de alerta com bomba com apenas o LED vermelho on.
digitalWrite(LedVerde,LOW);
digitalWrite(LedAmarelo,LOW);
digitalWrite(LedVermelho,HIGH);
digitalWrite(BUZZER,LOW);
digitalWrite(BOMBA,LOW);
}
void CaixaCheia() { // Caixa cheia.
if (digitalRead(SENSOR_CAIXA2)==HIGH) { // Condição para ativamento do LED VERDE e caixa de texto no display LCD: "Caixa cheia".
ModuloALVERDE();
EscreverLCD();
lcd.print("Caixa cheia");
delay(2000);
}
}
void CaixaVazia(){ // Caixa vazia
if( digitalRead(SENSOR_CAIXA2)==LOW && digitalRead(SENSOR_CAIXA1)==LOW ){
EscreverLCD();
lcd.print("Caixa vazia");
}
}
void TempoReabastecido(){ // Indica o tempo final de reabastecimento da caixa completa.
for(;;) {
delay(1000);
cont = cont +1;
if( digitalRead(SENSOR_CAIXA2)==HIGH && digitalRead(SENSOR_CAIXA1)==HIGH ){ // Condição que indica o tempo da caixa reabastecida completamente.
ModuloALVERDE();
cont = cont/60;
EscreverLCD();
lcd.print("C. Reabastecida");
lcd.setCursor(0,1);
lcd.print("tempo: ");
lcd.print(cont);
lcd.print(" min");
delay(1000);
break;
}
if( digitalRead(SENSOR_RESERVATORIO1)==LOW) { // Condição que para o reabastecimento.
ModuloALVER();
EscreverLCD();
lcd.print("Reserva Vazia");
delay(1000);
break;
}
}
}
void Reabastecer() { // Ativa a bomba para reabastecer
EscreverLCD();
lcd.print("Reabastecendo...");
digitalWrite(LedAmarelo,HIGH);
digitalWrite(BOMBA,HIGH);
digitalWrite(BUZZER,HIGH);
digitalWrite(LedVerde,LOW);
digitalWrite(LedVermelho,LOW);
}
void AbastecerCaixa(){ // Liga a bomba para abastecer a caixa.
cont = 0;
if( digitalRead(SENSOR_RESERVATORIO2)==HIGH){
Reabastecer();
TempoReabastecido();
}
}
void VerificarNivel() { // Verifica o nivel do reservatorio e da caixa informando no display LCD.
CaixaCheia();
CaixaVazia();
if (digitalRead(SENSOR_RESERVATORIO2)==HIGH) { // Condição para caixa de texto no display LCD: "Reservatorio Max".
EscreverLCD();
lcd.print("Reservatorio Max");
}
else if ((digitalRead(SENSOR_RESERVATORIO2)==LOW) && digitalRead(SENSOR_RESERVATORIO1)==HIGH) { // Condição para caixa de texto no display LCD: "Reservatorio Min".
EscreverLCD();
lcd.print("Reservatorio Min");
}
delay(1000);
}
void VerificaSensores() { // Verifica todos os sensores e se é necessário reabastecer.
VerificarNivel();
if( digitalRead(SENSOR_RESERVATORIO1)==LOW){ // Condição que indica que a reserva está vazia.
ModuloALVER();
EscreverLCD();
lcd.print("Reserva Vazia");
delay(2000);
}
else
{
if( digitalRead(SENSOR_CAIXA2)==LOW && digitalRead(SENSOR_CAIXA1)==LOW ){ // Condição que leva a outra função para o abastecimento caso a caixa esteja vazia.
ModuloALOFF();
EscreverLCD();
lcd.print("Caixa vazia");
AbastecerCaixa();
}
else if (digitalRead(SENSOR_CAIXA2)==HIGH && digitalRead(SENSOR_RESERVATORIO2)==HIGH) { // Condição que verifica os sensores máximos da caixa e do reservatório e se estiverem em nível alto, sistema estará estável
ModuloALVERDE();
EscreverLCD();
lcd.print("Sistema Estavel");
}
else if (digitalRead(SENSOR_CAIXA2)==LOW) { // Condição para verificar se a caixa está cheia e se é póssivel reabastecer.
cont = 0;
Reabastecer();
TempoReabastecido();
}
delay(3000);
}
}
void loop() { // Faz o loop do programa verificando sempre pela função verificaSensores.
VerificaSensores();
delay(100);
}