#include <Wire.h> // Необходима для I2C связи
#include <LCDI2C_Multilingual.h> // Подключаем библиотеку для LCD I2C
// Определение пинов
const int RELAY1_PIN = 3; // Реле 1 подключено к цифровому пину D3
const int RELAY2_PIN = 4; // Реле 2 подключено к цифровому пину D4
const int BUTTON1_PIN = 7; // Кнопка 1 подключена к цифровому пину D7
const int BUTTON2_PIN = 8; // Кнопка 2 подключена к цифровому пину D8
// Инициализация объекта LCD
// Адрес 0x27, 16 столбцов, 2 строки
LCDI2C_Multilingual lcd(0x27, 16, 2);
// Переменные для хранения состояния реле
// false = ВЫКЛ, true = ВКЛ
bool relay1State = false;
bool relay2State = false;
// Переменные для подавления дребезга кнопок (debounce)
const long debounceDelay = 50; // Задержка дребезга в миллисекундах
// Переменные для Кнопки 1
int button1CurrentState; // Текущее считывание с пина кнопки
int button1LastStableState = HIGH; // Последнее стабильное состояние кнопки (HIGH = не нажата для INPUT_PULLUP)
unsigned long lastDebounceTime1 = 0; // Время последнего изменения состояния кнопки 1
// Переменные для Кнопки 2
int button2CurrentState;
int button2LastStableState = HIGH;
unsigned long lastDebounceTime2 = 0;
// Функция для обновления содержимого LCD дисплея
void updateLCD() {
lcd.clear(); // Очищаем дисплей перед записью нового содержимого
// Отображаем состояние Реле 1 на первой строке
lcd.setCursor(0, 0);
if (relay1State) {
lcd.print("Реле 1: Вкл"); // Если реле 1 включено
} else {
lcd.print("Реле 1: Выкл"); // Если реле 1 выключено
}
// Отображаем состояние Реле 2 на второй строке
lcd.setCursor(0, 1);
if (relay2State) {
lcd.print("Реле 2: Вкл"); // Если реле 2 включено
} else {
lcd.print("Реле 2: Выкл"); // Если реле 2 выключено
}
}
void setup() {
// Инициализация Последовательного порта для отладки (необязательно, но полезно)
Serial.begin(9600);
Serial.println("Система управления реле запущена...");
// Настройка режимов пинов
pinMode(RELAY1_PIN, OUTPUT); // Пин реле как выход
pinMode(RELAY2_PIN, OUTPUT); // Пин реле как выход
pinMode(BUTTON1_PIN, INPUT_PULLUP); // Пин кнопки как вход с внутренним подтягивающим резистором
pinMode(BUTTON2_PIN, INPUT_PULLUP); // Пин кнопки как вход с внутренним подтягивающим резистором
// Установка начального состояния реле в ВЫКЛ (LOW для активно-высоких реле)
// Если ваши реле активно-низкие, измените LOW на HIGH.
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
// Инициализация LCD дисплея
lcd.begin();
lcd.backlight(); // Включаем подсветку
lcd.print("Система запущена");
lcd.setCursor(0, 1);
lcd.print("Ожидание...");
delay(2000); // Показываем начальное сообщение 2 секунды
updateLCD(); // Отображаем начальные состояния реле на LCD
}
void loop() {
// --- Логика для Кнопки 1 ---
int reading1 = digitalRead(BUTTON1_PIN); // Считываем текущее состояние кнопки
// Если текущее считывание отличается от предыдущего, сбрасываем таймер дребезга
if (reading1 != button1CurrentState) {
lastDebounceTime1 = millis();
}
// Если состояние кнопки стабильно дольше, чем debounceDelay
if ((millis() - lastDebounceTime1) > debounceDelay) {
// Если стабильное состояние отличается от последнего записанного стабильного состояния
if (reading1 != button1LastStableState) {
button1LastStableState = reading1; // Обновляем последнее стабильное состояние
// Если кнопка сейчас нажата (LOW, из-за INPUT_PULLUP)
if (button1LastStableState == LOW) {
relay1State = !relay1State; // Переключаем состояние реле 1 (ВКЛ <-> ВЫКЛ)
// Обновляем выходной пин реле
// Если relay1State true, пин HIGH (ВКЛ), иначе LOW (ВЫКЛ)
digitalWrite(RELAY1_PIN, relay1State ? HIGH : LOW);
updateLCD(); // Обновляем отображение на LCD
Serial.print("Реле 1 переключено в: ");
Serial.println(relay1State ? "ВКЛ" : "ВЫКЛ");
}
}
}
button1CurrentState = reading1; // Сохраняем текущее считывание для следующей итерации цикла
// --- Логика для Кнопки 2 ---
int reading2 = digitalRead(BUTTON2_PIN);
// Если текущее считывание отличается от предыдущего, сбрасываем таймер дребезга
if (reading2 != button2CurrentState) {
lastDebounceTime2 = millis();
}
// Если состояние кнопки стабильно дольше, чем debounceDelay
if ((millis() - lastDebounceTime2) > debounceDelay) {
// Если стабильное состояние отличается от последнего записанного стабильного состояния
if (reading2 != button2LastStableState) {
button2LastStableState = reading2;
// Если кнопка сейчас нажата (LOW, из-за INPUT_PULLUP)
if (button2LastStableState == LOW) {
relay2State = !relay2State; // Переключаем состояние реле 2
digitalWrite(RELAY2_PIN, relay2State ? HIGH : LOW);
updateLCD(); // Обновляем отображение на LCD
Serial.print("Реле 2 переключено в: ");
Serial.println(relay2State ? "ВКЛ" : "ВЫКЛ");
}
}
}
button2CurrentState = reading2;
}
вот код
такая ошибка:
Compilation error: Compilation error: 'LCDI2C_Multilingual' does not name a type; did you mean 'LCDI2C_Multilingual_h
библиотека установлена!
строка на которую он указывает: LCDI2C_Multilingual lcd(0x27, 16, 2);