#include <LiquidCrystal.h>
#include <DHT.h>
//=====================================================
// PINOS
//=====================================================
const int pino_dht = 2;
const int pino_reset = 7;
const int pino_falta_agua = 9;
const int pino_manual = 10;
const int pino_buzzer = 11;
const int pino_bomba = 12;
const int pino_20porcento = 28;
const int pino_80porcento = 34;
const int pino_transbordo = 35;
//=====================================================
// LCD 20x4
// RS, E, D4, D5, D6, D7
//=====================================================
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
//=====================================================
// DHT22
//=====================================================
DHT dht(pino_dht, DHT22);
//=====================================================
// TEMPERATURA MAXIMA
//=====================================================
const float TEMP_MAX = 50.0;
//=====================================================
// ESTADOS
//=====================================================
enum Estados
{
IDLE,
ENCHENDO,
MANUAL,
ERRO_1_SENSORES,
ERRO_2_FALTA_AGUA,
ERRO_3_TRANSBORDO,
ERRO_4_TEMPERATURA
};
Estados estadoAtual = IDLE;
//=====================================================
// SETUP
//=====================================================
void setup()
{
pinMode(pino_reset, INPUT_PULLUP);
pinMode(pino_falta_agua, INPUT_PULLUP);
pinMode(pino_manual, INPUT_PULLUP);
pinMode(pino_20porcento, INPUT_PULLUP);
pinMode(pino_80porcento, INPUT_PULLUP);
pinMode(pino_transbordo, INPUT_PULLUP);
pinMode(pino_bomba, OUTPUT);
pinMode(pino_buzzer, OUTPUT);
digitalWrite(pino_bomba, LOW);
dht.begin();
lcd.begin(20, 4);
// Tela inicial
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" SISTEMA NIVEL ");
lcd.setCursor(0, 1);
lcd.print("RESERVATORIO");
lcd.setCursor(0, 2);
lcd.print("ARDUINO MEGA");
lcd.setCursor(0, 3);
lcd.print("VERSAO 2.0");
delay(3000);
}
//=====================================================
// LOOP
//=====================================================
void loop()
{
//===================================================
// LEITURAS
//===================================================
bool reset = (digitalRead(pino_reset) == LOW);
bool manual = (digitalRead(pino_manual) == LOW);
bool faltaAgua = (digitalRead(pino_falta_agua) == LOW);
bool nivel20 = (digitalRead(pino_20porcento) == LOW);
bool nivel80 = (digitalRead(pino_80porcento) == LOW);
bool transbordo = (digitalRead(pino_transbordo) == LOW);
float temperatura = dht.readTemperature();
//===================================================
// RESET DAS FALHAS
//===================================================
if (reset)
{
if (!faltaAgua &&
!transbordo &&
!(nivel80 && !nivel20) &&
!(transbordo && !nivel80) &&
(isnan(temperatura) || temperatura < TEMP_MAX))
{
estadoAtual = IDLE;
}
}
//===================================================
// ERRO 1 - FALHA DE SENSORES
//===================================================
if ((nivel80 && !nivel20) ||
(transbordo && !nivel80))
{
estadoAtual = ERRO_1_SENSORES;
}
//===================================================
// ERRO 2 - SEM AGUA NA FONTE
//===================================================
else if (faltaAgua)
{
estadoAtual = ERRO_2_FALTA_AGUA;
}
//===================================================
// ERRO 3 - TRANSBORDAMENTO
//===================================================
else if (transbordo)
{
estadoAtual = ERRO_3_TRANSBORDO;
}
//===================================================
// ERRO 4 - TEMPERATURA ALTA
//===================================================
else if (!isnan(temperatura) &&
temperatura >= TEMP_MAX)
{
estadoAtual = ERRO_4_TEMPERATURA;
}
//===================================================
// MODO MANUAL
//===================================================
else if (manual)
{
estadoAtual = MANUAL;
}
//===================================================
// AUTOMATICO COM HISTERESE
//===================================================
else
{
if (estadoAtual != ENCHENDO)
{
if (!nivel20)
{
estadoAtual = ENCHENDO;
}
}
if (estadoAtual == ENCHENDO)
{
if (nivel80)
{
estadoAtual = IDLE;
}
}
}
//===================================================
// EXECUCAO DOS ESTADOS
//===================================================
lcd.clear();
switch (estadoAtual)
{
//=================================================
case IDLE:
digitalWrite(pino_bomba, LOW);
noTone(pino_buzzer);
lcd.setCursor(0,0);
lcd.print("MODO: AUTOMATICO");
lcd.setCursor(0,1);
lcd.print("STATUS: PARADO");
break;
//=================================================
case ENCHENDO:
digitalWrite(pino_bomba, HIGH);
noTone(pino_buzzer);
lcd.setCursor(0,0);
lcd.print("MODO: AUTOMATICO");
lcd.setCursor(0,1);
lcd.print("STATUS: ENCHENDO");
break;
//=================================================
case MANUAL:
digitalWrite(pino_bomba, HIGH);
noTone(pino_buzzer);
lcd.setCursor(0,0);
lcd.print("MODO: MANUAL");
lcd.setCursor(0,1);
lcd.print("BOMBA LIGADA");
break;
//=================================================
case ERRO_1_SENSORES:
digitalWrite(pino_bomba, LOW);
tone(pino_buzzer, 1000);
lcd.setCursor(0,0);
lcd.print("ERRO 1");
lcd.setCursor(0,1);
lcd.print("FALHA SENSORES");
break;
//=================================================
case ERRO_2_FALTA_AGUA:
digitalWrite(pino_bomba, LOW);
tone(pino_buzzer, 1000);
lcd.setCursor(0,0);
lcd.print("ERRO 2");
lcd.setCursor(0,1);
lcd.print("SEM AGUA FONTE");
break;
//=================================================
case ERRO_3_TRANSBORDO:
digitalWrite(pino_bomba, LOW);
tone(pino_buzzer, 1000);
lcd.setCursor(0,0);
lcd.print("ERRO 3");
lcd.setCursor(0,1);
lcd.print("TRANSBORDAMENTO");
break;
//=================================================
case ERRO_4_TEMPERATURA:
digitalWrite(pino_bomba, LOW);
tone(pino_buzzer, 1000);
lcd.setCursor(0,0);
lcd.print("ERRO 4");
lcd.setCursor(0,1);
lcd.print("TEMP. ELEVADA");
break;
}
//===================================================
// LINHA 3
//===================================================
lcd.setCursor(0,2);
if (isnan(temperatura))
{
lcd.print("TEMP: ERRO SENSOR");
}
else
{
lcd.print("TEMP:");
lcd.print(temperatura,1);
lcd.print("C");
}
//===================================================
// LINHA 4 - DIAGNOSTICO
//===================================================
lcd.setCursor(0,3);
lcd.print("20:");
lcd.print(nivel20);
lcd.print(" 80:");
lcd.print(nivel80);
lcd.print(" T:");
lcd.print(transbordo);
delay(200);
}sensores de nivel
s. falta daqua
Sensor de temperatura
modo manual
motorbomba
reset do sistema