Good afternoon, please advise!
The code is designed for three pieces of tape with 12 in each.
two pieces for the players and one for demonstrating the sequence to be memorized.
at the start 12 LEDs turn on, the sequence to be remembered (4 colors: white, black, blue, red).
after 10 seconds the sequence is switched off
players by pressing keys must repeat the sequence (12 buttons and a piece of tape with 12 LEDs for each player)
the problem is that there was no tape 30 LEDs per meter, was used tape 60 LEDs per meter, what to change in the code so that 2, 4, 6, 8 and so on are not used, respectively the first button should control the first LED, the second the third and so on
#define NUM_LEDS 36 //количество светдиодов в ленте
#include "FastLED.h" //подключаем библиотеку для работы с WS2812
#define PIN 2 //указываем PIN к которому подключена лента
#define LIMIT 10 //пределы измерений напряжения с кнопки (analogRead)
#define BUTTON_RESET 9 //PIN кнопки перезапуска игры
#define TIME_DELAY 10000 //время на запоминание последовательности
//значения АЦП для каждой кнопки
int buttonAnalogVal[12] = {1023, 769, 610, 514, 440, 385, 341, 307, 279, 255, 236, 219};
byte led36[24]; //массив для хранения информации о цвете каждого светодиода
byte rowLed[12]; //массив для запоминания рандомных последовательностей светодиодов
bool checkButton = 0;
unsigned long timerLoop = 0;
bool playAllowed = 1;
CRGB leds[NUM_LEDS];
void setup()
{
FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness(100);
Serial.begin(9600);
pinMode(BUTTON_RESET, INPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A5, INPUT);
randomSeed(analogRead(A5));
playStart();
timerLoop = millis();
}
void loop()
{
if((millis() - timerLoop) >= 200) //каждые 200 мс проверяем кнопку (антидребезг)
{
timerLoop = millis();
if(digitalRead(BUTTON_RESET) == 1) //если кнопка нажата
{
if(checkButton == 0) //проверяем предыдущее состояние кнопки
{
//запускаем сравнение массивов игроков и компьютера
checkButton = 1;
playAllowed = 0;
compare();
}
else
{
//запускаем игру заново
checkButton = 0;
playAllowed = 1;
playStart();
}
}
if(playAllowed == 1)
{
//считываем кнопки
int analogButtonRight = analogRead(A1);
int analogButtonLeft = analogRead(A0);
//если заметили нажатие
if(analogButtonRight > 5)
{
byte reverse = 23;
for(int i = 0; i < 12; i++) //узнаем какую кнопку нажали и запоминаем цвет
{
if(((buttonAnalogVal[i] - LIMIT) < analogButtonRight) && (analogButtonRight < (buttonAnalogVal[i] + LIMIT)))
{
if(led36[i+12] < 3)
{
led36[i+12]++;
}
else
{
led36[i+12] = 0;
}
Serial.println("Кнопка: " + String(i) + " Состояние: " + String(led36[i+12]));
setColor(reverse, led36[i+12]); //передаем номер светодиода и его цвет
}
reverse--;
}
}
if(analogButtonLeft > 5)
{
for(int i = 0; i < 12; i++)
{
if(((buttonAnalogVal[i] - LIMIT) < analogButtonLeft) && (analogButtonLeft < (buttonAnalogVal[i] + LIMIT)))
{
if(led36[i] < 3)
{
led36[i]++;
}
else
{
led36[i] = 0;
}
Serial.println("Кнопка: " + String(i) + " Состояние: " + String(led36[i]));
setColor(i, led36[i]); //передаем номер светодиода и его цвет
}
}
}
}
}
}
void setColor(byte numLed, byte color) //функция включения светодиода в определенный цвет
{
switch(color)
{
case 0: leds[numLed].setRGB( 255, 255, 255); break; //белый
case 1: leds[numLed].setRGB( 255, 0, 0); break; //красный
case 2: leds[numLed].setRGB( 0, 0, 255); break; //синий
case 3: leds[numLed].setRGB( 0, 0, 0); break; //выкл.
case 4: leds[numLed].setRGB( 255,255,0); break; //желтый
default: leds[numLed].setRGB( 0, 0, 0); //по умолчанию - выкл.
}
FastLED.show();
}
void start(byte R, byte G, byte B) //стартовые бегущие огни
{
int j = 24;
for(int i = 0; i < 12; i++)
{
j--;
leds[i].setRGB( R, G, B);
leds[j].setRGB( R, G, B);
leds[i+24].setRGB( R, G, B);
FastLED.show();
delay(100);
leds[i].setRGB( 0, 0, 0);
leds[j].setRGB( 0, 0, 0);
leds[i+24].setRGB( 0, 0, 0);
FastLED.show();
}
}
void compare() //функция сравнения массивов двух игроков и компьютера
{
byte reverse = 23;
for(int i = 0; i < 12; i++)
{
setColor(i+24, rowLed[i]);
delay(1000);
if(led36[i] != rowLed[i])
{
setColor(i, 4);
}
if(led36[i+12] != rowLed[i])
{
setColor(reverse, 4);
}
reverse--;
}
}
void playStart() //функция начала игры
{
for(int i = 0; i < 24; i++)
{
led36[i] = 0; //обнуляем массив с предыдущими значениями светодиодов
}
start(255,0,0);
start(255,255,255);
start(0,0,255);
for(int i = 24; i < 36; i++) //включаем рандомную последовательность цветов светодиодов
{
byte randomLed = random(0,3);
rowLed[i-24] = randomLed;
setColor(i, randomLed);
delay(500);
}
unsigned long timerPrev = millis();
while((millis() - timerPrev) < TIME_DELAY) //ждем 10 сек на запоминание цветов
{
if(digitalRead(BUTTON_RESET) == 1) //если во время этого нажали на кнопку - запускаем игру заново
{
playStart();
}
}
for(int i = 24; i < 36; i++) //гасим верхние светодиоды
{
setColor(i, 3);
}
for(int i = 0; i < 24; i++) //включаем белый цвет на светодиодах игроков
{
setColor(i, 0);
}
}

