/*
Incluindo as bibliotecas
.........................................................................
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
/*
Definindo os pinos de entrada e saida
.........................................................................
*/
#define ONE_WIRE_BUS 4
#define PIN_LDR 33
#define PIN_SERVO 19
#define MQTT_BROKER "broker.mqttdashboard.com"
#define MQTT_PORT 1883
#define MQTT_TOPIC "Virtus-3-estufa"
#define PIN_TRIGGER 14
#define PIN_ECHO 27
const int PIN_R = 18;
const int PIN_G = 5;
const int PIN_B = 17;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Servo myservo;
WiFiClient wifiClient;
PubSubClient client(wifiClient);
void setup() {
Serial.begin(115200);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 2);
LCD.print("WiFi ");
sensors.begin();
WiFi.begin("Wokwi-GUEST", ""); // Conecte-se à rede Wi-Fi aberta
while (WiFi.status() != WL_CONNECTED) {
delay(500);
//Serial.print(".");
LCD.print(".");
}
pinMode(PIN_TRIGGER, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
pinMode(PIN_LDR, INPUT);
Serial.println("Conectado à rede Wi-Fi!");
client.setServer(MQTT_BROKER, MQTT_PORT);
myservo.attach(PIN_SERVO, 500, 2400);
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Online");
LCD.setCursor(0, 2);
LCD.println("Updating time...");
}
void loop() {
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
//Serial.print("Temperatura: ");
//Serial.println(temperature);
print_temperature(temperature);
float Iluminacao = digitalRead(PIN_LDR);
float angle;
if (digitalRead(PIN_LDR) == LOW) {
angle = 90;
//rotation_up(angle);
//print_lighting(angle);
//Serial.print("Iluminação: Light \n");
} else {
angle = 0;
//rotation_downward(angle);
//print_lighting(angle);
//Serial.print("Iluminação: Dark \n");
}
myservo.write(angle);
//Serial.print("Angulo: ");
//Serial.print(angle);
//Serial.print("\n");
digitalWrite(PIN_TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIGGER, LOW);
float pulso_tempo = pulseIn(PIN_ECHO, HIGH);
float distancia = pulso_tempo / 58;
if (client.connect("EVirtusClientTest")) {
client.publish(MQTT_TOPIC, String(temperature).c_str());
client.publish(MQTT_TOPIC, String(Iluminacao).c_str());
client.publish(MQTT_TOPIC, String(angle).c_str());
client.publish(MQTT_TOPIC, String(distancia).c_str());
client.publish(MQTT_TOPIC, String(calculate_percentage(distancia)).c_str());
client.disconnect();
print_distance(distancia);
//Serial.println("Dados enviados para o broker MQTT!");
LCD.clear();
LCD.println("Dados enviados para o broker MQTT!");
delay(50);
} else {
//Serial.println("Falha na conexão com o broker MQTT.");
LCD.clear();
LCD.println("Falha na conexão com o broker MQTT!");
delay(50);
}
delay(10); // Envie a cada 10 segundos
}
// Imprime na tela do LCD a temperatura
void print_temperature( float temperature ) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Temperatura: ");
LCD.setCursor(0, 1);
LCD.println(temperature);
delay(500);
return;
}
// Imprime na tela do LCD a luminosidade
void print_lighting(int angulo) {
LCD.clear();
if( angulo == 90){
LCD.setCursor(0, 0);
LCD.println("Iluminacao");
LCD.setCursor(0, 1);
LCD.println("Light");
delay(500);
}else{
LCD.setCursor(0, 0);
LCD.println("Iluminacao");
LCD.setCursor(0, 1);
LCD.println("Dark");
delay(500);
}
return;
}
// Imprime da tela do LCD a distancia
void print_distance( float distancia ) {
LCD.clear();
LCD.setCursor(8, 0);
LCD.println("Distancia: ");
LCD.setCursor(8, 1);
LCD.println(distancia);
delay(500);
return;
}
// Imprime na tela do LCD a porcentagem de agua
void print_percentage(float percentage) {
LCD.clear();
LCD.setCursor(0, 2);
LCD.println("Porcentagem: ");
LCD.setCursor(0, 3);
LCD.println(percentage);
LCD.println("%");
delay(500);
return;
}
// Calcula a porcentagem de agua
int calculate_percentage( float distancia) {
int PorcTanqueAgua;
if (distancia < 70) { // Menos de 20 % --> vermelho
digitalWrite(PIN_R, 255);
digitalWrite(PIN_G, 0);
digitalWrite(PIN_B, 0);
PorcTanqueAgua = 20;
print_percentage(PorcTanqueAgua);
}else if (distancia < 150) { // Menos 40 % --> Amarelo
digitalWrite(PIN_R, 255);
digitalWrite(PIN_G, 255);
digitalWrite(PIN_B, 0);
PorcTanqueAgua = 40;
print_percentage(PorcTanqueAgua);
}else if (distancia < 250) { // Menos de 70 % --> Verde
digitalWrite(PIN_R, 0);
digitalWrite(PIN_G, 255);
digitalWrite(PIN_B, 0);
PorcTanqueAgua = 70;
print_percentage(PorcTanqueAgua);
}else { // maior que 70 % --> azul
digitalWrite(PIN_R, 0);
digitalWrite(PIN_G, 0);
digitalWrite(PIN_B, 255);
PorcTanqueAgua = 100;
print_percentage(PorcTanqueAgua);
}
return PorcTanqueAgua;
}
// Faz a rotacao para cima --> 90
void rotation_up( int angulo ) {
int pos = 0;
for (pos = 0; pos <= angulo; pos += 1) {
myservo.write(pos);
delay(15);
}
return;
}
// Faz o rotacao para baixo --> 0
void rotation_downward(int angulo){
int pos = 90;
for (pos = 90; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
return;
}