#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес I2C и размеры дисплея
#define RED_PIN 6
#define GREEN_PIN 5
#define BLUE_PIN 4
#define ENCODER_A 2
#define ENCODER_B 3
#define BUTTON_PIN 8
volatile int encoderPos = 0;
int currentColor = 0; // 0 - RED, 1 - GREEN, 2 - BLUE
int colorValues[3] = {0, 0, 0};
void setup() {
lcd.begin(16, 2);
lcd.backlight();
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(ENCODER_A, INPUT);
pinMode(ENCODER_B, INPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_A), updateEncoder, CHANGE);
updateDisplay();
}
void loop() {
// Проверка состояния кнопки
if (digitalRead(BUTTON_PIN) == LOW) {
delay(50); // Небольшая задержка для устранения дребезга
if (digitalRead(BUTTON_PIN) == LOW) {
currentColor = (currentColor + 1) % 3; // Переключение между R, G и B
updateDisplay();
while (digitalRead(BUTTON_PIN) == LOW); // Ожидание отпускания кнопки
}
}
// Изменение значения цвета при вращении энкодера
if (encoderPos != 0) {
int change = (encoderPos > 0) ? 15 : -15; // Изменяем на 5
colorValues[currentColor] = constrain(colorValues[currentColor] + change, 0, 255); // Ограничиваем значения от 0 до 255
setColor(colorValues[0], colorValues[1], colorValues[2]);
encoderPos = 0; // Сбрасываем позицию энкодера
updateDisplay();
}
}
void updateEncoder() {
int stateA = digitalRead(ENCODER_A);
int stateB = digitalRead(ENCODER_B);
if (stateA == stateB) {
encoderPos = 1; // Вращение по часовой стрелке
} else {
encoderPos = -1; // Вращение против часовой стрелки
}
}
void updateDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
// Отображаем значения цветов
lcd.print("R:");
lcd.print(colorValues[0]);
lcd.print(" G:");
lcd.print(colorValues[1]);
lcd.setCursor(0, 1);
lcd.print("B:");
lcd.print(colorValues[2]);
}
void setColor(int red, int green, int blue) {
analogWrite(RED_PIN, red);
analogWrite(GREEN_PIN, green);
analogWrite(BLUE_PIN, blue);
}