Подсветка для энкодера (Arduino)

При вращении ручки энкодера ky-040 можно сделать добавить RGB подсветку при помощи светодиодного кольца.

RGB (на контроллере WS2812) кольца бывают разного размера с разным кол-вом светодиодов, для подсветки энкодера отлично подойдет светодиодное кольцо с восемью светодиодами.

Скетч разрабатывался для интеграции в проекты Arduino где используются энкодеры, например в электронных регуляторных громкости.

При вращении ручки энкодера загораются и гаснут светодиоды. Скетч отслеживает  установленный энкодером уровень значения  (от 0 до 79 значений), в зависимости от установленного значения светодиоды загораются с различным цветом, от синего и плавно переходящего в красный (при максимальном уровне).

#include <Adafruit_NeoPixel.h> // https://github.com/adafruit/Adafruit_NeoPixel.git
#include <Encoder.h>  // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
  Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, 6, NEO_GRB + NEO_KHZ800);// 8 LED, D6
  Encoder myEnc(9, 8);//CLK, DT
  unsigned long oldPosition  = -999,newPosition;
  int poz,data;
  #define KOL 79 // максимальное значение регулировки
 
void setup(){  
  OCR1A = 5000; TCCR1B |= (1 << WGM12)|(1 << CS10); TIMSK1 |= (1 << OCIE1A);
  strip.begin();Serial.begin(9600);
  pinMode(7,INPUT);
  strip.setBrightness(32);
  poz = data/8;
}
 
void loop(){ 
   if(digitalRead(7)==LOW){
    for(int i=0;i<8;i++){strip.setPixelColor(i, strip.Color(0, 50, 0));}strip.show();delay(300);
    for(int i=0;i<8;i++){strip.setPixelColor(i, strip.Color(0, 0, 0));}strip.show();}
 
   if (newPosition != oldPosition) {oldPosition = newPosition;
    data=data+newPosition;if(data>=0&&data<=KOL){poz=poz+newPosition;}myEnc.write(0);newPosition=0;
    Serial.println(data);}
 
    strip.setPixelColor(poz-1, strip.Color(0, 0, 0));
    strip.setPixelColor(poz, strip.Color(data, 0+data/10, KOL-data));
    strip.setPixelColor(poz+1, strip.Color(0, 0, 0)); 
 
  if(poz>7){poz=0;}if(poz<0){poz=poz+8;}
  if(data<0){data=0;}if(data>KOL){data=KOL;}
    strip.show();
}// LOOP
ISR (TIMER1_COMPA_vect){newPosition = myEnc.read()/4;}

Переменная data содержит уровень регулировки, в зависимости от назначения можно поменять максимальное значение регулировки энкодера.

RGB кольцо на контроллере W2812 питается от напряжения 5 В, выход D6 Arduino подключается ко входу DI светодиодного кольца.

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=1966#p1966

Comments

  1. не работает. постоянно горят пиксели зеленым цветом.
    на вращение энкодера не реагирует. проверил на 3 экземплярах энкодера.
    лента проверена — исправна. в чем ошибка?

    1. Горит зеленым — нажата кнопка энкодера. Кнопка энкодера инверсная, нажатие лог. 0
      Проверьте наличие подтягивающего резистора на +5В выходу SW. Если у Вас в энкодере подтяжка выхода SW к GND, то поправьте код:
      if(digitalRead(7)==LOW){
      замените на:
      if(digitalRead(7)==HIGH){

  2. Вот это прикольная задумка, возьму на заметку. Можно через задержку в несколько секунд сделать переход в режим плавной радуги по кругу.

Добавить комментарий

Войти с помощью: