Плавное мерцание нескольких светодиодов

HawkEye
Offline
Зарегистрирован: 06.10.2016

Доброго времени суток форумчане. Совсем недавно  начал дружить с ардуинкой и столкнулся со следующей проблемкой. 

Имееться грубо говоря 5 светодиодов и нужно заставить их плавно загораться\затухать отдельно друг от друга в определенном порядке. В уроках нашел управление через digitalWrite, но там не реализовать плавного мерцания. Так же нашел через analogWrite , но опять же, реализовано только для одного светодиода.

http://arduino.ru/Tutorial/Fade

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

msng
Offline
Зарегистрирован: 07.06.2012

в этом уроке написано про ШИМ, с ним и разбирайтесь, там всё предельно понятно

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

msng пишет:

в этом уроке написано про ШИМ, с ним и разбирайтесь, там всё предельно понятно

Ну, Вы, блин, даёте, ТС же ясно сказал, что ШИМ - это для одного светодиода. Е ему для пяти нужно :)))

ТС, ну Вы для разминки, сделайте пять раз как там написано. А там посмотрим.

msng
Offline
Зарегистрирован: 07.06.2012

позвольте, у ТС ни слова про шим....

а если сначала, то тогда надо делать блинк для 5 диодов

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

msng пишет:

позвольте, у ТС ни слова про шим....

Как это "ни слова". А вот это

HawkEye пишет:

http://arduino.ru/Tutorial/Fade

про что? :)))

msng
Offline
Зарегистрирован: 07.06.2012

так это ссылка)))

у нас этих ссылок... у нас дядя работает на фабрике по производству ссылок, вот и шлет всем подряд)))

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

msng пишет:

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

Тырит, что-ли? Или им зарплату продукцией выдают?

_mikka
Offline
Зарегистрирован: 01.11.2015

Вам нужен ШИМ, для его использования применяется команда analogWrite.

Если идти простым путем, то нужно каждый светодиод подключить к отдельной ноге через токограничивающий резистор.

Далее если у Вас Arduino Uno, то смотрим описание контролеера (datasheet) и видим, что ноги которые поддерживают ШИМ - 3, 5, 6, 9, 10, и 11.

К примеру:

analogWrite(3, 255);
analogWrite(5, 128);
analogWrite(9, 64);
analogWrite(10, 32);
analogWrite(11, 200);

Ну а алгоритм изменения яркости запрограмируйте сами.

HawkEye
Offline
Зарегистрирован: 06.10.2016

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

     .

  .     .

.          .

 

Схематично, на точках, это должно работать следующим образом:

Сначала начинают разгораться нижние 2 светодиода, когда они достигают половины яркости, начинают загораться вторые 2 светодиода, и последний аналогично (когда яркость нижних на полную, а средних на половину).

 

Самому с 0 писать код пока проблематично, пользуюсь уроками и форумами.

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

HawkEye пишет:

Сначала начинают разгораться нижние 2 светодиода, когда они достигают половины яркости, начинают загораться вторые 2 светодиода, и последний аналогично (когда яркость нижних на полную, а средних на половину).

Самому с 0 писать код пока проблематично, пользуюсь уроками и форумами.

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

HawkEye
Offline
Зарегистрирован: 06.10.2016

Я это прекрасно понимаю, но боюсь, что не успею сам к нужному времени все изучить и доделать (а книжечку все таки посоветуйте), поэтому и обратился сам на форум. Жене к выступлению нужно подстветку такую организовать, а выступление меньше чем через месяц. А у меня с работой времени совсем не много остается на обучение, да и голова зачастую не варит после работы.

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

HawkEye пишет:

а книжечку все таки посоветуйте

Ну, вот, например.

HawkEye пишет:

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

Тогда зайдите вот сюда и запостите своё ТЗ, там за разумную денюшку кто-нибудь сделает.

 

 

msng
Offline
Зарегистрирован: 07.06.2012

совершенно случайно делаю елочную гирлянду там реализовано нетчео подобное, вот код


