#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "DHTesp.h"
#include "mbedtls/rsa.h"
#include <ArduinoJson.h>
#define BOMBA 5
#define SENSORSOLO 34
// Flags da bomba
unsigned long tempoBombaLigada = 0;
const unsigned long tempoMaximo = 17500; // 17.5 segundos em milissegundos
bool alertaSonoro = 0;
bool modoManual = 0;
// Variávei globais gerais
unsigned long tempoPassado = 0;
unsigned long tempoPassado2 = 0;
// Substitua pelas suas informações de rede
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Substitua pelas suas informações do broker MQTT
const char* mqttServer = "broker.hivemq.com";
const int mqttPort = 1883;
const char* mqttUser = "";
const char* mqttPassword = "";
// Tópicos mqtt
char MqqtTopic[] = "sensores/medidas";
//Configurar Display
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
WiFiClient espClient;
PubSubClient client(espClient);
// Configuração do pino sensor DHT22,
const int DHT_PIN = 15;
DHTesp dhtSensor;
void callback(String topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String strPayload = "";
for (int i = 0; i < length; i++) {
strPayload += (char)payload[i];
}
StaticJsonDocument<200> jsonDocument;
JsonObject Dadosdashboard = jsonDocument.as<JsonObject>();
if (topic == "dashboard/comandos") {
if (Dadosdashboard["ModoManual"] == "1") {
modoManual = 1;
} else {
modoManual = 0;
}
if (modoManual && !alertaSonoro) {
if (Dadosdashboard["EstadoBomba"] == "1") {
digitalWrite(BOMBA, HIGH);
} else {
digitalWrite(BOMBA, LOW);
}
}
}
}
void reconnect() {
// Loop até que estejamos reconectados
while (!client.connected()) {
Serial.print("Tentando conectar ao MQTT Broker...");
// Tente conectar
if (client.connect("")) {
Serial.println("Conectado ao MQTT Broker!");
client.subscribe("dashboard/comandos");
} else {
Serial.print("Falha na conexão, rc=");
Serial.print(client.state());
Serial.println("Tentando novamente em 2 segundos");
delay(2000);
}
}
}
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(115200);
Serial.print("Conectando ao WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Conectado!");
Wire.begin(23, 22);
client.setServer(mqttServer, mqttPort);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(BOMBA, OUTPUT); //Definir pino Relé como saída
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
TempAndHumidity dadossensor = dhtSensor.getTempAndHumidity();
int soilmeterValue = analogRead(SENSORSOLO);
long intervalo = millis() - tempoPassado;
long intervalo2 = millis() - tempoPassado2;
if(intervalo >= 500){
if(tempoBombaLigada < tempoMaximo){
if(!modoManual){
if(soilmeterValue > 2165){
if(!digitalRead(BOMBA)){
digitalWrite(BOMBA, HIGH);
}else{
tempoBombaLigada += intervalo;
}
}else{
if(digitalRead(BOMBA))
tempoBombaLigada += intervalo;
digitalWrite(BOMBA, LOW);
}
}
}else{
if(!alertaSonoro){
alertaSonoro = true;
}
digitalWrite(BOMBA, LOW);
}
if(intervalo2 >= 1000){
lcd.setCursor(0, 0);
lcd.print("Temperature:"+ String(dadossensor.temperature, 1) + "\xDF"+"C ");
lcd.setCursor(0, 1);
lcd.print("Humidity: "+ String(dadossensor.humidity, 1) + "% ");
tempoPassado2 =millis();
}
// Cria um documento JSON
StaticJsonDocument<200> doc;
doc["Temp"] = dadossensor.temperature;
doc["Hum"] = dadossensor.humidity;
doc["HumSoil"] = soilmeterValue;
doc["Alerta"] = alertaSonoro;
// Converte JSON para String
String output;
serializeJson(doc, output);
// Publica a mensagem no tópico MQTT
client.publish(MqqtTopic, output.c_str());
tempoPassado = millis();
}
}