#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "DHTesp.h"
#include "mbedtls/rsa.h"
#include <ArduinoJson.h>
#define RelayPin 5
// Flags da bomba
unsigned long tempoBombaLigada = 0;
const unsigned long tempoMaximo = 17500; // 17.5 segundos em milissegundos
// 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 = "";
// Substitua com a sua chave pública RSA
const char* rsa_public_key = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMYyZNFcFX1d1uElYeWTGUlvzfzjqSJe Hu3hL9J6nd6Dvar+tLtCqhDMo7lVLQl3i4UNKZAM/ZpG0FVey4WbWB0CAwEAAQ=="; //512 tamanho
//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(char* topic, byte* payload, unsigned int lenght){
if (strcmp(topic, "sensors/motor-pump") == 0){
if (payload[0] == '1'){
digitalWrite(motorPumpPin, HIGH);
Serial.println(("Pump on"));
waterBottle += 1;
} else if(payload[0] == '0'){
digitalWrite(motorPumpPin, LOW);
Serial.println("Pump off");
}
}
}*/
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!");
} 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(RelayPin, OUTPUT); //Definir pino Relé como saída
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
int soilmeterValue = analogRead(34);
lcd.setCursor(0, 0);
lcd.print("Temperature:"+ String(data.temperature, 1) + "\xDF"+"C ");
lcd.setCursor(0, 1);
lcd.print("Humidity: "+ String(data.humidity, 1) + "% ");
delay(500);
// Publish sensor data to MQTT topics
char MqqtTopic[] = "sensores/medidas";
//client.publish(temperatureTopic, String(data.temperature, 2).c_str());
// Cria um documento JSON
StaticJsonDocument<200> doc;
doc["Temp"] = data.temperature;
doc["Hum"] = data.humidity;
doc["HumSoil"] = soilmeterValue;
// Converte JSON para String
String output;
serializeJson(doc, output);
// Publica a mensagem no tópico MQTT
client.publish(MqqtTopic, output.c_str());
delay(500);
int16_t i = analogRead(34);
String msg = i < 2165 ? "Seco" : i > 3135 ? "Humido" : "Normal";
lcd.clear();
lcd.print("Solo: ");
lcd.print(msg);
delay(500);
if (i > 2165){
digitalWrite(RelayPin, LOW);
int tempfim = millis();
delay(500);
}
else if (i < 2165) {
digitalWrite(RelayPin,HIGH);
int tempini = millis();
delay(500);
}
}