/*
CAPACITAÇÃO USO DO APLICATIVO WOKWI
SETEMBRO DE 2024
ATIVIDADE FINAL

Projeto 1 – Montar um circuito ESP 32 conectado a um display OLED SSD1306 e um sensor DHT22 no Wokwi.

A programação (na linguagem C/Arduino) deverá ler a temperatura e umidade simuladas no DHT22, e exibir
os valores medidos de temperatura e umidade no display OLED.

Os valores também deverão ser enviados pelo protocolo MQTT ao test.mosquitto.org, porta 1883 como mensagem de tópico.
Um app deverá ser desenvolvido no App Inventor e deverá conectar-se e consultar o tópico, no test.mosquitto.org, 
enviado pelo ESP32, quando este estiver em modo de simulação no Wokwi, com os dados de temperatura e umidade 
e exibir as informações em tela.

Dois valores, um tópico:

Se usar como base o projeto desenvolvido na aula do encontro presencial, recomendo concatenar em uma única 
String os valores de temperatura, a “,” e a umidade. Exemplo depois de concatenar a String:
*/

// ========================================================================================================
// --- Bibliotecas Auxiliares ---
//#include <SPI.h>
//#include <Wire.h>
//#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHTesp.h"
#include <WiFi.h>
#include <PubSubClient.h>

//========================================================================================================
// --- Configurações gerais ---
// --- Variáveis Globais ---

const int DHT_PIN = 15; // data do DHT conectado ao pino 15 do ESP32
float temperatura_lida = 0; // variável leitura de temperatura
float umidade_lida = 0; // variável leitura de umidade
float temperaturaC, temperaturaF = 0;

//========================================================================================================
// --- Declaração para o display SSD1306 connectado ao I2C (pinos SDA, SCL) ----

Adafruit_SSD1306 display(128, 64, & Wire, -1);

//========================================================================================================
//--- Criação do objeto DHT ----

DHTesp dht;

//=========================================================================================================
//--- Config. SSID e Senha do WiFi ---
 const char* ssid = "Wokwi-GUEST";
 const char* password = "";

 //Config. Servidor MQTT 
 const char* mqtt_server = "test.mosquitto.org"; 
 
 //Cria um cliente que pode se conectar a um endereço IP e porta de internet
 // especificados, conforme definido em client.connect().

 WiFiClient ClienteWokwi; 
 //Esta biblioteca permite que você envie e receba mensagens MQTT. 
 PubSubClient client(ClienteWokwi);
  //Função que verifica se foi estabelecida conexão
   void reconnect()
    { while (!client.connected()) {
       Serial.print("Estabelecendo conexao MQTT..."); 
       if (client.connect("ClienteWokwi")) {
         Serial.println("Conectado"); 
         } else {
           Serial.print("failed, rc=");
            Serial.print(client.state());
             Serial.println(" tentando novamente em 5 segundos");
              // Aguardando 5 segundos
               delay(5000); }
               } }
               
   void publica_dados()
    { client.publish("barPr1",String(temperatura_lida).c_str());
     delay(1000);
      }

// --- Fim das configurações gerais ----
//=======================================================================================================

void setup() {
// --- inicia o monitor serial ---

Serial.begin(115200);

Serial.print("Conectando... ");
 Serial.print(ssid);
  WiFi.mode(WIFI_STA);
   WiFi.begin(ssid, password,6);
    while (WiFi.status() != WL_CONNECTED) {
       delay(500);
        Serial.print("."); 
        } 
Serial.println("WiFi connectado!");
 Serial.println("Endereco IP: ");
  Serial.println(WiFi.localIP());
   client.setServer(mqtt_server, 1883); 
// --- inicialização do DHT ---
  dht.setup(DHT_PIN, DHTesp::DHT22);

// --- inicialização do display OLED ---
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // Endereço 0x3C para 128x64


  display.clearDisplay(); // garante que o display começa vazio

}

void loop() {





// leitura de temperatura e umidade
  temperatura_lida = dht.getTemperature(); 
  umidade_lida = dht.getHumidity();

// configuração do display 
display.setTextSize(1);
display.setTextColor(WHITE);	

// mostrar temperatura
display.setCursor(10,10);
display.print("Temperatura = ");
display.setCursor(90,10);
display.print(temperatura_lida);

// mostrar umidade
display.setCursor(10,40);
display.print("Umidade = ");
display.setCursor(90,40);
display.print(umidade_lida);

// mandar para o display
display.display();
delay(2000);

// limpa o display
display.clearDisplay( );

}