Задать вопрос
@1squzeArduino

Как исправить ошибку?

#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);
  • Вопрос задан
  • 65 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@kalapanga
Что непонятно в тексте ошибки? Вы пытаетесь объявить переменную с несуществующим типом. В качестве типа Вы почему-то решили использовать имя библиотеки.
А вот какие типы действительно можно/нужно использовать, легко увидеть в примерах к библиотеке.
Ответ написан
Комментировать
Daemon23RUS
@Daemon23RUS
LCDI2C_Multilingual lcd(0x27, 16, 2);
LCDI2C_Russian lcd(0x27, 16, 2);
Ну или какой там Вам язык нужен, но из тех что поддерживает библиотека ...
P.S. lcd.init(); не увидел в коде, но далее уже сами разберетесь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы