//=========================================================
// PROJETO: COMEDOURO AUTOMÁTICO PARA GATOS
// VERSÃO: 1.9 - TESTE DO SISTEMA DE ALIMENTAÇÃO
//
// Funções:
// - Monitorar nível de ração
// - Diagnosticar incoerência dos sensores
// - Acionar relé do motor
//
// TESTE PROVISÓRIO:
// - A cada 5 segundos ocorre uma "alimentação"
// - O motor fica ligado durante 3 segundos
//
// ATENÇÃO:
// Estes tempos são apenas para teste.
//=========================================================
//---------------------------------------------------------
// 1 - DECLARAÇÃO DOS PINOS
//---------------------------------------------------------
// LEDs de nível
const int ledVerde = 18;
const int ledAmarelo = 19;
const int ledVermelho = 23;
// LED de falha
const int ledFalha = 32;
// Sensores
const int sensorS1 = 25;
const int sensorS2 = 26;
const int sensorS3 = 27;
// Relé responsável pelo motor
const int releMotor = 33;
//---------------------------------------------------------
// 2 - VARIÁVEIS DO SISTEMA DE ALIMENTAÇÃO
//---------------------------------------------------------
// Guarda o momento da última alimentação
unsigned long ultimaAlimentacao = 0;
// Intervalo entre alimentações
// 5000 ms = 5 segundos
const unsigned long intervaloAlimentacao = 5000;
// Tempo que o motor permanece ligado
// 3000 ms = 3 segundos
const unsigned long tempoMotorLigado = 3000;
//---------------------------------------------------------
// 3 - SETUP
//---------------------------------------------------------
void setup()
{
//-------------------------------------------------------
// MONITOR SERIAL
//-------------------------------------------------------
Serial.begin(115200);
//-------------------------------------------------------
// CONFIGURAÇÃO DOS LEDs
//-------------------------------------------------------
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVermelho, OUTPUT);
pinMode(ledFalha, OUTPUT);
//-------------------------------------------------------
// CONFIGURAÇÃO DOS SENSORES
//-------------------------------------------------------
pinMode(sensorS1, INPUT_PULLUP);
pinMode(sensorS2, INPUT_PULLUP);
pinMode(sensorS3, INPUT_PULLUP);
//-------------------------------------------------------
// CONFIGURAÇÃO DO RELÉ
//-------------------------------------------------------
pinMode(releMotor, OUTPUT);
// Inicia com motor desligado
digitalWrite(releMotor, LOW);
Serial.println("Sistema iniciado!");
}
//---------------------------------------------------------
// 4 - LOOP
//---------------------------------------------------------
void loop()
{
//-------------------------------------------------------
// LEITURA DOS SENSORES
//-------------------------------------------------------
int estadoSensorS1 = digitalRead(sensorS1);
int estadoSensorS2 = digitalRead(sensorS2);
int estadoSensorS3 = digitalRead(sensorS3);
//-------------------------------------------------------
// DIAGNÓSTICO DOS SENSORES
//-------------------------------------------------------
bool falhaSensor = false;
// S1 detecta ração, mas algum sensor inferior não detecta
if (estadoSensorS1 == LOW &&
(estadoSensorS2 == HIGH || estadoSensorS3 == HIGH))
{
falhaSensor = true;
}
// S2 detecta ração, mas S3 não detecta
else if (estadoSensorS2 == LOW &&
estadoSensorS3 == HIGH)
{
falhaSensor = true;
}
//-------------------------------------------------------
// CONTROLE DOS LEDs DE NÍVEL
//-------------------------------------------------------
// S1 acionado = POTE CHEIO
if (estadoSensorS1 == LOW)
{
digitalWrite(ledVerde, HIGH);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
}
// S2 acionado = POTE CHEIO
else if (estadoSensorS2 == LOW)
{
digitalWrite(ledVerde, HIGH);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
}
// Somente S3 acionado = POTE MÉDIO
else if (estadoSensorS3 == LOW)
{
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, HIGH);
digitalWrite(ledVermelho, LOW);
}
// Nenhum sensor acionado = POTE VAZIO
else
{
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, HIGH);
}
//-------------------------------------------------------
// LED AZUL DE FALHA
//-------------------------------------------------------
if (falhaSensor == true)
{
digitalWrite(ledFalha, HIGH);
}
else
{
digitalWrite(ledFalha, LOW);
}
//-------------------------------------------------------
// SISTEMA DE ALIMENTAÇÃO - TESTE
//-------------------------------------------------------
// millis() informa quantos milissegundos se passaram
// desde que o ESP32 iniciou.
unsigned long tempoAtual = millis();
// Verifica se passaram 5 segundos desde
// a última alimentação.
if (tempoAtual - ultimaAlimentacao >= intervaloAlimentacao)
{
//-----------------------------------------------------
// INICIA ALIMENTAÇÃO
//-----------------------------------------------------
Serial.println("==============================");
Serial.println("HORA DE ALIMENTAR!");
Serial.println("MOTOR LIGADO");
digitalWrite(releMotor, HIGH);
//-----------------------------------------------------
// MOTOR FUNCIONA DURANTE 3 SEGUNDOS
//-----------------------------------------------------
delay(tempoMotorLigado);
//-----------------------------------------------------
// FINALIZA ALIMENTAÇÃO
//-----------------------------------------------------
digitalWrite(releMotor, LOW);
Serial.println("MOTOR DESLIGADO");
Serial.println("==============================");
//-----------------------------------------------------
// GUARDA O MOMENTO DESTA ALIMENTAÇÃO
//-----------------------------------------------------
ultimaAlimentacao = millis();
}
}