d5a9b7bd7b92ff4b33160b1d0377b695
 
Давайте научимся управлять RGB светодиодной лентой при помощи поворотного энкодера, ведь они будто созданы друг для друга). Энкодер будем использовать тот который имеет на своём борту ещё и кнопку, при помощи него мы будем переключаться на управление цветом или яркостью.

d5a9b7bd7b92ff4b33160b1d0377b695

Давайте научимся управлять RGB светодиодной лентой при помощи поворотного энкодера, ведь они будто созданы друг для друга). Энкодер будем использовать тот который имеет на своём борту ещё и кнопку, при помощи него мы будем переключаться на управление цветом или яркостью.
И так для реализации этой задачи нам потребуется, любая ARDUINO, Поворотный энкодер на (алиэспрес KY-040), RGB светодиод или лента , и если вы хотите управлять мощными светодиодами или лентами то вам потребуются моссфеты, я использую STP16NF06 они достаточно мощные, держат ток до 16А и не бояться напряжения до 60В.
 
 

Вложения:
ФайлОписаниеРазмер файла:СкачиванияСоздано
Скачать этот файл (EEPROM2.zip)Библиотека EEPROM2Библиотека для записи переменных типа float в EEPROM3 kB302016-05-02 12:13
Скачать этот файл (rgb_encoder.ino)Скетч для ARDUINOСкетч для arduino, рабочая версия.6 kB302016-05-02 12:31

Скетчь ниже демонстрационный!

//GENMC.ru 

#include EEPROM2.h //подключаем библиотеку EERPOM2 "не входит в стандартный пакет ардуино!!!"
#include EEPROM.h //подключаем библиотеку EERPOM
#define BRT_pin  5              // пин 5 вывод яркости
#define BTN_pin  8              // пин 8 кнопка энкодера
#define RED_pin  9              // пин 9 крсный диод
#define GRN_pin 10              // пин 10 зеленый диод
#define BLE_pin 11              // пин 11 синий диод
byte KNOP = EEPROM.read(2);     // ячейка памяти для кнопки
float brightness;               // переменная для яркости
float fadeAmount = 0.2;         // шаг изменения яркости LED
byte color = EEPROM.read(22);   // ячейка памяти для цвета
float fadeColor = 2;            // шаг изменения цвета LED


const int pin_A = 7;            // pin 7
const int pin_B = 6;            // pin 6
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);            //Запишем в память 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();            //запускаем таймер для сохранения в EEPROM
         if(brightness + fadeAmount <= 10&&EEPROM.read(2)==0){brightness += fadeAmount;}              
         if(color + fadeColor <= 75&&EEPROM.read(2)==1){color += fadeColor; } 
           }
           else {
               savemillis = millis();     //запускаем таймер для сохранения в EEPROM       
               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(2));
    Serial.println(BTN_pin);
    
    ////////Обработка цвета RGB светодиода//////////////
    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)  //если прошло больше 3 секунд после ругулировки
      {
       EEPROM_write(10, brightness);                 //пишем в память значение яркости
       EEPROM.write(22, color);                      //и значение цвета
       savemillis = 0;                               //сбрасываем на 0
      }


 //////Выбор регулировки цвет яркость,  0 яркость   1  цвет ///////
    if(digitalRead(BTN_pin)==LOW&&EEPROM.read(2)==0) //проверяем кнопку на нажатие и наличие нуля в памяти
      {EEPROM.write(2,1);                            //если кнопка нажата и в памяти 0 то пишем в память 1
       delay(1000);  }                               //делаем задержку чтоб не скакало на 0 и 1
       
    if(digitalRead(BTN_pin)==LOW&&EEPROM.read(2)==1) //проверяем кнопку на нажатие и наличие еденицы в памяти
      {EEPROM.write(2,0);                            //если кнопка нажата и в памяти 1 то пишем в память 0
       delay(1000);   }                              //делаем задержку чтоб не скакало на 0 и 1

//////ИНДИКАЦИЯ на светодиоде 13 АРДУИНО/////////
      //если горит выбран режим регулировки цвета
      if(EEPROM.read(2)==1)      //проверяем на наличие еденицы в памяти
      {digitalWrite(13,HIGH);}   //если есть еденица включаем светодиод
      
      //если не горит выбран режим регулировки яркости
      if(EEPROM.read(2)==0)       //проверяем на наличие нуля в памяти
      {digitalWrite(13,LOW);}     //если есть ноль выключаем светодиод
 
}
}