#include <LiquidCrystal_I2C.h> // Підключаємо бібліотеку LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // Настройка дисплея
int ledPins[] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; // Піни для світлодіодів
const int BuzzerCPU = 3;
const int BuzzerGPU = 2;
const int potPin = A2; // Пін для аналогового датчика
const int ledCount = 10;
int tempCPU;
int tempGPU;
int threshold;
byte snezh[8] = {
0b00100,
0b10101,
0b01110,
0b11111,
0b01110,
0b10101,
0b00100
}; // символ "снежинки"
byte ogon[8] = {
0b10000,
0b10100,
0b01100,
0b01110,
0b11110,
0b11111,
0b01110
};
void setup() {
lcd.init();
lcd.backlight(); // Включаємо підсвітку
// Ініціалізація екрану
lcd.setCursor(1, 0);
lcd.print("CPU: ");
lcd.setCursor(1, 1);
lcd.print("GPU: ");
lcd.setCursor(1, 2);
lcd.print("THR: "); // Порогова температура
pinMode(BuzzerCPU, OUTPUT);
pinMode(BuzzerGPU, OUTPUT);
// Налаштування всіх пінів для світлодіодів
for (int thisLed = 0; thisLed < ledCount; thisLed++)
{
pinMode(ledPins[thisLed], OUTPUT);
}
lcd.createChar(1, snezh);
lcd.createChar(2, ogon);
}
void loop() {
delay(2500); // Затримка перед оновленням даних
tempCPU = random(40, 100); // Генерація випадкової температури для CPU
tempGPU = random(40, 100); // Генерація випадкової температури для GPU
int potValue = analogRead(potPin);
threshold = map(potValue, 0, 1023, 30, 100); // Мапуємо потенціометр на діапазон температур
// Очищення та оновлення температури CPU
lcd.setCursor(6, 0);
lcd.print(" "); // Очищаємо попередні значення
lcd.setCursor(6, 0);
lcd.print(tempCPU);
// Очищення та оновлення температури GPU
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(tempGPU);
// Очищення та оновлення порогової температури
lcd.setCursor(6, 2);
lcd.print(" ");
lcd.setCursor(6, 2);
lcd.print(threshold);
// Оновлення бар-графіка для CPU
int ledCPU = map(tempCPU, 30, 100, 0, ledCount); // Мапінг температури на кількість світлодіодів
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
if (thisLed < ledCPU) {
digitalWrite(ledPins[thisLed], HIGH); // Включаємо світлодіоди
} else {
digitalWrite(ledPins[thisLed], LOW); // Вимикаємо світлодіоди
}
}
// Очищення попередніх символів на позиціях
lcd.setCursor(18, 0);
lcd.print(" "); // Очищаємо символ на позиції CPU
lcd.setCursor(18, 1);
lcd.print(" "); // Очищаємо символ на позиції GPU
// Логіка відображення статусу CPU
if (tempCPU < threshold) {
lcd.setCursor(12, 0);
lcd.print("NORM ");
lcd.setCursor(18, 0);
lcd.write(1); // Виводимо сніжинку
} else {
lcd.setCursor(12, 0);
lcd.print("HOT ");
lcd.setCursor(18, 0);
lcd.write(2); // Виводимо вогник
tone(BuzzerCPU, 300, 200); // Включаємо зумер для CPU
}
// Оновлення бар-графіка для GPU
int ledGPU = map(tempGPU, 30, 100, 0, ledCount); // Мапінг температури на кількість світлодіодів
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
if (thisLed < ledGPU) {
digitalWrite(ledPins[thisLed], HIGH); // Включаємо світлодіоди
} else {
digitalWrite(ledPins[thisLed], LOW); // Вимикаємо світлодіоди
}
}
// Логіка відображення статусу GPU
if (tempGPU < threshold) {
lcd.setCursor(12, 1);
lcd.print("NORM ");
lcd.setCursor(18, 1);
lcd.write(1); // Виводимо сніжинку
} else {
lcd.setCursor(12, 1);
lcd.print("HOT ");
lcd.setCursor(18, 1);
lcd.write(2); // Виводимо вогник
tone(BuzzerGPU, 300, 200); // Включаємо зумер для GPU
}
}