Энкодер RGB контроллер

neospromiy
Offline
Зарегистрирован: 15.07.2013

Ребята всем првет.

Есть энкодер приведенный на картинке ниже, RGB лента и arduino, необходимо сделать следующее.

1 при повороте энкодера менялся цвет RGB светодиода по спектру.

2 при нажатии на энкодер переключался из режима смены цвета в режим управления яркостью, пр повторном нажатии возврощался обратно в режим управления яркостью.

3 сохранялся цвет RGB светодиода при отключении питания. 

Вот код который пытался сделать не получается. Данный скет контролирует только 1 светодиод, 3 не смог сделать


int brigRed = 0;       // яркость LED,
int fadeRed = 10;
 
int brigGreen = 0;       // яркость LED,
int fadeGreen = 10;    
  
int brigBlue = 0;       // яркость LED,
int fadeBlue = 10;      // шаг изменения яркости LED

unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 5;       // pэнкодер А
const int pin_B = 6;       // Энкодер Б
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char Red=0;
unsigned char Green=0;
unsigned char Blue=0;


 
void setup()  {
  Serial.begin(9600);
  
  pinMode(9, OUTPUT); 
 pinMode(10, OUTPUT);
 pinMode(11, 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);     // считываем состояние выхода B энкодера    
   
   
   
   
    
      if((!encoder_A) && (Red))
    
         {    // если состояние изменилось с положительного к нулю
       if(encoder_B) 
         {    // установим максимум 250
        if(brigRed + fadeRed <= 250) 
              // если условия соблюдаются то к  brigRed прибовляем fadeRed 
        brigRed += fadeRed;
         }   
        else      
            {  // установим минимум 0
            if(brigRed - fadeRed >= 0) 
               // если условия соблюдаются то от  brigRed отнмаем fadeRed 
            brigRed -= fadeRed;               
                    }              
            } 
            
             Red = encoder_A; 
            
    
   
     analogWrite(9, brigRed);




Serial.println(brigRed);


    loopTime = currentTime;
  }                       
}

Этот прмер гуляет строго по спектру но управляеться он просто в цикле for а не энкодером.

int REDpin = 9;
int GREENpin = 10;
int BLUEpin = 11;


void setup(){}


void loop(){
  for(int value = 0 ; value <= 255; value +=1) { 
    //яркость красного уменьшается
    analogWrite(REDpin, value);
    //яркость зеленого увеличивается
    analogWrite(GREENpin, 255-value);
    //синий не горит 
    analogWrite(BLUEpin, 255);
    //пауза
    delay(30);
  }


  for(int value = 0 ; value <= 255; value +=1) { 
    //красный не горит
    analogWrite(REDpin, 255);
    //яркость зеленого уменьшается
    analogWrite(GREENpin, value);
    //яркость синего увеличивается
    analogWrite(BLUEpin, 255-value);
    //пауза
    delay(30);
  }


  for(int value = 0 ; value <= 255; value +=1) { 
    //яркость красного увеличивается
    analogWrite(REDpin, 255-value);
    //зеленый не горит
    analogWrite(GREENpin, 255);
    //яркость синего уменьшается
    analogWrite(BLUEpin, value);
    //пауза
    delay(30);
  }
}

Задача как я понмаю не сложная но готов обсудить стоимость прошивки с тем кто сможет это написать.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Это даже не просто, а очень просто. На выходных буду с ребенком ардуинку мучать - сделаем. :)

neospromiy
Offline
Зарегистрирован: 15.07.2013

Спасибо! Я могу собрать железо, но програмироване для меня тёмный лес) так вот иногда сижу изуаю интересно но тяжеловато чтото дается.

neospromiy
Offline
Зарегистрирован: 15.07.2013

Забал сказать яркость тоже должна запомитаться при отключии птания)  

Хочу встроить эту штуку для контроля светодиодной лентой в машину.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

neospromiy пишет:

Забал сказать яркость тоже должна запомитаться при отключии птания)  

Хочу встроить эту штуку для контроля светодиодной лентой в машину.

Какая яркость? У Вас в примере управление по модели HSV (яркость постоянная, только цвет меняется). Цвет запомнить можно в EEPROM, конечно. Но если его запоминать при каждом изменении и крутить его будут постоянно, то EEPROMа на долго не хватит, надо тогда какую-то FRAM ставить.

neospromiy
Offline
Зарегистрирован: 15.07.2013

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

