Плавное мерцание нескольких светодиодов
- Войдите на сайт для отправки комментариев
Чт, 06/10/2016 - 06:58
Доброго времени суток форумчане. Совсем недавно начал дружить с ардуинкой и столкнулся со следующей проблемкой.
Имееться грубо говоря 5 светодиодов и нужно заставить их плавно загораться\затухать отдельно друг от друга в определенном порядке. В уроках нашел управление через digitalWrite, но там не реализовать плавного мерцания. Так же нашел через analogWrite , но опять же, реализовано только для одного светодиода.
http://arduino.ru/Tutorial/Fade
Что нужно сделать с кодом в уроке выше, чтобы отдельно управлять плавным мерчанием 5 отдельных светодиодов?
в этом уроке написано про ШИМ, с ним и разбирайтесь, там всё предельно понятно
в этом уроке написано про ШИМ, с ним и разбирайтесь, там всё предельно понятно
Ну, Вы, блин, даёте, ТС же ясно сказал, что ШИМ - это для одного светодиода. Е ему для пяти нужно :)))
ТС, ну Вы для разминки, сделайте пять раз как там написано. А там посмотрим.
позвольте, у ТС ни слова про шим....
а если сначала, то тогда надо делать блинк для 5 диодов
позвольте, у ТС ни слова про шим....
Как это "ни слова". А вот это
http://arduino.ru/Tutorial/Fade
про что? :)))
так это ссылка)))
у нас этих ссылок... у нас дядя работает на фабрике по производству ссылок, вот и шлет всем подряд)))
у нас дядя работает на фабрике по производству ссылок, вот и шлет всем подряд)))
Тырит, что-ли? Или им зарплату продукцией выдают?
Вам нужен ШИМ, для его использования применяется команда analogWrite.
Если идти простым путем, то нужно каждый светодиод подключить к отдельной ноге через токограничивающий резистор.
Далее если у Вас Arduino Uno, то смотрим описание контролеера (datasheet) и видим, что ноги которые поддерживают ШИМ - 3, 5, 6, 9, 10, и 11.
К примеру:
Ну а алгоритм изменения яркости запрограмируйте сами.
Схему подключения я понял, проблема для меня заключается в коде.
.
. .
. .
Схематично, на точках, это должно работать следующим образом:
Сначала начинают разгораться нижние 2 светодиода, когда они достигают половины яркости, начинают загораться вторые 2 светодиода, и последний аналогично (когда яркость нижних на полную, а средних на половину).
Самому с 0 писать код пока проблематично, пользуюсь уроками и форумами.
Сначала начинают разгораться нижние 2 светодиода, когда они достигают половины яркости, начинают загораться вторые 2 светодиода, и последний аналогично (когда яркость нижних на полную, а средних на половину).
Самому с 0 писать код пока проблематично, пользуюсь уроками и форумами.
Лучше книжку по языку почитайте. На видео и форумах Вы всегда будете видеть "обрывки" и целостной картины у Вас не будет.
Я это прекрасно понимаю, но боюсь, что не успею сам к нужному времени все изучить и доделать (а книжечку все таки посоветуйте), поэтому и обратился сам на форум. Жене к выступлению нужно подстветку такую организовать, а выступление меньше чем через месяц. А у меня с работой времени совсем не много остается на обучение, да и голова зачастую не варит после работы.
а книжечку все таки посоветуйте
Ну, вот, например.
Жене к выступлению нужно подстветку такую организовать, а выступление меньше чем через месяц. А у меня с работой времени совсем не много остается на обучение, да и голова зачастую не варит после работы.
Тогда зайдите вот сюда и запостите своё ТЗ, там за разумную денюшку кто-нибудь сделает.
совершенно случайно делаю елочную гирлянду там реализовано нетчео подобное, вот код
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); }/* светодиод 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) ; } } }qwone, поправьте меня, если я ошибаюсь, но мне на первый взгляд показалось, что у Вас второй начинает разгораться, когда первый достигнет максимальной яркости, третий начинает - когда второй достигнет максимума и т.д. Так или я чего-то не заметил? Вроде ж ТС не это просил.
Ну да. Можно и с середины зажигать следущий. Но скорее всего ТС не дошурупает. А программы пишу для отработки своего подхода.
ПС: Любой код надо всегда заливать и смотреть. Хотя ШИМ линеен, диоды зажигаются нелинейно. Так что надо найти максимальный уровень при котором светодиоды еще не горят. А это величина у сведодиодов индивидульная. А с какой середины. когда ШИМ= 255/2 или с середины яркости. Вот этот ньюанс ТС не знает.
Ну да. Можно и с середины зажигать следущий. Но скорее всего ТС не дошурупает. А программы пишу для отработки своего подхода.
Сможете подсказать, каким образом их плавно выключать поочереди? :)
Встают, как вкопанные, после включения и все тут.
Друг, дам тебе совет - не буди в квоне подсказчика...
Друг, дам тебе совет - не буди в квоне подсказчика...
Пробую свои знания применить, а к qwone не будет лишним обратиться :) Подход к коду у него отличный!
Понятно же что надо начинать с такой строки
const byte MAP[] = { /*таблица яркости светодиода*/ 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF };Понятно же что надо начинать с такой строки
const byte MAP[] = { /*таблица яркости светодиода*/ 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF };И вправду. Благодарю за наводку!