#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io";

WiFiClient espClient;
PubSubClient client(espClient);

const int DHTPIN = 39;
const int ONE_WIRE_BUS = 12;

DHTesp dht; 

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

unsigned long lastDHTTime = 0;
unsigned long lastDS18BTime = 0;
unsigned long lastSendDataTime = 0;
float temperature = 300;
float humidity = 300;

void setup_wifi() {
  delay(10);
  Serial.println("Connecting to WiFi...");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP Address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ESP32Client")) {
      Serial.println("connected");
      //client.subscribe("sensor/data");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);

  setup_wifi();
  client.setServer(mqtt_server, 1883);

  dht.setup(DHTPIN, DHTesp::DHT22);
  sensors.begin();
}

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

  client.loop();

  unsigned long currentMillis = millis();

  if (currentMillis - lastDS18BTime >= 2000) {
    lastDS18BTime = currentMillis;
    sensors.requestTemperatures(); 
    temperature = sensors.getTempCByIndex(0);
  }

  if (currentMillis - lastSendDataTime >= 6000) {
    lastSendDataTime = currentMillis;
    sendData(temperature, humidity);
  }
}

void sendData(float temp, float hum) {
  char messages[150];
  snprintf(messages, 150, "{\"type\": \"message\", \"content\": \"Temperature: %.2f, Humidity: %.2f. DateTime: %s\"}", temp, hum, getTimeStr().c_str());
  client.publish("sensor/data", messages);
  Serial.println("Success");
}

String getTimeStr() {
  time_t now = time(NULL);
  struct tm *t = localtime(&now);
  char dateStr[20];
  strftime(dateStr, sizeof(dateStr), "%d.%m.%Y %H:%M:%S", t);
  return String(dateStr);
}
Loading
esp32-s2-devkitm-1
Loading
ds18b20