// Подключаем необходимые библиотеки
#include <Wire.h> // Библиотека для работы с I2C интерфейсом
#include <LiquidCrystal_I2C.h> // Библиотека для работы с LCD дисплеем 44780 через I2C
// Создаем объект для LCD дисплея
// Адрес 0x27 (стандартный для большинства дисплеев), размер 16 символов в 2 строки
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Определяем пины для светодиодов и управления
const int RED_LED_PIN = 13; // Красный светодиод на пине D13
const int YELLOW_LED_PIN = 8; // Желтый светодиод на пине D8
const int INCREASE_PIN = 7; // Пин D7 для увеличения счетчика
const int DECREASE_PIN = 4; // Пин D4 для уменьшения счетчика
// Переменные для работы программы
int counter = 0; // Счетчик
unsigned long previousMillis = 0; // Время последнего обновления счетчика
const long interval = 500; // Интервал обновления счетчика (500 мс)
bool increaseMode = false; // Режим увеличения счетчика
bool decreaseMode = false; // Режим уменьшения счетчика
void setup() {
// Инициализация последовательного порта Serial0 (скорость 9600 бод)
Serial.begin(9600);
// Инициализация LCD дисплея
lcd.init(); // Инициализация дисплея
lcd.backlight(); // Включаем подсветку дисплея
// Настройка пинов как входов/выходов
pinMode(RED_LED_PIN, OUTPUT); // Красный светодиод - выход
pinMode(YELLOW_LED_PIN, OUTPUT); // Желтый светодиод - выход
pinMode(INCREASE_PIN, INPUT); // Пин D7 - вход (для увеличения)
pinMode(DECREASE_PIN, INPUT); // Пин D4 - вход (для уменьшения)
// Начальное сообщение на дисплее
updateDisplay();
// Начальное сообщение в последовательный порт
Serial.println("System started");
Serial.println("Waiting for D7 or D4 signal...");
Serial.println("D7 HIGH - increase counter");
Serial.println("D4 HIGH - decrease counter");
}
void loop() {
// Проверяем состояние пина D7 (увеличение счетчика)
if (digitalRead(INCREASE_PIN) == HIGH) {
increaseMode = true;
decreaseMode = false;
}
// Проверяем состояние пина D4 (уменьшение счетчика)
if (digitalRead(DECREASE_PIN) == HIGH) {
decreaseMode = true;
increaseMode = false;
}
// Если оба пина низкие - останавливаем счетчик
if (digitalRead(INCREASE_PIN) == LOW && digitalRead(DECREASE_PIN) == LOW) {
increaseMode = false;
decreaseMode = false;
}
// Получаем текущее время
unsigned long currentMillis = millis();
// Проверяем, прошло ли 500 мс с последнего обновления
if (currentMillis - previousMillis >= interval) {
// Сохраняем время последнего обновления
previousMillis = currentMillis;
// Проверяем режим увеличения счетчика
if (increaseMode) {
// Увеличиваем счетчик на 1
counter++;
// Включаем красный светодиод на 100 мс
digitalWrite(RED_LED_PIN, HIGH);
// Обновляем дисплей
updateDisplay();
// Выводим значение счетчика в последовательный порт
Serial.print("Counter increased: ");
Serial.println(counter);
// Ждем 100 мс (время горения светодиода)
delay(100);
// Выключаем красный светодиод
digitalWrite(RED_LED_PIN, LOW);
}
// Проверяем режим уменьшения счетчика
if (decreaseMode) {
// Уменьшаем счетчик на 1
counter--;
// Включаем желтый светодиод на 100 мс
digitalWrite(YELLOW_LED_PIN, HIGH);
// Обновляем дисплей
updateDisplay();
// Выводим значение счетчика в последовательный порт
Serial.print("Counter decreased: ");
Serial.println(counter);
// Ждем 100 мс (время горения светодиода)
delay(100);
// Выключаем желтый светодиод
digitalWrite(YELLOW_LED_PIN, LOW);
}
}
}
// Функция для обновления информации на дисплее
void updateDisplay() {
// Очищаем дисплей
lcd.clear();
// Выводим заголовок на первую строку
lcd.setCursor(0, 0);
lcd.print("Counter: ");
lcd.print(counter);
// Выводим текущий режим на вторую строку
lcd.setCursor(0, 1);
if (increaseMode) {
lcd.print("Mode: INCREASE");
} else if (decreaseMode) {
lcd.print("Mode: DECREASE");
} else {
lcd.print("Mode: STOPPED");
}
}