#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
// Definindo os pinos
const int pinoUmidadeSolo = 36; // pino VP
const int LED_Verde = 21;
const int LED_Azul = 22;
const int LED_Amarelo = 23;
const int LED_Vermelho = 19;
const int LED_Irrigacao = 18;
const int pino_boia = 35;
WiFiClientSecure espClient;
PubSubClient MQTT(espClient);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definindo os valores de umidade (mas é menor que?)
const int SOLO_MUITO_SECO = 3800;
const int SOLO_SECO_VALOR = 3000;
const int SOLO_IDEAL_VALOR = 2200;
const int SOLO_MUITO_UMIDO = 1400;
String nome_wifi = "Wokwi-GUEST";
String senha = "";
char* broker = "9d19cc700cc44018b16cc529b323fc9d.s1.eu.hivemq.cloud";
// Função de conexão Wifi
void conectarWifi() {
WiFi.begin(nome_wifi, senha);
while (WiFi.status() != WL_CONNECTED) {
Serial.print("."); // so pra exibir uns pontos enquanto carrega
delay(500);
}
Serial.print("Wifi conectado com sucesso!");
}
// Função de conexão MQTT
void conectarMQTT() {
Serial.println("Conectando ao MQTT.");
if (MQTT.connect("envio26", "ricardodias", "TesteSenai1")) {
Serial.println("Conectado ao MQTT com sucesso.");
} else {
Serial.println("Erro ao conectar!");
}
}
// Função de controle dos LEDs baseado na umidade
void atualizarLEDs(int umidadeSoloBruto) {
digitalWrite(LED_Verde, LOW);
digitalWrite(LED_Azul, LOW);
digitalWrite(LED_Amarelo, LOW);
digitalWrite(LED_Vermelho, LOW);
if (umidadeSoloBruto <= SOLO_MUITO_UMIDO) {
digitalWrite(LED_Verde, HIGH); // Solo muito umido
} else if (umidadeSoloBruto > SOLO_MUITO_UMIDO && umidadeSoloBruto <= SOLO_IDEAL_VALOR) {
digitalWrite(LED_Azul, HIGH); // Solo ideal
} else if (umidadeSoloBruto > SOLO_IDEAL_VALOR && umidadeSoloBruto <= SOLO_SECO_VALOR) {
digitalWrite(LED_Amarelo, HIGH); // Solo seco
} else if (umidadeSoloBruto > SOLO_SECO_VALOR) {
digitalWrite(LED_Vermelho, HIGH); // Solo muito seco
}
}
// De acordo com o valor que ele le a bomba fica ligada por alguns segundo,
// se a boia ler que o nível de agua esta muito baixo ela não aciona a irrigação,
// deve ser conferido antes
void controlarIrrigacao(int umidadeSoloBruto) {
int nivelBoia = digitalRead(pinoBoia);
if (nivelBoia == LOW) {
Serial.println("Nível de Água alto");
MQTT.publish("projeto/12/statusBoia", "ALTO", true);
} else {
Serial.println("Nível de Água baixo");
MQTT.publish("projeto/12/statusBoia", "BAIXO", true);
}
delay(400);
if (umidadeSoloBruto < SOLO_SECO_VALOR && nivelBoia == LOW) {
Serial.println("Solo seco, irrigação 5s");
digitalWrite(pinoRele, HIGH);
digitalWrite(LED_Irrigacao, HIGH);
delay(5000);
digitalWrite(pinoRele, LOW);
digitalWrite(LED_Irrigacao, LOW);
} else if (umidadeSoloBruto > SOLO_MUITO_SECO) {
Serial.println(("Solo muito seco, irrigacao 10s"));
digitalWrite(pinoRele, HIGH);
digitalWrite(LED_Irrigacao, HIGH);
delay(10000);
digitalWrite((pinoRele, LOW));
digitalWrite(LED_Irrigacao, LOW);
}
}
// Função exibir dados LCD
void autualizarLCD(int umidadeSoloPorcentagem, String condicaoSolo) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("umid. Solo: ");
lcd.print(umidadeSoloPorcentagem);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("condição: ");
lcd.print(condicaoSolo);
}
void setup() {
Serial.begin(9600);
conectarWifi();
espClient.setInsecure();
MQTT.setServer(broker, 8883);
pinMode(LED_Verde, OUTPUT);
pinMode(LED_Azul, OUTPUT);
pinMode(LED_Amarelo, OUTPUT);
pinMode(LED_Vermelho, OUTPUT);
lcd.init();
lcd.backlight();
}
void loop() {
if (!MQTT.connected()) {
conectarMQTT();
}
MQTT.loop();
int umidadeSoloBruto = analogRead(pinoUmidadeSolo); // lê o valor do sensor de umidade,
// no nosso caso potenciometro
int umidadeSoloPorcentagem = map(umidadeSoloBruto, SOLO_MUITO_UMIDO, SOLO_MUITO_SECO, 0, 100);
umidadeSoloPorcentagem = constrain(umidadeSoloPorcentagem, 0, 100);
// Atualizando a condição do solo
if (umidadeSoloBruto <= SOLO_MUITO_UMIDO) {
condicaoSolo = "Muito Úmido";
} else if (umidadeSoloBruto > SOLO_MUITO_UMIDO && umidadeSoloBruto <= SOLO_IDEAL_VALOR) {
condicaoSolo = "Ideal";
} else if (umidadeSoloBruto > SOLO_IDEAL_VALOR && umidadeSoloBruto <= SOLO_SECO_VALOR) {
condicaoSolo = "Seco";
} else {
condicaoSolo = "Muito Seco";
}
// Atualizando LEDs e LCD
atualizarLEDs(umidadeSoloBruto);
atualizarLCD(umidadeSoloPorcentagem, condicaoSolo);
}