#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>
#include <Preferences.h>
#include <ArduinoJson.h>
// ==================== НАСТРОЙКИ ПИНОВ ====================
#define DHTPIN 4 // DHT22 датчик
#define DHTTYPE DHT22
#define RELAY_PIN 5 // Реле
#define LED_PIN 2 // Встроенный LED
// ==================== Wi-Fi НАСТРОЙКИ ====================
const char* ssid = "Wokwi-GUEST"; // Имя твоей гостевой сети
const char* password = ""; // Пароль (пустая строка для гостевой)
// ==================== ПАРАМЕТРЫ СИСТЕМЫ ====================
float setpoint = 25.0; // Заданная температура
bool autoMode = true; // true - авто, false - ручной
bool manualRelayState = false; // Состояние реле в ручном режиме
bool relayState = false; // Текущее состояние реле
// ==================== ОБЪЕКТЫ ====================
WebServer server(80);
DHT dht(DHTPIN, DHTTYPE);
Preferences prefs;
// ==================== ЛОГИРОВАНИЕ ====================
struct LogEntry {
String time;
String msg;
};
const int MAX_LOG = 30;
LogEntry logBuffer[MAX_LOG];
int logIndex = 0;
int logCount = 0;
void addLog(String msg) {
String time = String(millis() / 1000);
logBuffer[logIndex].time = time;
logBuffer[logIndex].msg = msg;
logIndex = (logIndex + 1) % MAX_LOG;
if (logCount < MAX_LOG) logCount++;
Serial.print("[");
Serial.print(time);
Serial.print("] ");
Serial.println(msg);
}
// ==================== ХРАНЕНИЕ НАСТРОЕК ====================
void loadSettings() {
prefs.begin("tempsys", true);
setpoint = prefs.getFloat("setpoint", 25.0);
autoMode = prefs.getBool("autoMode", true);
manualRelayState = prefs.getBool("manualState", false);
prefs.end();
addLog("Настройки загружены: уставка " + String(setpoint) + "°C, режим " + (autoMode ? "авто" : "ручной"));
}
void saveSettings() {
prefs.begin("tempsys", false);
prefs.putFloat("setpoint", setpoint);
prefs.putBool("autoMode", autoMode);
prefs.putBool("manualState", manualRelayState);
prefs.end();
addLog("Настройки сохранены");
}
// ==================== УПРАВЛЕНИЕ РЕЛЕ ====================
void setRelay(bool state) {
relayState = state;
digitalWrite(RELAY_PIN, state ? HIGH : LOW);
digitalWrite(LED_PIN, state ? HIGH : LOW);
addLog(state ? "🔴 Реле ВКЛЮЧЕНО" : "⚫ Реле ВЫКЛЮЧЕНО");
}
// ==================== АВТОМАТИЧЕСКОЕ УПРАВЛЕНИЕ ====================
void autoControl(float currentTemp) {
if (!autoMode) return;
if (currentTemp < setpoint - 0.5) {
if (!relayState) setRelay(true);
} else if (currentTemp > setpoint + 0.5) {
if (relayState) setRelay(false);
}
}
// ==================== ПОДКЛЮЧЕНИЕ К Wi-Fi (быстрое) ====================
void connectToWiFi() {
Serial.print("Подключение к ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 15) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\n✅ Wi-Fi подключен!");
Serial.print("📡 IP адрес: ");
Serial.println(WiFi.localIP());
addLog("Wi-Fi подключен, IP: " + WiFi.localIP().toString());
} else {
Serial.println("\n❌ Не подключилось! Создаю точку доступа...");
WiFi.softAP("ESP32_Temp_Control", "");
Serial.print("📱 Точка доступа: ESP32_Temp_Control, IP: ");
Serial.println(WiFi.softAPIP());
addLog("Создана точка доступа ESP32_Temp_Control");
}
}