int rl = 9;       
int gl = 10;
int bl=11;
int br = 0;    
int bg = 0;
int bb = 0;

int t=50;

void setup()  
{ 
  pinMode(rl, OUTPUT);
  pinMode(gl, OUTPUT);
  pinMode(bl, OUTPUT);
} 

void loop()  { 

t=10;
  analogWrite(rl, br);    

for (int i=0; i <= 255; i++){analogWrite(rl, i);  delay(t);} delay(t*50);
for (int i=255; i >= 0; i--){analogWrite(rl, i); delay(t);}
delay(t*50);
for (int i=0; i <= 255; i++){analogWrite(bl, i); delay(t);}delay(t*50);
for (int i=255; i >= 0; i--){analogWrite(bl, i); delay(t);}
delay(t*50);
for (int i=0; i <= 255; i++){analogWrite(gl, i); delay(t);}delay(t*50);
for (int i=255; i >= 0; i--){analogWrite(gl, i);  delay(t);}
delay(t*50);

for (int i=0; i <= 255; i++){analogWrite(rl, i);delay(t);}delay(t*50);
for (int i=0; i <= 255; i++){analogWrite(bl, i);delay(t);}delay(t*50);
for (int i=255; i >= 0; i--){analogWrite(rl, i);delay(t);}delay(t*50);
for (int i=0; i <= 255; i++){analogWrite(gl, i);delay(t);}delay(t*50);
for (int i=255; i >= 0; i--){analogWrite(bl, i);delay(t);}delay(t*50);
for (int i=0; i <= 255; i++){analogWrite(rl, i);delay(t);}delay(t*50);
for (int i=255; i >= 0; i--){analogWrite(gl, i);delay(t);}delay(t*50);
for (int i=255; i >= 0; i--){analogWrite(rl, i);delay(t);}delay(t*50);

for (int i=0; i <= 255; i++){analogWrite(bl, i); delay(t);} delay(t*50);
for (int i=0; i <= 255; i++){analogWrite(gl, i); analogWrite(bl, 255-i); delay(t);}delay(t*50);
for (int i=0; i <= 255; i++){analogWrite(rl, i); analogWrite(gl, 255-i); delay(t);}delay(t*50);
for (int i=255; i >= 0; i--){analogWrite(rl, i);delay(t);}delay(t*50);



delay(1000);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
светодиод 1-> 3 (PWM1_pin) яркость 0 негорит 255 горит максимум
          GND->GND
светодиод 2-> 5 (PWM2_pin)
          GND->GND
светодиод 3-> 6 (PWM3_pin)
          GND->GND
светодиод 4-> 9 (PWM4_pin)
          GND->GND
светодиод 5-> 10 (PWM5_pin)
          GND->GND
светодиод 6-> 11 (PWM6_pin)
*/
//#1
const int PWM1_pin = 3; //Led1
uint8_t PWM1 = 0;
//#2
const int PWM2_pin = 5; //Led1
uint8_t PWM2 = 0;
//#3
const int PWM3_pin = 6; //Led1
uint8_t PWM3 = 0;
//#3
const int PWM4_pin = 9; //Led1
uint8_t PWM4 = 0;
//#5
const int PWM5_pin = 10; //Led1
uint8_t PWM5 = 0;
//#6
const int PWM6_pin = 11; //Led1
uint8_t PWM6 = 0;

void setup() {
  //#1
      analogWrite(PWM1_pin, PWM1) ;
  //#2
      analogWrite(PWM2_pin, PWM2) ;
  //#3
      analogWrite(PWM3_pin, PWM3) ;
  //#4
      analogWrite(PWM4_pin, PWM4) ;
  //#5
      analogWrite(PWM5_pin, PWM5) ;
  //#6
      analogWrite(PWM6_pin, PWM6) ;
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  static uint32_t future1 = 0 ;
  if (MILLIS >= future1)   {
    future1 = MILLIS + 200 ;// каждые 0,200 сек       
    if (PWM1 < 245) PWM1 = PWM1 + 10;// яркость Led1 растет в 10/256 раз
    else PWM1 = 255;
    analogWrite(PWM1_pin, PWM1) ;
  }
  //#2
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2)   {
    future2 = MILLIS + 200 ;// каждые 0,200 сек
    if (PWM1 == 255) {
    if (PWM2 < 245) PWM2 = PWM2 + 10;// яркость Led2 растет в 10/256 раз
    else PWM2 = 255;
      analogWrite(PWM2_pin, PWM2) ;
    }
  }
  //#3
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3)   {
    future3 = MILLIS + 200 ;// каждые 0,200 сек
    if (PWM2 == 255) {
    if (PWM3 < 245) PWM3 = PWM3 + 10;// яркость Led3 растет в 10/256 раз
    else PWM3 = 255;
      analogWrite(PWM3_pin, PWM3) ;
    }
  }
  //#4
  static uint32_t future4 = 0 ;
  if (MILLIS >= future4)   {
    future4 = MILLIS + 200 ;// каждые 0,200 сек
    if (PWM3 == 255) {
    if (PWM4 < 245) PWM4 = PWM4 + 10;// яркость Led4 растет в 10/256 раз
    else PWM4 = 255;
      analogWrite(PWM4_pin, PWM4) ;
    }
  }
  //#5
  static uint32_t future5 = 0 ;
  if (MILLIS >= future5)   {
    future5 = MILLIS + 200 ;// каждые 0,200 сек
    if (PWM4 == 255) {
    if (PWM5 < 245) PWM5 = PWM5 + 10;// яркость Led5 растет в 10/256 раз
    else PWM5 = 255;
      analogWrite(PWM5_pin, PWM5) ;
    }
  }
  //#6
  static uint32_t future6 = 0 ;
  if (MILLIS >= future6)   {
    future6 = MILLIS + 200 ;// каждые 0,200 сек
    if (PWM5 == 255) {
    if (PWM6 < 245) PWM6 = PWM6 + 10;// яркость Led6 растет в 10/256 раз
    else PWM6 = 255;
      analogWrite(PWM6_pin, PWM6) ;
    }
  }
}

 

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

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну да. Можно и с середины зажигать следущий. Но скорее всего ТС не дошурупает. А программы пишу для отработки своего подхода.

