#include <WiFi.h> // Бібліотека для підключення ESP32 до WiFi
#include <WebServer.h> // Бібліотека для створення HTTP веб-сервера
#include "RTClib.h" // Бібліотека для роботи з RTC (годинник реального часу)
#include <HTTPClient.h> // Для відправки HTTP-запитів
#include <ArduinoJson.h> // Для роботи з JSON даними
#include <LiquidCrystal_I2C.h> // Для роботи з LCD дисплеєм по I2C
#include <DHTesp.h> // Бібліотека для роботи з DHT датчиками
#define led 2 // Пін для підключення світлодіода
#define analog_In 12 // Пін для підключення фоторезистора (датчика освітленості)
const int DHT_CPU = 26; // Пін для датчика температури CPU
const int DHT_GPU = 27; // Пін для датчика температури GPU
// Дані WiFi мережі
const char* SSID = "Wokwi-GUEST";
const char* password = "";
const char* openaiApiKey = "b453666eb3d04c1fa7c608375d88f7fc"; // API ключ GPT
RTC_DS1307 rtc; // Об'єкт для роботи з RTC
WebServer server(80); // Створення веб-сервера на порту 80
LiquidCrystal_I2C LCD(0x27, 16, 2); // LCD дисплей 16x2 по I2C
String logBuffer = ""; // Буфер для зберігання логів (час + температура)
// Пороги температури для попередження
const float MAX_CPU_TEMP = 75.0; // Максимальна температура для CPU (в градусах Цельсія)
const float MAX_GPU_TEMP = 85.0; // Максимальна температура для GPU (в градусах Цельсія)
// Ініціалізація об'єктів для роботи з DHT датчиками
DHTesp dhtCPU;
DHTesp dhtGPU;
// ------------------ ФУНКЦІЯ ВИКЛИКУ GPT ------------------
void request_gpt(String prompt) {
Serial.println("Sending request to GPT..."); // Лог перед запитом
DynamicJsonDocument doc(1024);
doc["model"] = "gpt-3.5-turbo";
JsonArray messages = doc.createNestedArray("messages");
JsonObject systemMsg = messages.createNestedObject();
systemMsg["role"] = "system";
systemMsg["content"] = "You are a smart temperature computer assistant.";
JsonObject userMsg = messages.createNestedObject();
userMsg["role"] = "user";
userMsg["content"] = prompt;
HTTPClient http;
String apiUrl = "https://artificialintelligence.openai.azure.com/openai/deployments/test/chat/completions?api-version=2023-05-15";
http.begin(apiUrl);
http.addHeader("Content-Type", "application/json");
http.addHeader("api-key", openaiApiKey);
String body;
serializeJson(doc, body);
int httpCode = http.POST(body);
if (httpCode == 200) {
String response = http.getString();
DeserializationError error = deserializeJson(doc, response);
if (!error) {
String reply = doc["choices"][0]["message"]["content"].as<String>();
Serial.println("GPT reply:\n" + reply); // Виведення відповіді GPT
}
} else {
Serial.println("Error sending request to GPT. HTTP code: " + String(httpCode));
}
http.end(); // Закриття запиту
}
// ------------------ ЧИТАННЯ ТЕМПЕРАТУР ------------------
// Зчитуємо температуру з датчика DHT для CPU
float getCPUTemperature() {
float cpuTemp = dhtCPU.getTemperature();
return cpuTemp;
}
// Зчитуємо температуру з датчика DHT для GPU
float getGPUTemperature() {
float gpuTemp = dhtGPU.getTemperature();
return gpuTemp;
}
unsigned long lastRequestTime = 0; // Час останнього запиту до GPT
const unsigned long REQUEST_INTERVAL = 10000; // Інтервал в 10 секунд
void setup() {
Serial.begin(115200); // Запуск серійного монітора для відлагодження
pinMode(led, OUTPUT); // Світлодіод — вихід
// Підключення до WiFi
WiFi.begin(SSID, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected. IP: " + WiFi.localIP().toString());
rtc.begin(); // Ініціалізація RTC
LCD.init(); // Ініціалізація LCD
LCD.backlight();// Увімкнення підсвітки LCD
// Ініціалізація DHT датчиків
dhtCPU.setup(DHT_CPU, DHTesp::DHT22); // Налаштування датчика температури CPU
dhtGPU.setup(DHT_GPU, DHTesp::DHT22); // Налаштування датчика температури GPU
}
// ------------------ ОСНОВНИЙ ЦИКЛ ------------------
void loop() {
// Зчитування поточного часу з RTC
DateTime now = rtc.now();
String timeStr = "Time: " + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());
// Отримуємо температуру CPU та GPU
float cpuTemp = getCPUTemperature();
float gpuTemp = getGPUTemperature();
String cpuStr = "CPU Temp: " + String(cpuTemp, 2) + " C";
String gpuStr = "GPU Temp: " + String(gpuTemp, 2) + " C";
// Виведення даних на LCD
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(timeStr);
LCD.setCursor(0, 1);
LCD.print(cpuStr);
LCD.setCursor(0, 2);
LCD.print(gpuStr);
// Перевірка, чи настав час для наступного запиту
if (millis() - lastRequestTime >= REQUEST_INTERVAL) {
lastRequestTime = millis(); // Оновлюємо час останнього запиту
// Формуємо запит для GPT
String prompt = "The CPU temperature is " + String(cpuTemp) + "°C and the GPU temperature is " + String(gpuTemp) + "°C. ";
if (cpuTemp > MAX_CPU_TEMP || gpuTemp > MAX_GPU_TEMP) {
prompt += "The temperatures are too high! Provide advice on how to cool down the system.";
digitalWrite(led, HIGH); // Включаем светодиод при высокой температуре
} else {
prompt += "The temperatures are within normal range.";
digitalWrite(led, LOW); // Выключаем светодиод при нормальной температуре
}
// Викликаємо GPT
request_gpt(prompt);
}
delay(500); // Затримка між циклами
}