#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Keypad.h>
#define bomba 26
#define bomba2 28
#define misturador 19
#define botao 18
#define emergenciabot 2
#define TRIG_PIN2 13
#define ECHO_PIN2 12
#define ledverde2 9
#define ledama2 10
#define ledverm2 11
#define TRIG_PIN1 15
#define ECHO_PIN1 14
#define ledverde1 3
#define ledama1 4
#define ledverm1 5
#define TRIG_PIN3 17
#define ECHO_PIN3 16
#define ledverde3 6
#define ledama3 7
#define ledverm3 8
LiquidCrystal_I2C lcd(0X27, 20, 4);
OneWire oneWire(24);
DallasTemperature sensor(&oneWire);
#define I2C_ADDR4 0x26
#define LCD_COLUMNS4 16
#define LCD_LINES4 2
float nivel1;
float nivel2;
float nivel3;
float nivel3_ant;
float nivel2_ant;
float nivel1_ant;
char memo=0;
int teste;
String txt_nivelDesejado = " ";
unsigned int nivelDesejado = 0;
uint8_t cont=0;
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t rowPins[ROWS] = { 52, 50, 48, 46 };
uint8_t colPins[COLS] = { 44, 42, 40, 38 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd4(I2C_ADDR4, LCD_COLUMNS4, LCD_LINES4);
void Lerdistancia1CM(void)
{
digitalWrite(TRIG_PIN1, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, HIGH);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, LOW);
int duration = pulseIn(ECHO_PIN1, HIGH);
nivel1 =23- duration * 0.034 / 2;
nivel1 = (nivel1+nivel1_ant)/2;
delay(300);
if(nivel1 <= 4){
digitalWrite(ledverde1, HIGH);
digitalWrite(ledama1, LOW);
digitalWrite(ledverm1, LOW);
} else if(nivel1 <= 9){
digitalWrite(ledverde1, LOW);
digitalWrite(ledama1, HIGH);
digitalWrite(ledverm1, LOW);
} else {
digitalWrite(ledverde1, LOW);
digitalWrite(ledama1, LOW);
digitalWrite(ledverm1, HIGH);
}
}
void Lerdistancia2CM(void)
{
digitalWrite(TRIG_PIN2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, HIGH);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, LOW);
int duration = pulseIn(ECHO_PIN2, HIGH);
nivel2 = 23- duration * 0.034 / 2;
nivel2 = (nivel2+nivel2_ant)/2;
delay(300);
if(nivel2 <= 4){
digitalWrite(ledverde2, HIGH);
digitalWrite(ledama2, LOW);
digitalWrite(ledverm2, LOW);
} else if(nivel2 <= 9){
digitalWrite(ledverde2, LOW);
digitalWrite(ledama2, HIGH);
digitalWrite(ledverm2, LOW);
} else {
digitalWrite(ledverde2, LOW);
digitalWrite(ledama2, LOW);
digitalWrite(ledverm2, HIGH);
}
}
void Lerdistancia3CM(void)
{
digitalWrite(TRIG_PIN3, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN3, HIGH);
delayMicroseconds(2);
digitalWrite(TRIG_PIN3, LOW);
int duration = pulseIn(ECHO_PIN3, HIGH);
nivel3_ant = nivel3;
nivel3 = 23-duration * 0.034 / 2;//ERA 22 E DAVA NEGATIVO
nivel3 = (nivel3+nivel3_ant)/2; //tira a media com o nível aterior para diminuir a oscilação
delay(300);
if(nivel3 <= 4){
digitalWrite(ledverde3, HIGH);
digitalWrite(ledama3, LOW);
digitalWrite(ledverm3, LOW);
} else if(nivel3 <= 9){
digitalWrite(ledverde3, LOW);
digitalWrite(ledama3, HIGH);
digitalWrite(ledverm3, LOW);
} else {
digitalWrite(ledverde3, LOW);
digitalWrite(ledama3, LOW);
digitalWrite(ledverm3, HIGH);
}
}
void Teclado(void)
{
char key = keypad.getKey();
if (key != NO_KEY)
{
Serial.print(key);
if(key == '#')
{
cont = 0;
lcd4.setCursor(0, 1);
while(cont<2) //ERAM 3
{
key = keypad.getKey();
if (key != NO_KEY)
{
txt_nivelDesejado[cont] = key;
cont++;
lcd4.print(key);
}
}
}
}
Serial.println();
nivelDesejado = txt_nivelDesejado.toInt();
Serial.println(nivelDesejado);
}
void Misturador(void)
{
if(digitalRead(botao) == 0 )
{
digitalWrite (misturador, LOW);//LIGA
delay(10000);
digitalWrite ( misturador, HIGH);//DESLIGA
}
}
void Bomba(void)
{
if((nivel3)<(nivelDesejado-0.5))
{
if (nivel2>1)
{
digitalWrite (bomba2, LOW) ;//liga bomba
}
if (nivel1>1)
{
digitalWrite (bomba, LOW) ;//liga bomba
}
}
if((nivel3)>(nivelDesejado)) {digitalWrite (bomba, HIGH); digitalWrite (bomba2, HIGH);}// desliga bombas
}
void setup()
{
Serial.begin(115200);
pinMode(TRIG_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
pinMode(ledverde2, OUTPUT);
pinMode(ledama2, OUTPUT);
pinMode(ledverm2, OUTPUT);
pinMode(TRIG_PIN1, OUTPUT);
pinMode(ECHO_PIN1, INPUT);
pinMode(ledverde1, OUTPUT);
pinMode(ledama1, OUTPUT);
pinMode(ledverm1, OUTPUT);
pinMode(TRIG_PIN3, OUTPUT);
pinMode(ECHO_PIN3, INPUT);
pinMode(ledverde3, OUTPUT);
pinMode(ledama3, OUTPUT);
pinMode(ledverm3, OUTPUT);
pinMode(botao, INPUT_PULLUP);
pinMode(misturador, OUTPUT);
digitalWrite(misturador, 1);
pinMode(bomba, OUTPUT);
digitalWrite(bomba, 1);
pinMode(bomba2, OUTPUT);
digitalWrite(bomba2, 1);
lcd4.init();
lcd4.backlight();
lcd4.begin(16, 2);
lcd4.print("Defina um nivel:");
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("TANQUE 1:");
lcd.setCursor(0, 1);
lcd.print("TANQUE 2:");
lcd.setCursor(0, 2);
lcd.print("TANQUE 3:");
lcd.setCursor(0, 3);
lcd.print(F("Temp:"));
pinMode(emergenciabot, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(emergenciabot), Emergencia, HIGH);
}
void loop()
{
sensor.requestTemperatures();
Lerdistancia1CM();
Lerdistancia2CM();
Lerdistancia3CM();
Teclado();
Misturador();
Bomba();
lcd.setCursor(11, 0);
lcd.print(nivel1);
lcd.setCursor(11, 1);
lcd.print(nivel2);
lcd.setCursor(11, 2);
lcd.print(nivel3);
lcd.setCursor(11, 3);
lcd.print(sensor.getTempCByIndex(0));
if(memo==1)
{
lcd4.clear();
lcd4.setCursor(0,0);
lcd4.print("EMERGENCIA!");
digitalWrite ( misturador, HIGH);
digitalWrite (bomba, HIGH);
digitalWrite (bomba2, HIGH);
while(digitalRead(emergenciabot)==1);
lcd4.clear();
memo=0;
lcd4.begin(16, 2);
lcd4.print("Defina um nivel:");
}
}
void Emergencia()
{
memo=1;
nivelDesejado = 0;
}