#include <LiquidCrystal.h>
#include <DHT.h>
#include <Servo.h>
#define DHTTYPE DHT22 // DHT 22
const int DHTPin = 53;
DHT dht(DHTPin, DHTTYPE);
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
Servo servo1;
// LDR
const int ldrPin = A0;
const float GAMMA = 0.7;
const float RL10 = 50;
// Leiruras
float leituraLDR = 0;
float leituraTemperatura = 0; // Obtém os valores da temperatura
float leituraUmidade = 0; // Obtém os valores da umidade
// Entradas
const int ajusteMais = 23;
const int ajusteMenos = 25;
const int pinoMenu = 27;
const int manualAutomatico = 51;
const int manualVentilacao = 49;
const int manualIrrigacao = 47;
const int manualIluminacao = 45;
//Saídas
const int outVentilacao = 41;
const int outIrrigacao = 39;
const int outIluminacao = 43;
int ajusteMaisAnterior = LOW;
int ajusteMenosAnterior = LOW;
int pinoMenuAnterior = LOW;
int setPointTemperatura = 24;
int setPointUmidade = 80;
int setPointIluminacao = 2500;
int setPointTempoIluminacao = 1000;
int tela = 1;
int tempo = 0;
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Tela: ");
Serial.begin(115200);
dht.begin();
servo1.attach(outIrrigacao);
pinMode(ajusteMais, INPUT);
pinMode(ajusteMenos, INPUT);
pinMode(pinoMenu, INPUT);
pinMode(manualAutomatico, INPUT);
pinMode(manualVentilacao, INPUT);
pinMode(manualIrrigacao, INPUT);
pinMode(manualIluminacao, INPUT);
pinMode(outVentilacao, OUTPUT);
//pinMode(outIrrigacao, OUTPUT);
pinMode(outIluminacao, OUTPUT);
}
void menu()
{
if (digitalRead(pinoMenu) == HIGH && pinoMenuAnterior == LOW) {
tela++;
if (tela > 4)
{
tela = 1;
}
}
lcd.setCursor(6,0);
lcd.print(tela);
pinoMenuAnterior = digitalRead(pinoMenu);
}
int ajusteSetPoint(int setPoint)
{
if (digitalRead(ajusteMais) == HIGH && ajusteMaisAnterior == LOW) {
setPoint++;
}
else if (digitalRead(ajusteMenos) == HIGH && ajusteMenosAnterior == LOW) {
setPoint--;
}
ajusteMaisAnterior = digitalRead(ajusteMais);
ajusteMenosAnterior = digitalRead(ajusteMenos);
return setPoint;
}
int ajusteSetPointIlum(int setPoint)
{
if (digitalRead(ajusteMais) == HIGH && ajusteMaisAnterior == LOW) {
setPoint = setPoint + 10;
}
else if (digitalRead(ajusteMenos) == HIGH && ajusteMenosAnterior == LOW) {
setPoint = setPoint - 10;
}
ajusteMaisAnterior = digitalRead(ajusteMais);
ajusteMenosAnterior = digitalRead(ajusteMenos);
return setPoint;
}
void display()
{
if (tela == 1)
{
//Aqui vai a lógica da tela 1
lcd.setCursor(0,1);
lcd.print(" ");
}
if (tela == 2 )
{
setPointTemperatura = ajusteSetPoint(setPointTemperatura);
Serial.println(setPointTemperatura);
lcd.setCursor(0,1);
lcd.print("SPTemp: ");
lcd.print(setPointTemperatura);
lcd.print("C ");
}
if (tela == 3)
{
setPointUmidade = ajusteSetPoint(setPointUmidade);
Serial.println(setPointUmidade);
lcd.setCursor(0,1);
lcd.print("SPUmid: ");
lcd.print(setPointUmidade);
lcd.print("% ");
}
if (tela == 4)
{
setPointIluminacao = ajusteSetPointIlum(setPointIluminacao);
Serial.println(setPointIluminacao);
lcd.setCursor(0,1);
lcd.print("SPIlum: ");
lcd.print(setPointIluminacao);
lcd.print(" LUX");
}
}
void controleManual()
{
digitalWrite(outIluminacao, digitalRead(manualIluminacao));
digitalWrite(outVentilacao, digitalRead(manualVentilacao));
if (digitalRead(manualIrrigacao) == HIGH)
{
servo1.write(90);
}
else
{
servo1.write(0);
}
}
void controleAutomatico()
{
leituraTemperatura = dht.readTemperature();
Serial.println(leituraTemperatura);
if (leituraTemperatura > setPointTemperatura)
{
digitalWrite(outVentilacao, HIGH);
}
else
{
digitalWrite(outVentilacao, LOW);
}
leituraUmidade = dht.readHumidity(); // Obtém os valores da umidade
Serial.println(leituraUmidade);
if (leituraUmidade > setPointUmidade)
{
servo1.write(90);
}
else
{
servo1.write(0);
}
if (digitalRead(outIluminacao) == HIGH)
{
tempo++;
}
// o controle automatico da iluminacao deve manter ligado por x tempo
leituraLDR = funcaoLeituraLDR();
Serial.println(leituraLDR);
if (leituraLDR < setPointIluminacao)
{
digitalWrite(outIluminacao, HIGH);
}
if (tempo >= setPointTempoIluminacao)
{
digitalWrite(outIluminacao, LOW);
tempo = 0;
}
}
float funcaoLeituraLDR()
{
int ldrVal = analogRead(ldrPin); // Read the analog value of the LDR
float voltage = ldrVal / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
return lux;
}
void loop()
{
menu();
display();
if (digitalRead(manualAutomatico) == LOW)
{
controleManual();
}
else
{
controleAutomatico();
}
delay(100);
}