#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
const int mqtt_port = 1883;
const char* client_id = "esp32_thermostat";
const char* username = "MY_7812"; // ім'я користувача
const char* password_mqtt = "1211"; // пароль
const char* data_topic = "home/sensor/data";
const int ds18b20Pin = 12;
const int lampPin = 35;
const unsigned long ds18b20Interval = 5000;
const unsigned long mqttInterval = 10000;
WiFiClient espClient;
PubSubClient client(espClient);
OneWire oneWire(ds18b20Pin);
DallasTemperature ds18b20(&oneWire);
float temperature_ds18b20 = -300;
unsigned long lastDs18b20Update = 0;
unsigned long lastMqttPublish = 0;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "in.pool.ntp.org", 10800); // Часовий пояс UTC+2
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void callback(char* topic, byte* payload, unsigned int length) {
// Обробка вхідних повідомлень MQTT тут
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(client_id)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
ds18b20.begin();
// Ініціалізація піна для лампочки
pinMode(lampPin, OUTPUT);
digitalWrite(lampPin, HIGH); // Включення лампочки
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
String printDate(unsigned long epochTime) {
const char* months[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"};
time_t time = (time_t)epochTime;
struct tm* tm_info = localtime(&time);
String month = months[tm_info->tm_mon];
int date = tm_info->tm_mday;
int year = tm_info->tm_year + 1900;
String hour = (tm_info->tm_hour < 10) ? "0" + String(tm_info->tm_hour) : String(tm_info->tm_hour);
String minute = (tm_info->tm_min < 10) ? "0" + String(tm_info->tm_min) : String(tm_info->tm_min);
String second = (tm_info->tm_sec < 10) ? "0" + String(tm_info->tm_sec) : String(tm_info->tm_sec);
return String(date) + "." + month + "." + String(year) + " " + hour + ":" + minute + ":" + second;
}
void sendData() {
// Отримання реального часу
timeClient.update();
String datetime = printDate(timeClient.getEpochTime());
// Формування JSON об'єкта
StaticJsonDocument<200> jsonDoc;
jsonDoc["type"] = "message";
jsonDoc["content"] = "Temperature: " + String(temperature_ds18b20, 2) + ", DateTime: " + datetime;
char jsonBuffer[256];
serializeJson(jsonDoc, jsonBuffer);
// Відправлення даних через MQTT
client.publish(data_topic, jsonBuffer);
// Виведення даних у консоль
Serial.println("Data sent:");
Serial.println(jsonBuffer);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long currentMillis = millis();
// Опитування датчика DS18B20
if (currentMillis - lastDs18b20Update >= ds18b20Interval) {
ds18b20.requestTemperatures();
temperature_ds18b20 = ds18b20.getTempCByIndex(0);
lastDs18b20Update = currentMillis;
Serial.print("Temperature: ");
Serial.println(temperature_ds18b20);
}
// Відправлення даних через MQTT раз в 10 секунд
if (currentMillis - lastMqttPublish >= mqttInterval) {
sendData();
lastMqttPublish = currentMillis;
}
}