ПС: Любой код надо всегда заливать и смотреть. Хотя ШИМ линеен, диоды зажигаются нелинейно. Так что надо найти максимальный уровень при котором светодиоды еще не горят. А это величина у сведодиодов индивидульная. А с какой середины. когда ШИМ= 255/2 или с середины яркости.  Вот этот ньюанс ТС не знает.

STunit
Offline
Зарегистрирован: 24.05.2018

qwone пишет:

Ну да. Можно и с середины зажигать следущий. Но скорее всего ТС не дошурупает. А программы пишу для отработки своего подхода.

Сможете подсказать, каким образом их плавно выключать поочереди? :)

Встают, как вкопанные, после включения и все тут.

sadman41
Offline
Зарегистрирован: 19.10.2016

Друг, дам тебе совет - не буди в квоне подсказчика...

STunit
Offline
Зарегистрирован: 24.05.2018

sadman41 пишет:

Друг, дам тебе совет - не буди в квоне подсказчика...

Пробую свои знания применить, а к qwone не будет лишним обратиться :) Подход к коду у него отличный! 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Понятно же что надо начинать с такой строки 

const byte MAP[] = { /*таблица яркости светодиода*/
  0x00, 0x01, 0x03, 0x07, 0x0F,
  0x1F, 0x3F, 0x7F, 0xFF
};

 

STunit
Offline
Зарегистрирован: 24.05.2018

qwone пишет:

Понятно же что надо начинать с такой строки 

const byte MAP[] = { /*таблица яркости светодиода*/
  0x00, 0x01, 0x03, 0x07, 0x0F,
  0x1F, 0x3F, 0x7F, 0xFF
};

 

И вправду. Благодарю за наводку!