const int BLED=9;//подключаем катод синего к контакту 9
const int GLED=10;//подключаем катод зеленого к контакту 10
const int RLED=11;//подключаем катод красного к контакту 11
const int BUTTON=2;//кнопку подключаем к контакту 2
boolean lastButton=LOW;//предыдущее состояние кнопки
boolean currentButton=LOW;//текущее состояние кнопки
int ledMode=0;//переключаемся в цикле между состояниями светодиодов
void setup()
{
  pinMode (BLED,OUTPUT);//режим вывода синего
  pinMode (GLED,OUTPUT);//режим вывода зеленого
  pinMode (RLED,OUTPUT);//режим вывода красного
  pinMode (BUTTON,INPUT);//режим ввода для кнопки (не обязательно)
}
/*функция устранения дребезга контактов, передаем ей значение предыдущего состояния кнопки и получаем от нее текущее значение состояния кнопки с устраненным дребезгом */
boolean debounce(boolean last)
{
  boolean current=digitalRead(BUTTON);//считываем текущее состояние кнопки
  if (last !=current)//если оно иное, чем предыдущее
  {
    delay(5);//ждем 5мс
    current=digitalRead(BUTTON);//считываем снова
  }
  return current;//возвращаем текущее состояние кнопки
} 
/*выбор состояния светодиода, передаем функции номер состояния светодиода и устанавливаем его соответсвенно. Обратите внимание на то, что поскольку наш трехцветный светодиод имеет общи анод, чтобы включить составляющие его светодиоды, на их катоды нужно подавать изкий уровень LOW */
 void setMode(int mode)
 {
  //красный
  if (mode==1)
  {
    digitalWrite(RLED,LOW);
    digitalWrite(GLED,HIGH);
    digitalWrite(BLED,HIGH);
  }
  //зелены
  else if (mode==2)
  {
    digitalWrite(RLED,HIGH);
    digitalWrite(GLED,LOW);
    digitalWrite (BLED,HIGH);
  }
  //синий
  else if (mode==3)
  {
    digitalWrite (RLED,HIGH);
    digitalWrite (GLED,HIGH);
    digitalWrite (BLED,LOW);
  }
  //фиолетовый (красный + синий)
  else if (mode==4)
  {
    analogWrite(RLED,127);
    analogWrite(GLED,255);
    analogWrite(BLED,127);
  }
  //зеленовато-голубой (синий+зеленый)
  else if (mode==5)
  {
    analogWrite(RLED,255);
    analogWrite(GLED,127);
    analogWrite(BLED,127);
  }
  //оранжевый (зеленый+красный)
  else if (mode==6)
  {
    analogWrite(RLED,127);
    analogWrite(GLED,127);
    analogWrite(BLED,255);
  }
  //белый (зеленый+красный+синий)
  else if (mode==7)
  {
    analogWrite(RLED,170);
    analogWrite(GLED,170);
    analogWrite(BLED,170);
  }
  //отключен (mode=0)
  else
  {
    digitalWrite(RLED,LOW);
    digitalWrite(GLED,LOW);
    digitalWrite(BLED,LOW);
  }
 }

void loop()
{
  currentButton=debounce(lastButton);//считываем состояние кнопки
                                     //с устраненным дребезгом
 if (lastButton==LOW && currentButton==HIGH)//если кнопка нажата
 {
  ledMode++;   //инкремируем значение LED                                 
 }
 lastButton=currentButton;//сбрасываем значение кнопки
                          //если прошли по всему циклу цветовых состояний
                          //обнуляем счетчик
 if (ledMode==8) ledMode=0;
 setMode(ledMode);//  изменяем значение состояния светодиода                       
}

