Немного прокомментировал, чтоб легче было разобраться, что не понятно, спрашивайте
(красным выделил переменные, которые можете изменять, остальные служебные)
int current_mode = 1; //Переменная, показывающая к какому параметру привязан потенциометр, может быть 1, 2, 3, которые соотв. "красному", "желтому" и "зеленому"
boolean change = 0; // Флаг, показывающий, что мы находимся в режиме изменения привязки потенциометра, 1-в режиме, 0-не в режиме
float change_last_time = 0; // для засечки 3 секундного таймера выхода из режима изменения привязки
int x=0; //Переменная, в которой храним считанные показания потенциометра
int y = 0; //Переменная, в которой храним считанные показания цифрового входа кнопки, 0 или 1, нажата или нет
float y_last_time = 0; //Для засечки таймера
[color=red]
int led_red = 1;[/color] //Наша главная "красная" переменная, к которой будем в дальнейшем привязывать исполняющие таймеры
boolean led_red_flag = 0; //Флаг для мигания
int led_red_current = 0; //Порядковый номер текущего "мига"
float led_red_last_time = 0; //для засечки таймера
[color=red]int led_green = 1; [/color] // Главная "зеленая" переменная
boolean led_green_flag = 0; // Далее все аналогично, как и у красной
int led_green_current = 0;
float led_green_last_time = 0;
[color=red]int led_blue = 1; [/color] //Главная "желтая" переменная, назвал blue, но не важно
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;
[color=red]int led_freq = 200; [/color] //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
[color=red]int led_pause = 2000; [/color] //Пауза между сериями миганий в мс
void setup() {
pinMode(2, INPUT); //Пин для кнопки
pinMode(11, OUTPUT); //пины для диодов
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(A5, INPUT); //пин для потенциометра
}
void loop() {
if(!change){ //если не находимся в режиме смены привязки, значит меняем главные переменные
x = analogRead(A5);
if (current_mode == 1){ led_red = (int)(x/100) + 1;} //Меняем переменную, в зависимости от текущей привязки
if (current_mode == 2){ led_green = (int)(x/100) + 1;} //Вот здесь важная формула, потенциометр на аналоговый вход выдает нам значение от 0 до 1024
if (current_mode == 3){ led_blue = (int)(x/100) + 1;} //Делим на 100, округляем и добавляем 1 (чтоб нуля не было), получается переменная может принимать значения
// от 1 до 11.
}
if(change && (millis()-change_last_time)>3000){ //Это момент выхода из режима привязки, обнуляются служебные переменные диодов, выключаются
change = 0;
led_green_current = 0;
led_red_current = 0;
led_blue_current = 0;
led_red_flag = 0;
digitalWrite(11, 0);
led_green_flag = 0;
digitalWrite(12, 0);
led_blue_flag = 0;
digitalWrite(13, 0);
}
if((millis()-y_last_time)>200){ //Обработка нажатия на кнопку, добавил небольшой таймер 200мс, чтоб убрать "дребезг" - множественное срабатывание, кнопка будет срабатывать только если ее немного подержать (200мс)
y = digitalRead(2); //читаем кнопочный выход
if (y>0){ //если кнопка нажата
current_mode++; //инкрементируем текущий режим
if(current_mode > 3) {current_mode = 1;} //если получилось 4, то возвращаемся на 1
change = 1; //объявляем режим смены привязки
change_last_time = millis(); //засекаем для 3-секундного таймера выхода из режима смены
digitalWrite(11, 0); //выключаем все диоды
digitalWrite(12, 0);
digitalWrite(13, 0);
if (current_mode == 1){ digitalWrite(11, 1);} //зажигаем только тот диод, к которому привязан потенциометр
if (current_mode == 2){ digitalWrite(12, 1);}
if (current_mode == 3){ digitalWrite(13, 1);}
}
y_last_time = millis();
}
//Далее идут три блока моргания для каждого диода, они идентичны
if (!change && (millis()-led_red_last_time)>led_freq){ //Если не находимся в режиме смены привязки и время моргнуть наступило
led_red_flag = 1-led_red_flag; //Инвертируем флаг текущего состояния диода, если было 0, стало 1, было 1, стало 0
digitalWrite(11, led_red_flag); //Включаем или выключаем диод в зависимости в текущего состояния флага
led_red_last_time = millis();
led_red_current++; //инкрементируем текущий порядковый номер "мига"
if (led_red_current > (led_red*2-1)){ //если текущий порядковый номер "мига" превысил главную переменную, здесь идет умножение на 2, т.к. текущих мигов у нас будет в 2 раза больше (1для включения, 1 для выключения).
led_red_current = 0; //обнуляем его
led_red_last_time = millis() + (led_pause-led_freq);//делаем засчеку для следующего мига, но уже добавляем паузу
led_red_flag = 0; //ставим флаг в 0, т.к. в начале следующего цикла он инвертируется и станет 1
}
}
if (!change && (millis()-led_green_last_time)>led_freq){
led_green_flag = 1-led_green_flag;
digitalWrite(12, led_green_flag);
led_green_last_time = millis();
led_green_current++;
if (led_green_current > (led_green*2-1)){
led_green_current = 0;
led_green_last_time = millis() + (led_pause-led_freq);
led_green_flag = 0;
}
}
if (!change && (millis()-led_blue_last_time)>led_freq){
led_blue_flag = 1-led_blue_flag;
digitalWrite(13, led_blue_flag);
led_blue_last_time = millis();
led_blue_current++;
if (led_blue_current > (led_blue*2-1)){
led_blue_current = 0;
led_blue_last_time = millis() + (led_pause-led_freq);
led_blue_flag = 0; }
}
}[\code]