Последовательное включение диодов друг за другом, прошу помощи в скетче
- Войдите на сайт для отправки комментариев
Здравствуйте, уважаемые участники форума.
В наличии arduino uno, 20 диодов, 3 сдвиговых регистра и огромное желание сделать так, чтобы эти 20 диодов включились друг за другом в столбик с 1 по 20, простояли включёнными некоторое время, далее всё погасло и столбик начинал расти заново. Как некая шкала или индикатор.
За некоторое время изучения интернетов на предмет подобных решений родился скетч. Его итерации умеют:
-зажигать диоды по отдельности, (т.е. первый горит,следующий гаснет)сверху вниз
-и снизу вверх,
- от любого диода в столбике до следующего любого диода,
- все 20 диодов включаются одновременно
- одновременно включается рандомное число диодов в столбике
..но научить его работать так, как мне надо не получилось. 
На всякий случай, выкладываю скетч, который зажигает и гасит диоды по отдельности друг за другом
//ST_CP вход
const int latchPin = 8;
//SH_CP вход
const int clockPin = 12;
//DS вход
const int dataPin = 11;
void setup() {
//режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop() {
// проходим по всем выходам трёх регистров, 25 потому, что если 24
// то последний диод не горит
for (int thisLed = 0; thisLed < 25; thisLed++) {
// записываем сигнал в регистр для очередного светодиода
registerWrite(thisLed, LOW);
// если это не первый светодиод, то отключаем предыдущий
if (thisLed > 0) {
registerWrite(thisLed - 1, HIGH);
}
// если это первый светодиод, то отключаем последний
else {
registerWrite(15, LOW);
}
// делаем паузу
delay(250);
}
}
// этим куском кода подключаем регистры в нужном кол-ве
void registerWrite(int whichPin, int whichState) {
// инициализируем и обнуляем байт
byte bitsToSend[3] = {0, 0, 0};
digitalWrite(latchPin, LOW);
// устанавливаем HIGH в соответствующем бите
bitWrite(bitsToSend[whichPin/8], whichPin%8, whichState);
// проталкиваем байт в регистр
for(int i = 0; i < 3; i++) shiftOut(dataPin, clockPin, LSBFIRST, bitsToSend[i]);
// "защелкиваем" регистр, чтобы байт появился на его выходах
digitalWrite(latchPin, HIGH);
}
Помогите, пожалуйста, в решении
Для сдвиговых регистров 595 есть библиотека Shift595:
https://sites.google.com/site/shift595arduino/
Здравствуйте. Спасибо за ответ. Подключение этой библиотеки даёт одновременное включение всех диодов . Также у меня получалось в процессе манипуляций с кодом включать и гасить одновременно по несколько диодов. Но не последовательно друг за другом.
#define latchPin 10 #define clockPin 12 #define dataPin 11 byte leds = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { leds = 0; updateShiftRegister(); delay(500); for (int i = 0; i < 8; i = i + 1) { bitSet(leds, i); updateShiftRegister(); delay(500); } } } void updateShiftRegister() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, leds); digitalWrite(latchPin, HIGH); }Valera19701,
Вы решили подшутить над ТС или вправду ошиблись (например, в районе 20-ой строки, да и вообще)? Если первое, то это ... неспортивно как-то.
В общем, конечно, одна из первых попыток. И mills, и shift пробовала
Есть смутные сомнения в том, что ко всему прочему, что-то напутано в подключении каскада
ЕвгенийП
было когдато взято отсюда, и давно переделано
http://interkot.ru/blog/robototechnika/8-svetodiodob-i-sdvigovoy-registr/
Изначально я ориентировалась вот на этот перевод Множим выходы с помощью сдвигового регистра 74 HC595
Samum, Вы смеетесь?
чтобы эти 20 диодов включились друг за другом в столбик с 1 по 20, простояли включёнными некоторое время
За некоторое время изучения интернетов на предмет подобных решений родился скетч. Его итерации умеют:
-зажигать диоды по отдельности, (т.е. первый горит,следующий гаснет)сверху вниз
Чем отличается второй скетч от первого (т.е. тот, что есть, от того, что нужен)?
Единственной маленькой деталью: в первом случае не нужно гасить уже зажженый светодиод.
Другими словами, нужно просто выкинуть из имеющегося скетча лишнее - команду гашения предыдущего светодиода.
Видео на эту тему:
http://www.youtube.com/watch?v=582NNt3tDmQ
В наличии arduino uno, 20 диодов, 3 сдвиговых регистра и огромное желание сделать так, чтобы эти 20 диодов включились друг за другом в столбик с 1 по 20, простояли включёнными некоторое время, далее всё погасло и столбик начинал расти заново. Как некая шкала или индикатор.
Для данного количества диодов достаточно одной переменной unsigned long int.
#define data 11 #define latch 8 #define clock 12 unsigned long int leds; int i; int ledMax = 20; void setup() { pinMode(data, OUTPUT); pinMode(latch, OUTPUT); pinMode(clock, OUTPUT); } void loop() { leds = 0; for(i=0; i<ledMax; i++) { leds = (leds << 1) | 1; outLeds(); delay(500); } delay(5000); for(i=0; i<ledMax; i++) { leds >>= 1; outLeds(); delay(500); } } void outLeds() { digitalWrite(latch, LOW); shiftOut(data, clock, MSBFIRST, leds >> 16); shiftOut(data, clock, MSBFIRST, leds >> 8); shiftOut(data, clock, MSBFIRST, leds); digitalWrite(latch, HIGH); }Отдельные биты ещё можно менять функцией bitSet()
Более подробный справочник по языку Ардуино здесь:
http://atmel.ucoz.ru/publ/spravochnik_po_jazyku/1-1-0-1