Энкодер

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

здравствуйте! Возник такой проект, управление RGB подсветкой при помощи энкодера, подскажите пожалуйста, какие статьи почитать, и возможно ли это?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Возможно всё при понимании физики процесса. Сначала научитесь управлять RGB подсветкой без энкодера, чисто программно. Потом почитайте что такое энкодер и как он работает. Научитесь просто считывать энкодер, без управления RGB посдветкой. Потом объедините свои знания по RGB подствеке и энкодеру.

P.S. Гугл много чего знает, не стесняйтесь у него спрашивать ;-) 

https://www.google.com/webhp?ion=1&espv=2&ie=UTF-8#q=arduino%20encoder

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

Нашёл этот скетч, только теперь не знаю, как при помощи кнопки сделать переключение цветов

int brightness = 120; // яркость LED, начинаем с половины

int fadeAmount = 10; // шаг изменения яркости LED

unsigned long currentTime;

unsigned long loopTime;

const int pin_A = 12; // pin 12

const int pin_B = 11; // pin 11

unsigned char encoder_A;

unsigned char encoder_B;

unsigned char encoder_A_prev=0;

void setup() { // declare pin 9 to be an output:

pinMode(9, OUTPUT); // устанавливаем pin 9 как выход

pinMode(pin_A, INPUT);

pinMode(pin_B, INPUT);

currentTime = millis();

loopTime = currentTime; }

void loop() {

currentTime = millis();

if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)

encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера

encoder_B = digitalRead(pin_B); // считываем состояние выхода А энкодера

if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю

if(encoder_B) { // выход В в полож. сост., значит вращение по часовой стрелке

// увеличиваем яркость, не более чем до 255

if(brightness + fadeAmount <= 255) brightness += fadeAmount; }

else { // выход В в 0 сост., значит вращение против часовой стрелки

// уменьшаем яркость, но не ниже 0

if(brightness - fadeAmount >= 0) brightness -= fadeAmount; }

}

encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла

analogWrite(9, brightness); // устанавливаем яркость на 9 ножку

loopTime = currentTime; }

}

 

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

только с этим скетчем проблемы

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

_A_r_d_u_i_n_o пишет:

Нашёл этот скетч, только теперь не знаю, как при помощи кнопки сделать переключение цветов

Этот скетч расчитан на один светодиод (не RGB). Вы знаете, как меняется цвет в RGB светодиоде?

И что Вы подразумеваете под RGB подсветкой - несколько светодиодов разного цвета, простые RGB светодиоды, цифровые RGB светодиоды типа WS2812?

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

нашёл другую работу, загрузил скетч, но не пойму, как подключать светодиодhttp://genmc.ru/instruktsii-i-uroki/rgb-lenta-i-povortonyj-enkoder

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

не, имеется ввиду светодиоды разных цветов

 

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

простые rgb

 

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

_A_r_d_u_i_n_o пишет:

нашёл другую работу, загрузил скетч, но не пойму, как подключать светодиодhttp://genmc.ru/instruktsii-i-uroki/rgb-lenta-i-povortonyj-enkoder

и подскажите пожалуйста вообще всё подключение

 

 

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

буду очень благодарен, просто давно ардуино не использовал

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

_A_r_d_u_i_n_o пишет:

Нашёл этот скетч, только теперь не знаю, как при помощи кнопки сделать переключение цветов

Блин, Вам что знающий человек сказал? Скетчи искать или "Сначала научитесь управлять RGB подсветкой без энкодера, чисто программно. Потом почитайте что такое энкодер и как он работает. Научитесь просто считывать энкодер, без управления RGB посдветкой. Потом объедините свои знания по RGB подствеке и энкодеру".

Делайте, что Вам говорят и всё у Вас получится.

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

сорри, просто нужно очень быстро сделать, а времени нет, подскажите пожалуйста в этом скетче за что отвечаю пины BRT и BTN




#include <EEPROM2.h>
#include <EEPROM.h>
#define BRT_pin  5
#define BTN_pin  8
#define RED_pin  9
#define GRN_pin 10
#define BLE_pin 11
byte KNOP = EEPROM.read(2);    // ячейка памяти для кнопки
float brightness;               // переменная для яркости
float fadeAmount = 0.2;        // шаг изменения яркости LED
byte color = EEPROM.read(22);
float fadeColor = 2;
const int pin_A = 7;       // pin 12
const int pin_B = 6;       // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
uint32_t savemillis = 0;

 
void setup()  {

  Serial.begin(9600);
  EEPROM_read(10,brightness);              // переменная для яркости
  digitalWrite(BTN_pin, 1);     // подтяжка кнопки энкодера
  pinMode(RED_pin, OUTPUT);     //красный светодиод
  pinMode(GRN_pin, OUTPUT);     //зеленый светодиод
  pinMode(BLE_pin, OUTPUT);     //синий светодиод
  pinMode(BRT_pin, OUTPUT);     //шим пин для других светодиодов
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  EEPROM.write(2,0);
    
  } 
 
void loop()  {
   
  { encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){    // если состояние изменилось с положительного к нулю
      if(encoder_B) 
           {
         savemillis = millis();
         if(brightness + fadeAmount <= 10&&EEPROM.read(2)==0){brightness += fadeAmount;}              
         if(color + fadeColor <= 75&&EEPROM.read(2)==1){color += fadeColor; } 
           }
           else {
               savemillis = millis();
               if(brightness - fadeAmount >= 0&&EEPROM.read(2)==0){brightness -= fadeAmount;}               
               if(color - fadeColor >= 0&&EEPROM.read(2)==1){color -= fadeColor;}
               
                }   
   
 
    }   
    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла 

    Serial.println(EEPROM.read(10));
    Serial.println(EEPROM.read(22));
    byte red = 0, grn = 0, ble = 0;
    if(color >= 0 && color < 25) {red = 25-color,  grn = color, ble = 0;}
    else if(color >= 25 && color < 50){ red = 0,  grn = 50-color, ble = color-25;}
    else {red = color-50, grn = 0, ble = 75-color;}
  
             
         analogWrite(RED_pin,red*brightness);
         analogWrite(GRN_pin,grn*brightness);
         analogWrite(BLE_pin,ble*brightness);
         analogWrite(BRT_pin,brightness*25);
 
     
 } 
     //Сохранение яркости и цвета
       if(savemillis && millis()-savemillis > 3000)
      {
       EEPROM_write(10, brightness);
       EEPROM.write(22, color);
       
       savemillis = 0;
      }


 //Выбор цвет яркость  0 яркость   1  цвет
    if(digitalRead(BTN_pin)==LOW&&EEPROM.read(2)==0)
      {EEPROM.write(2,1);    //цвет
       delay(1000);  }
       
    if(digitalRead(BTN_pin)==LOW&&EEPROM.read(2)==1)
      {EEPROM.write(2,0);    //яркость
       delay(1000);   }

      if(EEPROM.read(2)==1)     //цвет
      {digitalWrite(13,HIGH);}

      if(EEPROM.read(2)==0)     //яркость
      {digitalWrite(13,LOW);}
 
}
T.Rook
Offline
Зарегистрирован: 05.03.2016

Внимательно читаем:

  digitalWrite(BTN_pin, 1);     // подтяжка кнопки энкодера
  pinMode(RED_pin, OUTPUT);     //красный светодиод
  pinMode(GRN_pin, OUTPUT);     //зеленый светодиод
  pinMode(BLE_pin, OUTPUT);     //синий светодиод
  pinMode(BRT_pin, OUTPUT);     //шим пин для других светодиодов

25  строка, BTN - кнопка энкодера

29  строка, BRT - шим для светодиодов.

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

 

Упс... не заметил, что "нужно очень быстро" было пару дней назад :)