// Bibliotecas
#include <PubSubClient.h>   // PubSubClient
#include <EspMQTTClient.h>  // EspMQTTClient
#include <ArduinoJson.h>    // ArduinoJson
#include <DHTesp.h>         // DHT sensor library for ESPx

// Variáveis
#define DHT_PIN 15
float controle_temp, controle_umid;

DHTesp dhtSensor;
DynamicJsonDocument dados(1024);

// Conexões WI-FI e MQTT
EspMQTTClient client(
  "Wokwi-GUEST",   //Rede wi-fi
  "",              // Senha wi-fi
  "mqtt.tago.io",  // Broker
  "Default",       // Usuário
  "token",         // Token da plataforma Tago.io
  "Esp32"          // Identificação única
);

// MQTT (Função que recebe dados do Subscribe)
void mensagemRecebida(const String &topico){

}

// MQTT (Subscribe)
void onConnectionEstablished() {
  client.subscribe("topic", mensagemRecebida);
}

// Setup
void setup() {
  Serial.begin(115200);
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}

// Loop
void loop() {
  client.loop();
  
  // Leitura de dados DHT22
  TempAndHumidity data = dhtSensor.getTempAndHumidity();

  // Variáveis de Temperatura e Umidade
  float temp = data.temperature;
  float umid = data.humidity;

  // Insere os dados no JSON
  dados[0]["variable"] = "Temperatura";
  dados[0]["value"] = temp;
  dados[0]["unit"] = "°C";
  dados[1]["variable"] = "Umidade";
  dados[1]["value"] = umid;
  dados[1]["unit"] = "%";

  // conversão da estrutura de dados (JSON)
  String dadosJsom;
  serializeJson(dados, dadosJsom);

  // MQTT (Publish) e controle (alteração de valores)
  if(controle_umid != umid || controle_temp != temp){
    Serial.println(dadosJsom);
    client.publish("dadosJsomEsp32", dadosJsom);
    controle_temp = temp;
    controle_umid = umid;
  }
  delay(1000);
}