Ну так надо сделать както так чтобы при повороте ручки данные сразу в еепром не писались а скажем нет действий после каких то изменений с энкодером в течении 1-2 секунд записался в еепром, 

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Понятно

maksim
Offline
Зарегистрирован: 12.02.2012

Сохранение делайте после того как покрутили энкодер и в течении 3-х секунд его не крутят, а не при каждом изменении цвета (щелчке энкодера). В этом случае даже если менять цвет 100 раз в день, ЕЕПРОМ хватит на 3 года. И это только исходя из того, что атмел гарантирует 100000 перезаписей, на самом же деле негарантированный износ ячейк ЕЕПРОМ наступает примерно через 1000000 перезаписей. Так что сохранение, при измении цвета 100 раз в день, будет работать от 3 до 30 лет.

pcb
Offline
Зарегистрирован: 02.04.2015

maksim пишет:

И это только исходя из того, что атмел гарантирует 100000 перезаписей, на самом же деле негарантированный износ ячейк ЕЕПРОМ наступает примерно через 1000000 перезаписей.

Зависит от тех. процесса.

2ТС:У меня уже готовый проект есть, управляется с кнопки, без энкодера.

Связь: PCBADM на мэйлру

maksim
Offline
Зарегистрирован: 12.02.2012

pcb пишет:

maksim пишет:

И это только исходя из того, что атмел гарантирует 100000 перезаписей, на самом же деле негарантированный износ ячейк ЕЕПРОМ наступает примерно через 1000000 перезаписей.

Зависит от тех. процесса.

Что зависит? И от какого процесса?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

maksim пишет:

pcb пишет:

maksim пишет:

И это только исходя из того, что атмел гарантирует 100000 перезаписей, на самом же деле негарантированный износ ячейк ЕЕПРОМ наступает примерно через 1000000 перезаписей.

Зависит от тех. процесса.

Что зависит? И от какого процесса?


Макс , просто стыдно за тебя. Не знал разве что Атмел использует разные тех. процессы? До обеда один, после обеда другой, а по вторникам вообще баба Маня полы моет в лаборатории и епром сделаный в такой день выдерживает до миллиарда перезаписей.

pcb
Offline
Зарегистрирован: 02.04.2015

Puhlyaviy пишет:

До обеда один, после обеда другой, а по вторникам вообще баба Маня полы моет в лаборатории и епром сделаный в такой день выдерживает до миллиарда перезаписей.

Специалист микросхемотехники, примите таблетку и к Наполеону, он скучает.

maksim пишет:

Что зависит? И от какого процесса?

у атмела технормы 350/180/130 нметров.

кол-во перезаписей дано с учетом всего температурного диапазона и питающих напряжений.

тоесть при 200 тысячной перезаписи при пяти вольтах и 25 градусах, возможно успешно, но при малом напряжении и/или при минусе запись будут неудачны.

для разных версий может быть использован разный техпроцесс. также при одном процессе могу использоваться SLC или MLC.

maksim
Offline
Зарегистрирован: 12.02.2012

pcb пишет:

кол-во перезаписей дано с учетом всего температурного диапазона и питающих напряжений.

тоесть при 200 тысячной перезаписи при пяти вольтах и 25 градусах, возможно успешно, но при малом напряжении и/или при минусе запись будут неудачны.

Тут соглашусь, от температуры и напряжения зависит.

pcb пишет:

у атмела технормы 350/180/130 нметров.

для разных версий может быть использован разный техпроцесс. также при одном процессе могу использоваться SLC или MLC.

Хотите сказать, что можно купить, например, одну и ту же ATmega328P-UA произведенную по разным технологиям и различными ЕЕПРОМ - одноуровневыми или многоуровневыми?

pcb
Offline
Зарегистрирован: 02.04.2015

maksim пишет:
Хотите сказать, что можно купить, например, одну и ту же ATmega328P-UA произведенную по разным технологиям и различными ЕЕПРОМ - одноуровневыми или многоуровневыми?

Это вы говорите. Что я сказал, написано выше.

Атмел меняет процессы, например были 2313/A/V все они сделаны про разным процессам.

Что ТС собрался использовать я не в курсе, поэтому утверждение "1000000 перезаписей" считаю неуместной.

maksim
Offline
Зарегистрирован: 12.02.2012

pcb пишет:

maksim пишет:
Хотите сказать, что можно купить, например, одну и ту же ATmega328P-UA произведенную по разным технологиям и различными ЕЕПРОМ - одноуровневыми или многоуровневыми?

Это вы говорите. Что я сказал, написано выше.

Атмел меняет процессы, например были 2313/A/V все они сделаны про разным процессам.

Что ТС собрался использовать я не в курсе, поэтому утверждение "1000000 перезаписей" считаю неуместной.

Вы теритезируете. Пробовали проводить реальные испытания?

1000000 это заниженная величина, при испытаниях ATmega328P-PU, комнатная температура, 5 вольт, некоторые ячейки и на 2500000 перезаписей хватало, так же почитайте форумы у кого то и под 3500000 получалось.

Так что 1000000 для устройства ТС, в котором судя по коду будет стоять именно ATmega328P-PU/UA и эксплуатироваться оно будет в помещении очень даже уместно.

pcb
Offline
Зарегистрирован: 02.04.2015

Сначала соглашаемся:

maksim пишет:
Тут соглашусь, от температуры и напряжения зависит.

а потом сами себя посылаем:

maksim пишет:

Вы теритезируете. Пробовали проводить реальные испытания?

Тест на внимательность тоже завалили:

maksim пишет:
Так что 1000000 для устройства ТС, в котором судя по коду будет стоять именно ATmega328P-PU/UA и эксплуатироваться оно будет в помещении очень даже уместно.

neospromiy пишет:
Забал сказать яркость тоже должна запомитаться при отключии птания)  

Хочу встроить эту штуку для контроля светодиодной лентой в машину.

неожиданно.

 

maksim
Offline
Зарегистрирован: 12.02.2012

pcb пишет:

Сначала соглашаемся:

maksim пишет:
Тут соглашусь, от температуры и напряжения зависит.

а потом сами себя посылаем:

maksim пишет:

Вы теритезируете. Пробовали проводить реальные испытания?

То что зависимость есть не означает, что цифра изменится на порядки. Вы считаете мою цифру неуместной, я же операюсь на собственный опыт. Так что утведждать уместно мое предположение или нет вы можете только проверив это опытным путем. А говорить "неуместно", потому что сам не знаю сколько, потому что мир очень сложный и непредсказуемый, каждый может.

neospromiy
Offline
Зарегистрирован: 15.07.2013

Ребята, что за флуд, лучше бы написали прошивку))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

neospromiy
Offline
Зарегистрирован: 15.07.2013

500 рублей?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

jeka_tm пишет:

...укажи какая лента, если с контроллером то каким и так далее...

Дык, RGB же, остальное не важно, от конкретного контроллера зависит только пару строк кода как передать ленте конкретные значения R,G,B.

neospromiy
Offline
Зарегистрирован: 15.07.2013

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

pcb
Offline
Зарегистрирован: 02.04.2015

Тебе написали, что есть готовый проект. Только управление с кнопки, а не энкодера.

 

maksim
Offline
Зарегистрирован: 12.02.2012
#include <EEPROM.h>

#define RED_pin  9
#define GRN_pin 10
#define BLE_pin 11
#define BTN_pin  8
#define A_pin    7
#define B_pin    6

byte color = EEPROM.read(0);
byte brightness = EEPROM.read(1);
uint32_t savemillis = 0;

void setup() 
{
  digitalWrite(BTN_pin, 1); // подтяжка кнопки энкодера
  pinMode(RED_pin, OUTPUT);
  pinMode(GRN_pin, OUTPUT);
  pinMode(BLE_pin, OUTPUT);
  if(brightness > 10) brightness = 10;
}

void loop() 
{
  // обработка кнопки
  static bool prev_btn = 0;
  if(!prev_btn && !digitalRead(BTN_pin))
  {
    prev_btn = 1;
    brightness -= 2;
    if(brightness <= 2) brightness = 10;
    delay(100);
  }
  if(millis() > 0x124F80) brightness = 0;
  if(prev_btn && digitalRead(BTN_pin)) prev_btn = 0;
  
  
  // обработка энкодера
  static bool prev_enc_A = 0;
  bool enc_A = digitalRead(A_pin);
  if(!enc_A && prev_enc_A)
  {
    prev_enc_A = enc_A;  
    if(digitalRead(B_pin)) color++;
    else color--;
    delay(30);
  }


  // вывод
  static byte prev_state = 0;
  if(color^brightness != prev_state)
  {
    if(color >= 75) color = 0;
    prev_state = color^brightness;
    
    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);
    savemillis = millis();
    if(millis() > 0x927C0) while(millis());
  }
  
  
  // сохранение
  if(savemillis && millis()-savemillis > 3000)
  {
    EEPROM.write(0, color);
    EEPROM.write(1, brightness);
    savemillis = 0;
  }

}

Кнопку подключать одним концом к земле ,другим к цифровому выводу дуины.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

У нас вышло как-то так :)

#include <EEPROM.h>
#define redPin 9
#define greenPin 10
#define bluePin 11
#define modePin 13

#define encoderPin1 2
#define encoderPin2 3
#define encoderSwitchPin 4

int mode = 0;

byte lByte , hByte;

int redLight;
int greenLight;
int blueLight;

int brightness = EEPROM.read(0);
int color = EEPROM.read(2) + (EEPROM.read(3) * 256);


volatile int lastEncoded = 0;
volatile long encoderValue = color;

int minEncoderValue = 0;
int maxEncoderValue = 359;
boolean encoderCircle = true;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

void setup() {

  pinMode(encoderPin1, INPUT); 
  pinMode(encoderPin2, INPUT);

  pinMode(encoderSwitchPin, INPUT);


  pinMode(modePin, OUTPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

  digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on


  //call updateEncoder() when any high/low changed seen
  //on interrupt 0 (pin 2), or interrupt 1 (pin 3) 
  attachInterrupt(0, updateEncoder, CHANGE); 
  attachInterrupt(1, updateEncoder, CHANGE);

}

void loop(){ 
  //Do stuff here
  if(digitalRead(encoderSwitchPin)){
    //button is not being pushed
  }else{
    //button is being pushed
    mode = 1 - mode;
    digitalWrite(modePin, mode);
    if (mode == 0)
    {
      EEPROM.write(0, brightness);
      encoderValue = color;
      minEncoderValue = 0;
      maxEncoderValue = 359;
      encoderCircle = true;
    }
    else
    {
      lByte = lowByte(color);
      hByte = highByte(color);
      EEPROM.write(2, lByte);
      EEPROM.write(3, hByte);
      encoderValue = brightness;
      minEncoderValue = 0;
      maxEncoderValue = 100;
      encoderCircle = false;
    }
    delay(500);
  }
 
  if (mode == 0)
  {
    color = encoderValue;
  }
  else
  {
    brightness = encoderValue;
  }
  
  if (color < 60)       {redLight = 255;                    greenLight = color*255/60;            blueLight = 0;}
  else if (color < 120) {redLight = (60-(color-60))*255/60; greenLight = 255;                     blueLight = 0;}
  else if (color < 180) {redLight = 0;                      greenLight = 255;                     blueLight = (color-120)*255/60;}
  else if (color < 240) {redLight = 0;                      greenLight = (60-(color-180))*255/60; blueLight = 255;}
  else if (color < 300) {redLight = (color-240)*255/60;     greenLight = 0;                       blueLight = 255;}
  else                  {redLight = 255;                    greenLight = 0;                       blueLight = (60-(color-300))*255/60;}
  analogWrite(redPin,(255-redLight*brightness/100));
  analogWrite(greenPin,(255-greenLight*brightness/100));
  analogWrite(bluePin,(255-blueLight*brightness/100));
}


void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

  lastEncoded = encoded; //store this value for next time
  if (encoderCircle)
  {
    if (encoderValue < minEncoderValue) {encoderValue = maxEncoderValue;}
    else if (encoderValue > maxEncoderValue) {encoderValue = minEncoderValue;}
  }
  else
  {
    if (encoderValue < minEncoderValue) {encoderValue = minEncoderValue;}
    else if (encoderValue > maxEncoderValue) {encoderValue = maxEncoderValue;}
  }
}

Запись по смене режима регулировки (нажатие кнопки). Т.е. выставил цвет - нажал, выставил яркость и опять нажал.

neospromiy
Offline
Зарегистрирован: 15.07.2013

Ребята всем спасибо огромное за помощ. Но у меня почему-то не работает обработка энокодера.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

neospromiy пишет:
Ребята всем спасибо огромное за помощ. Но у меня почему-то не работает обработка энокодера.

Странно. Я этот алгоритм использовал. Все взлетело сразу. Что у Вас за енкодер?

neospromiy
Offline
Зарегистрирован: 15.07.2013

Завтра приду домой посмотрю, может энокодер подругому собран у меня. Ps энокодер у меня сразу собранан на плате со всеми подтягивающими резисторами куплен на ebay

neospromiy
Offline
Зарегистрирован: 15.07.2013

Ребята всем спасбо огромное, посидель сегодня дописал код под себя и довел почти до совершенства) Осталось сделать так чтобы пр удержани кнопки включался белый цвет, так как когда бегаешь по спектру белый цвет не включается.

вот код может кому пригодится 

в когде используеться библиотека EEPROM2 для храненя не цельных чсел!

#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(10);
float fadeColor = 3;
unsigned long currentTime;
unsigned long loopTime;
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()  {
  EEPROM_read(12,brightness);              // переменная для яркости
  Serial.begin(9600);
  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);
  currentTime = millis();
  loopTime = currentTime; 
  } 
 
void loop()  {
   byte red = 0, grn = 0, ble = 0;
  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(brightness + fadeAmount <= 10&&EEPROM.read(2)==0){brightness += fadeAmount;}              
         if(color + fadeColor <= 75&&EEPROM.read(2)==1){color += fadeColor;} 
         savemillis = millis();
         if(millis() > 0x927C0) while(millis());
           }
           else {
               if(brightness - fadeAmount >= 0&&EEPROM.read(2)==0){brightness -= fadeAmount;}               
               if(color - fadeColor >= 0&&EEPROM.read(2)==1){color -= fadeColor;}
               savemillis = millis();
               if(millis() > 0x927C0) while(millis()); 
                }   
 
    }   
    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла 

    Serial.println(EEPROM.read(12));
    Serial.println(EEPROM.read(10));
    //delay (120);
    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, color);
    EEPROM_write(12, brightness);
    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);}
 
}

 

neospromiy
Offline
Зарегистрирован: 15.07.2013

Ребята есть какаята проблема в коде, устрйство зависает примерно через 10 мин после включения. т.е лампочки горят но на энкодер перестает реагировать

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Не примерно, а точно через 10 минут. Конструкция: if(millis() > 0x927C0) while(millis()); в переводе с ардуино на русский: "Через 10 минут не делай ничего приблизительно 50 дней."

pcb
Offline
Зарегистрирован: 02.04.2015

KVadik пишет:

Не примерно

Это значит, что разработчика кинули :)

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

pcb пишет:

KVadik пишет:

Не примерно

Это значит, что разработчика кинули :)

ТС зажал максиму обещанные 500 рублей? :)

maksim
Offline
Зарегистрирован: 12.02.2012

pcb пишет:

KVadik пишет:

Не примерно

Это значит, что разработчика кинули :)

Вот-вот.

pcb
Offline
Зарегистрирован: 02.04.2015

maksim пишет:

Вот-вот.

А чего защита такая детская?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

pcb пишет:

А чего защита такая детская?

Мне даже в голову не пришло, что это "защита", думал так задумано, чтобы можно было цвет выставить только в первые 10 минут работы, типа фича такая :).

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

KVadik пишет:

pcb пишет:

А чего защита такая детская?

Мне даже в голову не пришло, что это "защита", думал так задумано, чтобы можно было цвет выставить только в первые 10 минут работы, типа фича такая :).


Теперь ты должен Максиму 500 рублей. Ибо нефиг лезть куда не просят.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Что значит "не просят"? ТС как раз и просил ;)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

KVadik пишет:

Что значит "не просят"? ТС как раз и просил ;)


Мдааа.. не дал человеку получить заработаные 500 рублей и делает вид что он не причем. Как-то не хорошо.
Мельчают людишки. :(

neospromiy
Offline
Зарегистрирован: 15.07.2013

Ребята я никого кидать не собираюсь, я готов заплатить за готовую прошивку но мне такую никто еще не предоставил.  код максима мне очень помог но как он работал мне не нравилося, шаг измененя яркости очень маленький был и регулировался он кнопкой а не энкодером. код kvadik у меня вообще не запустился. И никто из вас напрямую комне не обратлся что готов сделать за объявленную сумму прошивку, а тупо покидали на форум свои прошивки, и говорите что я зажал 500р.  

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


#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);}
 
}
KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

ну я как-то и не претендовал :)

vvadim
Offline
Зарегистрирован: 23.05.2012
fetus
Offline
Зарегистрирован: 05.12.2016

Последний код не работает. Он специально похерен? EEPROM_write(10, brightness); -что это?

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

Запоминание яркости.

neospromiy
Offline
Зарегистрирован: 15.07.2013

Код рабочий, добавь библиотеку eeprom2 (скачай в интернете), она нужна чтобы сохранять не целые числа

fetus
Offline
Зарегистрирован: 05.12.2016
Arduino: 1.6.12 (Windows 10), Плата:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"      EEPROM_write(10, brightness);
 
                                   ^
 
Несколько библиотек найдено для "EEPROM2.h"
 Используется: C:\Program Files (x86)\Arduino\libraries\EEPROM2
Не используется: C:\Users\felix\Documents\Arduino\libraries\EEPROM2-master
Используем библиотеку EEPROM2 в папке: C:\Program Files (x86)\Arduino\libraries\EEPROM2 (legacy)
Используем библиотеку EEPROM версии 2.0 из папки: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM 
exit status 1
'EEPROM_read' was not declared in this scope
 
 
Вот что пишет.
neospromiy
Offline
Зарегистрирован: 15.07.2013

Так ты добавил библиотеку EEPROM2?

fetus
Offline
Зарегистрирован: 05.12.2016

Вот еще такой код нашел.....работают только индикаторные диоды...думаю прерывания не для меги2560 (если что не смейтесь, неделю как мигаю светодиодом))

#define ENC_BUT 1

#define R_ACT 5
#define G_ACT 6
#define B_ACT 7

#define RED 9
#define GREEN 10
#define BLUE 11

byte ACT=1;
byte R_PWM=0;
byte G_PWM=0;
byte B_PWM=0;

// the setup function runs once when you press reset or power the board
void setup() {
  // Set the I/O pins
  pinMode(R_ACT, OUTPUT);
  pinMode(G_ACT, OUTPUT);
  pinMode(B_ACT, OUTPUT);

  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT); 

  pinMode(ENC_BUT, INPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  
  // Enable internal pull-up resistors
  digitalWrite(ENC_BUT, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  
  EICRA = 0b00001010; // Select the falling edge trigger
  EIMSK = 0b00000011; // Enable External Interrupts
  
}

// the loop function runs over and over again forever
void loop() {

// Set the Active Channel LED
  if (ACT == 1){
    digitalWrite(R_ACT, HIGH);  
    digitalWrite(G_ACT, LOW);  
    digitalWrite(B_ACT, LOW);  }
  else if (ACT == 2){
    digitalWrite(R_ACT, LOW);  
    digitalWrite(G_ACT, HIGH);  
    digitalWrite(B_ACT, LOW);  }
  else if (ACT == 3){
    digitalWrite(R_ACT, LOW);  
    digitalWrite(G_ACT, LOW);  
    digitalWrite(B_ACT, HIGH);  }

// Apply the PWM duty cycles
analogWrite(RED, R_PWM);
analogWrite(GREEN, G_PWM);
analogWrite(BLUE, B_PWM);

// Read the encoder Push-On button
if (!digitalRead(ENC_BUT)) {
  
  if (ACT == 1){
    ACT = 2;}
  else if (ACT == 2){
    ACT = 3;}
  else if (ACT == 3){
    ACT = 1; }

 
  delay(10);
  do {} while (!digitalRead(ENC_BUT));
  }
}



// Handle the interrupts generated by A and B signals of the Encoder
// Increase / decrease the PWM duty cycle

ISR (INT0_vect) {
  
  if (digitalRead(3) == HIGH) {
    if (ACT == 1) {if (!(R_PWM == 255)) R_PWM += 1;}
    else if (ACT == 2) {if (!(G_PWM == 255))G_PWM += 1;}
    else if (ACT == 3) {if (!(B_PWM == 255))B_PWM += 1;}
     }
}

ISR (INT1_vect) {
                     
  if (digitalRead(2) == HIGH) {
    if (ACT == 1) {if (!(R_PWM == 0)) R_PWM -= 1;}
    else if (ACT == 2) {if (!(G_PWM == 0))G_PWM -= 1;}
    else if (ACT == 3) {if (!(B_PWM == 0))B_PWM -= 1;}
     }  
    
}

 

neospromiy
Offline
Зарегистрирован: 15.07.2013

Библиотеку можешь скачать у меня на сайте
http://dixom.ru/instruktsii-i-uroki/rgb-lenta-i-povortonyj-enkoder

fetus
Offline
Зарегистрирован: 05.12.2016

Если буквы оранжевые то значит есть?....Несколько раз добавлял мож какой нить конфликт?

В примерах библиотеки не вижу  такого, с подчеркиванием " EEPROM_read"