#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"

const int DHT_PIN = 15;

DHTesp dhtSensor;

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE	(50)
float temp = 0;
float hum = 0;
int value = 0;

void setup_wifi() {

  delay(10);
    // We start by connecting to a WiFi network
      Serial.println();
        Serial.print("Connecting to ");
          Serial.println(ssid);

            WiFi.mode(WIFI_STA);
              WiFi.begin(ssid, password);

                while (WiFi.status() != WL_CONNECTED) {
                    delay(500);
                        Serial.print(".");
                          }

                            randomSeed(micros());

                              Serial.println("");
                                Serial.println("WiFi connected");
                                  Serial.println("IP address: ");
                                    Serial.println(WiFi.localIP());
                                    }

                                    void callback(char* topic, byte* payload, unsigned int length) {
                                      Serial.print("Message arrived [");
                                        Serial.print(topic);
                                          Serial.print("] ");
                                            for (int i = 0; i < length; i++) {
                                                Serial.print((char)payload[i]);
                                                  }
                                                    Serial.println();

                                                      // Switch on the LED if an 1 was received as first character
                                                        if ((char)payload[0] == '1') {
                                                            digitalWrite(2, LOW);   // Turn the LED on (Note that LOW is the voltage level
                                                                // but actually the LED is on; this is because
                                                                    // it is active low on the ESP-01)
                                                                      } else {
                                                                          digitalWrite(2, HIGH);  // Turn the LED off by making the voltage HIGH
                                                                            }

                                                                            }

                                                                            void reconnect() {
                                                                              // Loop until we're reconnected
                                                                                while (!client.connected()) {
                                                                                    Serial.print("Attempting MQTT connection...");
                                                                                        // Create a random client ID
                                                                                            String clientId = "ESP8266Client";
                                                                                                clientId += String(random(0xffff), HEX);
                                                                                                    // Attempt to connect
                                                                                                        if (client.connect(clientId.c_str())) {
                                                                                                              Serial.println("Connected");
                                                                                                                    // Once connected, publish an announcement...
                                                                                                                          client.publish("/d3tt", "Connected");
                                                                                                                                // ... and resubscribe
                                                                                                                                      client.subscribe("/d3tt");
                                                                                                                                          } else {
                                                                                                                                                Serial.print("failed, rc=");
                                                                                                                                                      Serial.print(client.state());
                                                                                                                                                            Serial.println(" try again in 5 seconds");
                                                                                                                                                                  // Wait 5 seconds before retrying
                                                                                                                                                                        delay(5000);
                                                                                                                                                                            }
                                                                                                                                                                              }
                                                                                                                                                                              }

                                                                                                                                                                              void setup() {
                                                                                                                                                                                pinMode(2, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
                                                                                                                                                                                  Serial.begin(115200);
                                                                                                                                                                                    setup_wifi();
                                                                                                                                                                                      client.setServer(mqtt_server, 1883);
                                                                                                                                                                                        client.setCallback(callback);
                                                                                                                                                                                          dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
                                                                                                                                                                                          }

                                                                                                                                                                                          void loop() {

                                                                                                                                                                                            if (!client.connected()) {
                                                                                                                                                                                                reconnect();
                                                                                                                                                                                                  }
                                                                                                                                                                                                    client.loop();

                                                                                                                                                                                                      unsigned long now = millis();
                                                                                                                                                                                                        if (now - lastMsg > 2000) {
                                                                                                                                                                                                            lastMsg = now;
                                                                                                                                                                                                                TempAndHumidity  data = dhtSensor.getTempAndHumidity();

                                                                                                                                                                                                                    String temp = String(data.temperature, 2);
                                                                                                                                                                                                                        Serial.print("Temperature: ");
                                                                                                                                                                                                                            Serial.println(temp);
                                                                                                                                                                                                                                client.publish("/d3tt/temp", temp.c_str());
                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                        String hum = String(data.humidity, 1);
                                                                                                                                                                                                                                            Serial.print("Humidity: ");
                                                                                                                                                                                                                                                Serial.println(hum);
                                                                                                                                                                                                                                                    client.publish("/d3tt/hum", hum.c_str());
                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                      }