Последовательное включение диодов друг за другом, прошу помощи в скетче

Samum
Offline
Зарегистрирован: 30.11.2015

Здравствуйте, уважаемые участники форума.
В наличии 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);
}

Помогите, пожалуйста, в решении

arduinec
Offline
Зарегистрирован: 01.09.2015

Для сдвиговых регистров 595 есть библиотека Shift595:

https://sites.google.com/site/shift595arduino/

Samum
Offline
Зарегистрирован: 30.11.2015

Здравствуйте. Спасибо за ответ. Подключение этой библиотеки даёт одновременное включение всех диодов . Также у меня получалось в процессе манипуляций с кодом включать и гасить одновременно по несколько диодов. Но не последовательно друг за другом.

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

 

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

Valera19701, 

Вы решили подшутить над ТС или вправду ошиблись (например, в районе 20-ой строки, да и вообще)? Если первое, то это ... неспортивно как-то.

Samum
Offline
Зарегистрирован: 30.11.2015

В общем, конечно, одна из первых попыток. И mills, и shift пробовала

Есть смутные сомнения в том, что ко всему прочему, что-то напутано в подключении каскада

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

ЕвгенийП

было когдато взято отсюда, и давно переделано

http://interkot.ru/blog/robototechnika/8-svetodiodob-i-sdvigovoy-registr/

Samum
Offline
Зарегистрирован: 30.11.2015

Изначально я ориентировалась вот на этот перевод Множим выходы с помощью сдвигового регистра 74 HC595

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Samum, Вы смеетесь?

Samum пишет:

чтобы эти 20 диодов включились друг за другом в столбик с 1 по 20, простояли включёнными некоторое время

Цитата:

За некоторое время изучения интернетов на предмет подобных решений родился скетч. Его итерации умеют:
-зажигать диоды по отдельности, (т.е. первый горит,следующий гаснет)сверху вниз

Чем отличается второй скетч от первого (т.е. тот, что есть, от того, что нужен)?

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

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

arduinec
Offline
Зарегистрирован: 01.09.2015

Видео на эту тему:
http://www.youtube.com/watch?v=582NNt3tDmQ
 

arduinec
Offline
Зарегистрирован: 01.09.2015

Samum пишет:

В наличии 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