/*
------------------------------------------------------------
Aluno......: Gabriel Steffens
Curso......: Bacharelado em Sistemas de Informacao - UNIDAVI
Disciplina.: Internet das Coisas (IoT)
Projeto Final - Checkpoint 1, Entrega 2 (Momento 2): atuadores finais
Especie....: Camboata (Matayba elaeagnoides)
Placa......: ESP32 DevKit V1
Simulador..: Wokwi
Cenario (secao 4.2 do Projeto Final, sem alteracoes):
- Luminosidade < 30% ou > 70% (fora da meia-sombra) -> ajusta sombreamento
- Umidade do solo < 40% -> aciona irrigacao
Mesma logica da Entrega 1; os LEDs foram trocados pelos atuadores finais:
GPIO25 - servo motor ........... sombreamento ajustavel
luz < 30% -> 0 graus (sombrite aberto: deixa entrar mais luz)
30% a 70% -> 90 graus (posicao de meia-sombra)
luz > 70% -> 180 graus (sombrite fechado: bloqueia o excesso)
GPIO26 - modulo rele ........... liga a mini bomba d'agua
(no Wokwi a bomba e representada por um LED azul ligado
no contato NO do rele; substituicao prevista no escopo)
Sensores (iguais aos da Entrega 1):
GPIO34 - modulo LDR (saida AO; a tensao cai quando a luz aumenta)
GPIO35 - potenciometro no lugar do sensor de umidade de solo capacitivo
------------------------------------------------------------
*/
#include <ESP32Servo.h>
// ---------------- Pinos ----------------
const int PIN_LDR = 34;
const int PIN_UMIDADE_SOLO = 35;
const int PIN_SERVO = 25;
const int PIN_RELE_BOMBA = 26;
// ---------------- Regras do cenario ----------------
const int LIMIAR_LUZ_MIN = 30;
const int LIMIAR_LUZ_MAX = 70;
const int LIMIAR_SOLO_MIN = 40;
// ---------------- Posicoes do sombreamento (graus) ----------------
const int ANGULO_ABERTO = 0;
const int ANGULO_MEIA_SOMBRA = 90;
const int ANGULO_FECHADO = 180;
const int SERVO_PULSO_MIN_US = 500;
const int SERVO_PULSO_MAX_US = 2400;
// ---------------- Leitura ----------------
const unsigned long INTERVALO_LEITURA_MS = 2000;
const int ADC_MAXIMO = 4095;
const bool LDR_INVERTIDO = true;
Servo servoSombra;
unsigned long ultimaLeitura = 0;
int anguloAtual = -1; // -1 = ainda nao posicionado
bool bombaLigada = false;
int lerPorcentagem(int pino, bool invertido) {
int bruto = analogRead(pino);
int pct = map(bruto, 0, ADC_MAXIMO, 0, 100);
return invertido ? 100 - pct : pct;
}
int anguloParaLuz(int luminosidade) {
if (luminosidade < LIMIAR_LUZ_MIN) return ANGULO_ABERTO;
if (luminosidade > LIMIAR_LUZ_MAX) return ANGULO_FECHADO;
return ANGULO_MEIA_SOMBRA;
}
const char* descreverAngulo(int angulo) {
if (angulo == ANGULO_ABERTO) return "ABERTO (0 graus) - luz insuficiente";
if (angulo == ANGULO_FECHADO) return "FECHADO (180 graus) - luz em excesso";
return "MEIA-SOMBRA (90 graus) - luz dentro da faixa";
}
void setup() {
Serial.begin(115200);
delay(100);
Serial.println("Projeto Final IoT - Camboata - Momento 2 (atuadores finais)");
Serial.println("Autor: Gabriel Steffens");
pinMode(PIN_RELE_BOMBA, OUTPUT);
digitalWrite(PIN_RELE_BOMBA, LOW);
servoSombra.setPeriodHertz(50);
servoSombra.attach(PIN_SERVO, SERVO_PULSO_MIN_US, SERVO_PULSO_MAX_US);
}
void loop() {
unsigned long agora = millis();
if (agora - ultimaLeitura < INTERVALO_LEITURA_MS) {
return; // nao bloqueante
}
ultimaLeitura = agora;
int luminosidade = lerPorcentagem(PIN_LDR, LDR_INVERTIDO);
int umidadeSolo = lerPorcentagem(PIN_UMIDADE_SOLO, false);
Serial.print("Luminosidade: ");
Serial.print(luminosidade);
Serial.print("% | Umidade do solo: ");
Serial.print(umidadeSolo);
Serial.println("%");
// Regra 1: ajusta o sombreamento conforme o lado da faixa de meia-sombra
int novoAngulo = anguloParaLuz(luminosidade);
if (novoAngulo != anguloAtual) {
anguloAtual = novoAngulo;
servoSombra.write(anguloAtual);
Serial.print(">>> Sombreamento: ");
Serial.println(descreverAngulo(anguloAtual));
}
// Regra 2: liga a bomba pelo rele quando o solo esta abaixo de 40%
bool deveIrrigar = (umidadeSolo < LIMIAR_SOLO_MIN);
if (deveIrrigar != bombaLigada) {
bombaLigada = deveIrrigar;
digitalWrite(PIN_RELE_BOMBA, bombaLigada ? HIGH : LOW);
Serial.println(bombaLigada ? ">>> Irrigacao ACIONADA (rele ligado, bomba ligada)"
: ">>> Irrigacao desativada (rele desligado, bomba desligada)");
}
}