декоративная подсветка

Andreyv
Offline
Зарегистрирован: 17.11.2015

пытаюсь сделать контроллер управления освещением. в планах

1. при нажатии на кнопку энкодера зажигается белый

2. при повороте энкодера сначала загорается красный на 100%,  (255-0-0). далее

        1) Наращивается зеленый цвет 255-1-0, 255-2-0 ... 255-255-0.

        2) Уменьшается красный цвет 254-255-0, 253-255-0 ... 0-255-0.

        3) Наращивается синий цвет 0-255-1, 0-255-2 ... 0-255-255.

        4) Уменьшается зеленый цвет 0-254-255, 0-253-255 ... 0-0-255.

        5) Наращивается красный цвет 1-0-255, 2-0-255 ... 255-0-255.

        6) Уменьшается синий цвет 255-0-254, 255-0-253 ... 255-0-0

и так далее по кругу. при нажатии на кнопку энкодера все выключается. энкодер на 24 импульса\оборот, хотелось бы чтобы весь сценарий проходил за 5-6 оборотов энкодера. точно так же все должно работать с пульта, с любого места программы. есть два скетча. первый управление яркостью одного светодиода энкодером, второй управление RGB светодиодом ардуиной. объединить толком не получается. поможете?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

выкладывайте что есть из кода (только с правильным оформлением), там видно будет где копаться.

Andreyv
Offline
Зарегистрирован: 17.11.2015

спасибо. вот собственно пока все что есть. при повороте энкодера зажигается красный на 100%, далее плавное увеличение зеленого до 100%, далее плавное уменьшение красного до 0 и сразу включение 100%. а как его остановить на 0 не пойму.

/*
** Энкодер
** Для управлением яркостью LED используется энкодер Sparkfun
*/

int brightnessRED = 0;    	// яркость LED, начинаем с 0
int brightnessGREEN = 0;        // яркость LED, начинаем с 0
int brightnessBLUE = 0;         // яркость LED, начинаем с 0
int start = 255;
int fadeAmount = 10;    	// шаг изменения яркости LED 10
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 7;  		// pin 7
const int pin_B = 8;  		// pin 8
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
int REDpin = 9;                // pin 9 ШИМ
int GREENpin = 10;             // pin 10 ШИМ
int BLUEpin = 11;              // pin 11 ШИМ

void setup()  {
  
  pinMode(9, OUTPUT);		  // устанавливаем pin 9 как выход
  pinMode(10, OUTPUT);            // устанавливаем pin 10 как выход
  pinMode(11, OUTPUT);            // устанавливаем pin 11 как выход
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  digitalWrite(pin_A, HIGH); //подключаем подтягивающий резистор
  digitalWrite(pin_B, HIGH); //подключаем подтягивающий резистор
  currentTime = millis();
    loopTime = currentTime; 
} 

void loop()  {
  currentTime = millis();
  if(currentTime >= (loopTime + 5)){	// проверяем каждые 5мс (200 Гц)
    encoder_A = digitalRead(pin_A);    	// считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);    	// считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){	 // если состояние изменилось с положительного к нулю
      if(encoder_B) {
        // выход В в полож. сост., значит вращение по часовой стрелке
        
        if(brightnessRED <=240) brightnessRED += start; 
        if(brightnessGREEN + fadeAmount <= 240) brightnessGREEN += fadeAmount;
        if(brightnessGREEN >= 240) brightnessRED -= fadeAmount;
    }                          
}
encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла 
    
    analogWrite(9, brightnessRED);   // устанавливаем яркость на 9 ножку
   analogWrite(10, brightnessGREEN);
   analogWrite(11, brightnessBLUE);
    loopTime = currentTime;
  }
}