#include <Adafruit_NeoPixel.h>
#include <Encoder.h>
#include <Button.h>
const int LED_PIN = 6;
const int NUM_LEDS = 12;
const int ENCODER_CLK_PIN = 4; // Подключите CLK энкодера к D4
const int ENCODER_DT_PIN = 3; // Подключите DT энкодера к D3
const int ENCODER_BUTTON_PIN = 2; // Подключите кнопку энкодера к D2
boolean lastButton1 = LOW;
boolean currentButton1 = LOW;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel circle1 = Adafruit_NeoPixel(16, 10, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel circle2 = Adafruit_NeoPixel(16, 9, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel circle3 = Adafruit_NeoPixel(16, 8, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel circle4 = Adafruit_NeoPixel(16, 7, NEO_GRB + NEO_KHZ800);
Encoder encoder(ENCODER_CLK_PIN, ENCODER_DT_PIN);
Button encoderButton(ENCODER_BUTTON_PIN);
int lastEncoderPos = 0;
int currentLED = 0;
int direction = 1; // Направление вращения энкодера, 1 - по часовой стрелке, -1 - против часовой стрелки
unsigned long timing1 = 0;
unsigned long timing2 = 0;
unsigned long timing3 = 0;
unsigned long timing4= 0;
unsigned long timing5= 0;
bool buttonMode = LOW;
bool blinkMode = LOW;
bool ledMode = LOW;
bool redMode = LOW;
bool greenMode = LOW;
bool modeTwo = LOW;
int workMode = 0;
int myInts[] = {13, 14, 15, 16};
int k = -1;
int b = 255;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT);
pinMode(4, INPUT);
strip.begin();
startupAnimation();
strip.setBrightness(255);
strip.show();
encoderButton.begin();
Serial.begin (9600);
circle1.begin();
circle1.setBrightness(255);
circle1.show();
circle2.begin();
circle2.setBrightness(255);
circle2.show();
circle3.begin();
circle3.setBrightness(255);
circle3.show();
circle4.begin();
circle4.setBrightness(255);
circle4.show();
delay (200);
}
void loop() {
if ((millis() - timing2)>=300)
{
timing2 = millis();
int encoderPos = encoder.read();
encoderButton.read();
int buttonVal = digitalRead(2);
Serial.println (workMode);
if (encoderPos != lastEncoderPos) {
workMode = 0;
updateLEDs(encoderPos);
lastEncoderPos = encoderPos;
}
if ((buttonVal == LOW)&&(buttonMode == LOW)){
timing1 = millis();
buttonMode = HIGH;
}
if ((buttonMode == HIGH)&&((millis()-timing1) >= 2000))
{
workMode = 1;
}
if (buttonVal == HIGH){
buttonMode = LOW;
}
if (workMode == 1)
{
Serial.println ("ura");
strip.setPixelColor(currentLED, strip.Color(255, 0, 0)); // Красный цвет
k = k +1;
if (currentLED == 0)
{
myInts[0] = currentLED;
}
if (currentLED == 3)
{
myInts[1] = currentLED;
}
if (currentLED == 6)
{
myInts[2] = currentLED;
}
if (currentLED == 9)
{
myInts[3] = currentLED;
}
strip.show();
workMode = 2;
}
if ((myInts[0] == currentLED)||(myInts[1] == currentLED)||
(myInts[3] == currentLED)||(myInts[4] == currentLED))
{
redMode = HIGH;
}
}
}
void startupAnimation() {
// Один круг белых светодиодов по часовой стрелке
for (int i = 0; i < NUM_LEDS; ++i) {
strip.setPixelColor(i, strip.Color(255, 255, 255)); // Белый цвет
strip.show();
delay(40);
}
// Поддержание белых светодиодов включенными в течение короткого времени
delay(1000);
// Выключение светодиодов с плавным затуханием
for (int i = 255; i > 0; i -= 5) {
for (int j = 0; j < NUM_LEDS; ++j) {
strip.setPixelColor(j, strip.Color(i, i, i));
}
strip.show();
delay(40);
}
strip.fill(strip.Color(0, 0, 0), 0, NUM_LEDS);
strip.show();
}
void updateLEDs(int encoderPos) {
int delta = encoderPos - lastEncoderPos;
int stepSize = 3; // Пропускаем два светодиода после каждого шага
// Определяем направление вращения энкодера
direction = (delta > 0) ? 1 : -1;
// Обновляем текущий светодиод
currentLED = (currentLED + stepSize * direction + NUM_LEDS) % NUM_LEDS;
strip.fill(strip.Color(0, 0, 0), 0, NUM_LEDS);
redMode = LOW;
greenMode = LOW;
for (int i = 0; i <= 15; i++) {
circle1.setPixelColor(i, 0, 0, 0);
circle1.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
for (int i = 0; i <= 15; i++) {
circle2.setPixelColor(i, 0, 0, 0);
circle2.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
for (int i = 0; i <= 15; i++) {
circle3.setPixelColor(i, 0, 0, 0);
circle3.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
for (int i = 0; i <= 15; i++) {
circle4.setPixelColor(i, 0, 0, 0);
circle4.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
if ((currentLED == myInts[0])||(currentLED == myInts[1])||(currentLED == myInts[2])||(currentLED == myInts[3]))
{
strip.setPixelColor(currentLED, strip.Color(255, 0, 0)); // красный цвет
redMode = HIGH;
greenMode = LOW;
strip.setBrightness(255);
}
else
{
strip.setPixelColor(currentLED, strip.Color(0, 255, 0)); // Зелёный цвет
redMode = LOW;
greenMode = HIGH;
}
strip.setBrightness(255);
strip.show();
if ((myInts[0] == currentLED)||(myInts[1] == currentLED)||
(myInts[3] == currentLED)||(myInts[4] == currentLED))
{
redMode = HIGH;
}
if (currentLED == 0)
{
if (redMode == HIGH)
{
for (int i = 0; i <= 15; i++) {
circle1.setPixelColor(i, 255, 0, 0);
circle1.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
}
if (greenMode == HIGH)
{
for (int i = 0; i <= 15; i++) {
circle1.setPixelColor(i, 0, 255, 0);
circle1.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
}
}
if (currentLED == 3)
{
if (redMode == HIGH)
{
for (int i = 0; i <= 15; i++) {
circle2.setPixelColor(i, 255, 0, 0);
circle2.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
}
if (greenMode == HIGH)
{
for (int i = 0; i <= 15; i++) {
circle2.setPixelColor(i, 0, 255, 0);
circle2.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
}
}
if (currentLED == 6)
{
if (redMode == HIGH)
{
for (int i = 0; i <= 15; i++) {
circle3.setPixelColor(i, 255, 0, 0);
circle3.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
}
if (greenMode == HIGH)
{
for (int i = 0; i <= 15; i++) {
circle3.setPixelColor(i, 0, 255, 0);
circle3.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
}
}
if (currentLED == 9)
{
if (redMode == HIGH)
{
for (int i = 0; i <= 15; i++) {
circle4.setPixelColor(i, 255, 0, 0);
circle4.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
}
if (greenMode == HIGH)
{
for (int i = 0; i <= 15; i++) {
circle4.setPixelColor(i, 0, 255, 0);
circle4.show(); // отправляем информацию на ленту
delay(5); // задержка для эффекта
}
}
}
}