Подскажите про диоды и транзисторы

popUP
Offline
Зарегистрирован: 09.10.2014

Доброго времени суток!

Собираж лед-куб. Слой - 24 светодиода, дешевые китайские 3 мм, параметров не нашел но врядли больше 20 мА каждый.

Каждый слой с общим катодом.  Поставил транзисторы BC337 и 100 Ом резистор для ограничения тока на светодиод. Внешнее питание 5в, 1 А.

Когда зажигаю пару диодов - горят ярко, чем больше диодов слоя включено - тем тусклее. Проверял на покеа только на одном слое. Что будет, когда включу все 5 слоев? Мне казалось, что должнот было работать . В чем не прав?

Схема от руки, но вроде понятно

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

Поделите 5В на 100ом - получите 50мА. Это ток, который Вы даёте на все 24 светодиода! Не маловато? А если ещё и падение на переходе транзистора учесть то вообще 44мАполучается.

Кроме того, каждому диоду нужен свой резистора. так что выбрость этот резистор, посчитайте какой нужен на каждый диод и ставьте.

И еще - не забывайте, что у 595-го ограничение - не более 70мА на корпус.

popUP
Offline
Зарегистрирован: 09.10.2014

Спасибо, Евгений , за столь быстрый ответ.

Схему брал с китайской поделки-конструктора который собрал ранее

вот так выглядит в сборе

А сделать хочу вот такой

И просто не представляю себе как к каждому поставить по резистору. Как максимум на 1 колонну из 5 штук.

т.е. между 595 и колонной вставить резистор. А акакой? :) и убрать между транзистором и катодом диодов?

Так же как учесть,что молгут гореть и по 1 диоду в каждом слое

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

Ну, вообще-то сюда лучше не 595 ставить, а что-нибудь с контролем тока (н.п. TLC5940). Тогда резисторы вовсе не нужны. А так - делайте как хотите, но это неправильно. Токоограничвающий резистор должен быть свой у каждого светодиода.

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

ЕвгенийП пишет:

Токоограничвающий резистор должен быть свой у каждого светодиода.

Точнее сказать, "у каждого светодиода, через который идет ток". При динамической индикации, например, один резистор может использоваться для нескольких светодиодов, ток через которые никогда не течет одновременно.

 

2popUP: т.е. в Вашем случае все 24 светодиода одного слоя должны гореть строго по очереди, одновременное зажигание двух светодиодов одного слоя недопустимо.

 

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

popUP
Offline
Зарегистрирован: 09.10.2014

Пробный код для 1 слоя
Не дает с андроида вставить как код

const int latchPin = 7; // Пин подключен к ST_CP (ножка 12) входу 74HC595
const int clockPin = 8; // Пин подключен к SH_CP ( ножка 11) входу 74HC595
const int dataPin = 4; // Пин подключен к DS ( ножка 14) входу 74HC595
int LayerPin[] = {3, 5, 6, 9}; // указываем пины, к которым подключены катоды диодов

long bitsToSend = 0; // переменная для хранения состояния каждого пина

int g = 0;
int h = 0;
int atemp = 0;

int State1 = 0; // HIGH=1; LOW=0
int timeStop = 50; //задержка внутри циклов подпрограмм

void setup() {
Serial.begin(9600);

pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);

pinMode(LayerPin[0], OUTPUT);
analogWrite(LayerPin[0], 255); //регулируем яркость светодиодов
//digitalWrite(LayerPin[layer], HIGH);

for (g = 0; g < 24; g = g + 1) // зажжем все
{
bitToSend ( g, 1);
sendToRegister (); // Шлем в регистр
delay (timeStop);
}

} //конец setup

void loop() {

// wave_all() ;

for (int i = 250; i >= 0; i = i- 20)
{
analogWrite(LayerPin[0], i); //регулируем яркость светодиодов
delay (timeStop);
}
for (int i = 0; i < 250; i = i+ 20)
{
analogWrite(LayerPin[0], i); //регулируем яркость светодиодов
delay (timeStop);
}

} //конец loop

//****функция передачи данных в сдвиговый регистр для зажигания светодиодов
void sendToRegister () { // Шлем в регистр
//Отключаем вывод на регистре
digitalWrite(latchPin, LOW);

// разбиваем наши 24 бит на 3 байта
// для записи в первый и второй регистр
byte register1 = (bitsToSend) >> 16;
byte register2 = (bitsToSend) >> 8;
byte register3 = (bitsToSend);

// "проталкиваем" байты в регистры - сначало в дальний
shiftOut(dataPin, clockPin, MSBFIRST, register1);
shiftOut(dataPin, clockPin, MSBFIRST, register2);
shiftOut(dataPin, clockPin, MSBFIRST, register3);

// "защелкиваем" регистр, чтобы биты появились на выходах регистра
digitalWrite(latchPin, HIGH);
}

void bitToSend (int Point, int State1) { //Запись в байт каждой точки
bitWrite(bitsToSend, Point, State1);
}

// ЭФФЕКТЫ

///********** все подряд
void wave_all() {

for (g = 0; g < 24; g = g + 1)
{
bitToSend ( g, 1);
sendToRegister (); // Шлем в регистр
delay (timeStop);
}
// for (g = 23; g >= 0; g = g -1 )
for (g = 0; g < 24; g = g + 1)
{
bitToSend ( g, 0);
sendToRegister (); // Шлем в регистр
delay (timeStop);
}

} //конец wave_all

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

popUP пишет:
Не дает с андроида вставить как код
Тогда вставьте с чего-нибудь другого.

popUP
Offline
Зарегистрирован: 09.10.2014

В продолжение темы 

кусочек видео работы куба 4х4х4, собранного из китайского конструктора по схеме выше : https://photos.app.goo.gl/5XCdXS5VU7ZzAZE52

Вот мой скетч для этого кубика.частично хоче использовать для новой поделки


const int latchPin = 8;        // Пин подключен к ST_CP входу 74HC595
const int clockPin = 12;       // Пин подключен к SH_CP входу 74HC595
const int dataPin = 11;        // Пин подключен к DS входу 74HC595
int LayerPin[] = {4, 5, 6, 7}; // указываем пины, к которым подключены слои кубика

int ButPin1 = 2;               // подключаем кнопку к выходу 2
int ButPin2 = 3;               // подключаем кнопку к выходу 3
int flag1 = 0;                  // флаг состояния
volatile int rejim1 = 0;        // Переключалка
int flag2 = 0;                  // флаг состояния
volatile int rejim2 = 0;        // Переключалка

int lastLayer = 0;
int layer = 0;                 //номер вертикального слоя
unsigned int bitsToSend = 0;    // переменная для хранения состояния каждого пина

int State1 = 0; // HIGH=1; LOW=0
int timeStop = 200;   //задержка внутри циклов подпрограмм
int timeStop2 = 100;   //задержка внутри циклов подпрограмм


void setup() {
  Serial.begin(9600);

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(ButPin1, INPUT);
  pinMode(ButPin2, INPUT);

  // все слои: LOW - вкл ,  HIGH - выкл
  for (layer = 0; layer < 4; layer++) {
    pinMode(LayerPin[layer], OUTPUT);
    digitalWrite(LayerPin[layer], HIGH);
  }
  attachInterrupt(INT0, ChangeRejim1, CHANGE);
  attachInterrupt(INT1, ChangeRejim2, CHANGE);
}   //конец setup

void loop() {

  //  ChangeRejim1();
  //  //  setRejim1();
  ChangeRejim2();

  Serial.print("R1- ");
  Serial.print(rejim1);
  Serial.print("  R2-  ");
  Serial.println(rejim2);


  switch (rejim2) {
    //************
    case 0:
      Serial.println("AllOn");
      hLayersAll(0) ;
      vLayersAll(1) ;
      break;
    //************
    case 1:
      Serial.println("fallDown");
      vLayersAll(0) ;
      fallDown (random(0, 15));
      break;
    //************
    case 2:
      Serial.println("raiseUP");
      vLayersAll(0) ;
      raiseUP (random(0, 15));
      break;
    //************
    case 3:
      Serial.println("Spiral");
      vLayersAll(0) ;

      for (layer = 0; layer < 4; layer++) {     // цикл для включения слоев свверху вниз
        //   for (layer = -3; layer <=0; layer++) {    // цикл для включения слоев снизу вверх
        digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
        //    }

        spiral2 (1);// в следующей подпрограмме включаем столбцы

        spiral1 (0);// в следующей подпрограмме вЫключаем столбцы
        digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
      }
      break;

    //************
    case 4:    // your hand is nowhere near the sensor
      Serial.println("circle1");
      vLayersAll(0) ;
      for (layer = 0; layer < 4; layer++) {     // цикл для включения слоев свверху вниз
        digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
        //    }
        circle1 ();
        digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
        lastLayer = abs(layer);
      }

      digitalWrite(LayerPin[lastLayer], LOW); // включаем слой
      circle1 ();
      digitalWrite(LayerPin[lastLayer], HIGH);  // вЫключаем слой - для цикла движения по слоям

      for (layer = -3; layer <= 0; layer++) {   // цикл для включения слоев снизу вверх
        digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
        //    }
        circle1 ();
        digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
      }

      //      fallDown (6);
      break;
    //************
    case 5:
      Serial.println("LineEvolution");
      for (int i = 0; i < 4; i++) {
        hLayersSingle (i, 0);
        vLayersSingle (i, 1);
        delay (timeStop);
        vLayersSingle (i, 0);
        hLayersSingle (i, 1);
      }

      for (int i = 3; i >= 0; i--) {
        hLayersSingle (i, 0);
        vLayersSingle (i, 1);
        delay (timeStop);
        vLayersSingle (i, 0);
      }

      for (int i = 0; i < 4; i++) {
        vLayersSingle (i, 1);
        delay (timeStop);
      }
      break;


    //************
    case 6:
      Serial.println("spiralFull");
      vLayersAll(0) ;                  //State1 = 0 -выкл, =1 - вкл
      hLayersAll(0) ;                      //State1 = 1 -выкл, =0 - вкл
      spiral1 (1);                   //State1 = 1 -вкл, =0 - выкл
      //  vLayersAll(0) ;                  //State1 = 0 -выкл, =1 - вкл
      delay (timeStop);
      spiral2 (0);

      break;

    case 7:
      Serial.println(" 7777");
      hLayersAll(0);
      vLayersAll(0);
      for (int i = 0; i < 4; i++) {
        vLayersSingle(i, 1);
        delay (timeStop);
        vLayersSingle(i, 0);
      }
      for (int i = 3; i >= 0 ; i--) {
        vLayersSingle(i, 1);
        delay (timeStop);
        vLayersSingle(i, 0);
      }

      for (int i = 0; i < 4; i++) {
        v2LayersSingle(i, 1);
        delay (timeStop);
        v2LayersSingle(i, 0);
      }
      for (int i = 3; i >= 0 ; i--) {
        v2LayersSingle(i, 1);
        delay (timeStop);
        v2LayersSingle(i, 0);
      }
      break;

case 8:
PointGrow (random(1, 8));
break;

    //************
    case 10:
      Serial.println("AllOff");
      hLayersAll(1);                   //State1 = 1 -выкл, =0 - вкл
      vLayersAll(0) ;                  //State1 = 0 -выкл, =1 - вкл
      break;
  }     //конец  switch (rejim2)

  /**********************
    bitToSend ( Point,  State1);
    hLayersSingle( hLayer,  State1);    //State1 = 1 -выкл, =0 - вкл
    hLayersAll( State1);                //State1 = 1 -выкл, =0 - вкл
    vLayersAll( State1);                //State1 = 0 -выкл, =1 - вкл
    vLayersSingle(vLayer, State1);      //State1 = 0 -выкл, =1 - вкл
    v2LayersSingle(vLayer, State1)      //State1 = 0 -выкл, =1 - вкл


    snake1(State1);
    snake2(State1);
    spiral1( State1);
    spiral2( State1);
    circle1();
    fallDown (Point);
    raiseUP (Point);
    PointGrow (Point);
  */



}     //конец loop

//****функция передачи данных в сдвиговый регистр для зажигания светодиодов
void sendToRegister () {   // Шлем в регистр
  //Отключаем вывод на регистре
  digitalWrite(latchPin, LOW);

  // разбиваем наши 16 бит на два байта
  // для записи в первый и второй регистр
  byte registerOne = lowByte(bitsToSend);
  byte registerTwo = highByte(bitsToSend);

  // "проталкиваем" байты в регистры  - сначало в дальний
  shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
  shiftOut(dataPin, clockPin, MSBFIRST, registerOne);

  // "защелкиваем" регистр, чтобы биты появились на выходах регистра
  digitalWrite(latchPin, HIGH);
}
//*********** функция смены режима по кнопке 1
void ChangeRejim1() {
  if (digitalRead(ButPin1) == HIGH && flag1 == 0)
  {
    rejim1 ++;
    flag1 = 1;
    if (rejim1 > 5)           // Если номер режима превышает количество эффектов,
    {
      rejim1 = 0;  // то отсчет начинается с нуля
    }
  }
  if (digitalRead(ButPin1) == LOW && flag1 == 1)
  {
    flag1 = 0;
  }
  switch (rejim1) {
    case 0:
      Serial.println("Light Speed");
      timeStop = 1;
      break;
    case 1:
      Serial.println("Fastest");
      timeStop = 25;
      break;
    case 2:
      Serial.println("Fast");
      timeStop = 50;
      break;
    case 3:
      Serial.println("Medium");
      timeStop = 100;
      break;
    case 4:
      Serial.println("Slow");
      timeStop = 200;
      break;
    case 5:
      Serial.println("Slowest");
      timeStop = 300;
      break;
  }
}
//**********функция смены режима по кнопке 2
void ChangeRejim2() {
  if (digitalRead(ButPin2) == HIGH && flag2 == 0)
  {
    rejim2 ++;
    flag2 = 1;
    if (rejim2 > 10)           // Если номер режима превышает количество эффектов,
    {
      rejim2 = 0;  // то отсчет начинается с нуля
    }
  }
  if (digitalRead(ButPin2) == LOW && flag2 == 1)
  {
    flag2 = 0;
  }
}
//********
void hLayersSingle(int hLayer, int State1) { // функция для одиночных слоёв горизонтальных
  digitalWrite(LayerPin[hLayer], State1);
}
//********
void hLayersAll(int State1) { // функция для всех слоёв горизонтальных
  for (layer = 0; layer < 4; layer++) {
    digitalWrite(LayerPin[layer], State1);
  }
}
//********
void vLayersAll(int State1) { // функция для включения/выключения (State1) всех слоёв вертикальных
  for (int i = 0; i < 16; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
  }
}
//********
void vLayersSingle(int vLayer, int State1) {
  switch (vLayer) {
    case 0:
      for (int i = 0; i < 4; i++) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
      }
      break;
    case 1:
      for (int i = 4; i < 8; i++) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
      }
      break;
    case 2:
      for (int i = 8; i < 12; i++) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
      }
      break;
    case 3:
      for (int i = 12; i < 16; i++) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
      }
      break;

  }
}
//*********
void v2LayersSingle(int vLayer, int State1) {
  switch (vLayer) {
    case 0:
      for (int i = 0; i < 16; ) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
        i = i + 4;
      }
      break;
    case 1:
      for (int i = 1; i < 16; ) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
        i = i + 4;
      }
      break;
    case 2:
      for (int i = 2; i < 16; ) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
        i = i + 4;
      }
      break;
    case 3:
      for (int i = 3; i < 16;) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
        i = i + 4;
      }
      break;
  }
}
///************* Зажечь/потушить змейку от 0 до 15
void snake1(int State1) {
  for (int i = 0; i < 4; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 7; i > 3; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 8; i < 12; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 15; i > 11; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}
//************** Зажечь/потушить змейку от 15 до 0
void snake2(int State1) {
  for (int i = 12; i < 16; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 12; i > 7; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 4; i < 8; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 3; i >= 0; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}
//************* Зажечь/потушить закручивающююся спираль снаружи внутрь
//по часовой стрелке
void spiral1(int State1) {
  for (int i = 0; i < 4; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 7, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 11, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  for (int i = 15; i > 11; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 8, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 4, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 5, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 6, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 10, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 9, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
}
///************Зажечь/потушить Раскручивающуюся спираль изнутри наружу
//против часовой стрелки
void spiral2(int State1) {

  bitWrite(bitsToSend, 5,  State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 6, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 10, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 9, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 8, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 4, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  for (int i = 0; i < 4; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 7, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 11, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  for (int i = 15; i > 10; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);

    bitWrite(bitsToSend, 10, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}
///********** одиночный огонек по кругу по часовой стрелке
void circle1() {
  for (int i = 0; i < 4; i++) {
    bitWrite(bitsToSend, i, HIGH);            //включили диод (столбик) 0-4
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
    bitWrite(bitsToSend, i, LOW);            //вЫключили диод 0-4
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 7, HIGH);            //включили диод 7
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 7, LOW);              //вЫключили диод 7
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 11, HIGH);           //и т.д.
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 11, LOW);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  for (int i = 15; i > 11; i--) {
    bitWrite(bitsToSend, i, HIGH);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
    bitWrite(bitsToSend, i, LOW);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 8, HIGH);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 8, LOW);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 4, HIGH);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 4, LOW);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
}
//******************** Звездопад
void fallDown (int Point) {
  bitWrite(bitsToSend, Point, HIGH);
  // bitWrite(bitsToSend, random(0, 15), HIGH);

  sendToRegister ();    // Шлем в регистр
  for (layer = -3; layer <= 0; layer++) {   // цикл для включения слоев  свверху вниз
    digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
    delay (timeStop);
    digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
  }       //Если нужно включить все слои и работать со столбцами
  bitWrite(bitsToSend, Point, LOW);
  sendToRegister ();    // Шлем в регистр
}
//******************** Звездопад наоборот
void raiseUP (int Point) {
  bitWrite(bitsToSend, Point, HIGH);
  sendToRegister ();    // Шлем в регистр
  for (layer = 0; layer < 4; layer++) {     // цикл для включения слоев снизу вверх
    digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
    delay (timeStop);
    digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
  }
  bitWrite(bitsToSend, Point, LOW);
  sendToRegister ();    // Шлем в регистр
}
//***********рост из угла
void PointGrow (int Point) {

  switch (Point) {
    //**************
    case (1):
      //***рост из 1 (0,0)
      hLayersAll (1);
      for (int i = 0; i < 4; i++) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 1 + i; y < 4; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;
    //***************
    case (2):
      //***рост из 2 (3,0)
      hLayersAll (1);
      for (int i = 0; i < 4; i++) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 1 + i; y < 4; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(3 - y, 0);
        }
        delay (timeStop);
      }
      break;

    //***************
    case (3):
      //***рост из 3 (15,0)
      hLayersAll (1);
      for (int i = 0; i < 4; i++) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 0; y < 3 - i; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;

    //***************
    case (4):
      //***рост из 4 ( 12,0)
      hLayersAll (1);
      for (int i = 0; i < 4; i++) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 0; y < 3 - i; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(3 - y, 0);
        }
        delay (timeStop);
      }
      break;

    //**************
    case (5):
      //***рост из 5 (0,4)
      hLayersAll( 1);
      for (int i = 3; i >= 0; i--) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 4 - i; y < 4; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;

    //**************
    case (6):
      //***рост из 6 (3,4)
      hLayersAll( 1);
      for (int i = 3; i >= 0; i--) {
        vLayersAll(1);
        hLayersSingle (i, 0);

        for (int y = 0; y < i; y++) {
          vLayersSingle(3 - y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;


    //**************
    case (7):
      //***рост из 7 (15,4)
      hLayersAll( 1);
      for (int i = 3; i >= 0; i--) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 0; y < i; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;

    //**************
    case (8):
      //***рост из 8 (12,4)
      hLayersAll( 1);
      for (int i = 3; i >= 0; i--) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 4 - i; y < 4; y++) {
          vLayersSingle(3 - y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;
  } // end of switch

} // end of PointGrow (int Point, int Layer)

А вот скетч для 1 слоя звезды, для которой и спрашиваю совета.


const int latchPin = 7;        // Пин подключен к ST_CP (ножка 12) входу 74HC595
const int clockPin = 8;       // Пин подключен к SH_CP ( ножка 11) входу 74HC595
const int dataPin = 4;        // Пин подключен к DS ( ножка 14) входу  74HC595
int LayerPin[] = {3, 5, 6, 9}; // указываем пины, к которым подключены катоды диодов

long bitsToSend = 0;    // переменная для хранения состояния каждого пина

int g = 0;
int h = 0;
int atemp = 0;

int State1 = 0; // HIGH=1; LOW=0
int timeStop = 100;   //задержка внутри циклов подпрограмм

void setup() {
  Serial.begin(9600);

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);

  pinMode(LayerPin[0], OUTPUT);
  analogWrite(LayerPin[0], 255);     //регулируем яркость светодиодов
  //digitalWrite(LayerPin[layer], HIGH);



}   //конец setup

void loop() {

  for (g = 0; g < 24; g = g + 1)
  {
    bitToSend ( g, 1);
    bitToSend ( g + 1, 1);
    bitToSend ( g + 2, 1);
    sendToRegister ();    // Шлем в регистр
    delay (30);

  }
  delay (500);

  for (g = 0; g < 24; g = g + 1)
  {
    bitToSend ( g, 0);
    bitToSend ( g + 1, 0);
    bitToSend ( g + 2, 0);
    sendToRegister ();    // Шлем в регистр
     delay (30);
  }
  delay (500);



  //  wave_all_1_0() ;  ///********** зажечь все по одному подряд
  //  wave_all_1_1() ;    ///********** потушить все по одному подряд
  //  BlinkAll ();
  //wave_all_2_0() ;  ///********** зажечь все по одному по спирали
  //wave_all_2_1() ;  ///********** потушить все по одному по спирали

}     //конец loop


//****функция передачи данных в сдвиговый регистр для зажигания светодиодов
void sendToRegister () {   // Шлем в регистр
  //Отключаем вывод на регистре
  digitalWrite(latchPin, LOW);

  // разбиваем наши 24 бит на 3 байта
  // для записи в первый и второй регистр
  byte register1 = (bitsToSend) >> 16;
  byte register2 = (bitsToSend) >> 8;
  byte register3 = (bitsToSend);

  // "проталкиваем" байты в регистры  - сначало в дальний
  shiftOut(dataPin, clockPin, MSBFIRST, register1);
  shiftOut(dataPin, clockPin, MSBFIRST, register2);
  shiftOut(dataPin, clockPin, MSBFIRST, register3);

  // "защелкиваем" регистр, чтобы биты появились на выходах регистра
  digitalWrite(latchPin, HIGH);
}

void bitToSend (int Point, int State1) {  //Запись в байт каждой точки
  bitWrite(bitsToSend, Point, State1);
}


// ЭФФЕКТЫ

///********** зажечь все по одному подряд
void wave_all_1_0()
{
  for (g = 0; g < 24; g = g + 1)
  {
    bitToSend ( g, 1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }

} //конец wave_all_1_0

///********** потушить все по одному подряд
void wave_all_1_1 ()
{
  //  for (g = 23; g >= 0; g = g -1 )    ///в обратном порядке
  for (g = 0; g < 24; g = g + 1)
  {
    bitToSend ( g, 0);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}//конец wave_all_1_1

///********** зажечь все по одному по спирали
void wave_all_2_0 ()
{
  for (g = 0; g < 24; g = g + 3)
  {
    bitToSend ( g, 1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (g = 1; g < 24; g = g + 3)
  {
    bitToSend ( g, 1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (g = 2; g < 24; g = g + 3)
  {
    bitToSend ( g, 1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}//конец wave_all_2_0

///********** потушить все по одному по спирали
void wave_all_2_1 ()
{
  for (g = 0; g < 24; g = g + 3)
  {
    bitToSend ( g, 0);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (g = 1; g < 24; g = g + 3)
  {
    bitToSend ( g, 0);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (g = 2; g < 24; g = g + 3)
  {
    bitToSend ( g, 0);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}//конец wave_all_2_1


////************* мигание
void BlinkAll ()
{
  for (int i = 250; i >= 0; i = i - 20)
  {
    analogWrite(LayerPin[0], i);     //регулируем яркость светодиодов
    delay (timeStop);
  }
  for (int i = 0; i < 250; i = i + 20)
  {
    analogWrite(LayerPin[0], i);     //регулируем яркость светодиодов
    delay (timeStop);
  }

} //конец  BlinkAll ()

 

 

А вот видео работы 1 слоя звезды.

https://photos.app.goo.gl/L8vnR3AjhgIRoY8D2

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

Я абсолютно доверяю Евгению и неоднократно прибегал к его советам. На всех, виденных мной примерах по работе с 595-й везде к каждому диоду прилагаетсясвой резистор. 

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

Так же последовать Совету Евгения и использовать 5940, как, например вот в таком проекте http://dclausen.net/projects/ledcyl/     тем более, что я их для него заказал и жду поставку а диоды уже спаял.

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

 

 

popUP
Offline
Зарегистрирован: 09.10.2014

Доброго вечера!

В общем и целом следуюя советам мастеров - я таки собрал звездочку. поставил резисторы для каждого столбика. Работает.

Видео https://photos.app.goo.gl/y6IXGU9Y1qmULGFl2

Зато появились проблемы с кодом. Добавил IR и все посыпалось.

Код

#include <IRremote.h>
int IR_PIN = 2;   // подключаем  IR на прерывании
IRrecv irrecv(IR_PIN);
decode_results results;

const int latchPin = 7;        // Пин подключен к ST_CP (ножка 12) входу 74HC595
const int clockPin = 8;       // Пин подключен к SH_CP ( ножка 11) входу 74HC595
const int dataPin = 4;        // Пин подключен к DS ( ножка 14) входу  74HC595
int LayerPin[] = {3, 5, 9, 10, 11}; // указываем пины, к которым подключены катоды диодов

long bitsToSend = 0;    // переменная для хранения состояния каждого пина

int g = 0;              ///номер диода
int layer = 0;          /// номер слоя
int channel = 0;         // номер канала

int timeStop = 200;   //задержка внутри циклов подпрограмм
 int timestop2 = 20;

void setup() {
  Serial.begin(9600);
//  irrecv.enableIRIn(); // Старт приемника IR

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);

  for (layer = 0; layer < 5; layer++)
  {
    pinMode(LayerPin[layer], OUTPUT);
  }


}   //конец setup

void loop() {

  for (layer = 0; layer < 5; layer++)
  {
    for (g = 2; g < 24; g = g + 3)
    {
      bitToSend ( g, 1);
    }
    sendToRegister ();    // Шлем в регистр
    FadeIn (layer);
    delay (timestop2);
    FadeOut (layer);
    delay (timestop2);
    for (g = 2; g < 24; g = g + 3)
    {
      bitToSend ( g, 0);
    }
    sendToRegister ();    // Шлем в регистр
  }

  for (layer = 4; layer >= 0; layer--)
  {
    for (g = 1; g < 24; g = g + 3)
    {
      bitToSend ( g, 1);
    }
  sendToRegister ();    // Шлем в регистр
  FadeIn (layer);
  delay (timestop2);
  FadeOut (layer);
  delay (timestop2);
  for (g = 1; g < 24; g = g + 3)
  {
    bitToSend ( g, 0);
  }
  sendToRegister ();    // Шлем в регистр
  }
  
  for (layer = 0; layer < 5; layer++)
  {
    for (g = 0; g < 24; g = g + 3)
    {
      bitToSend ( g, 1);
    }
    sendToRegister ();    // Шлем в регистр
    FadeIn (layer);
    delay (timestop2);
    FadeOut (layer);
    delay (timestop2);
    for (g = 0; g < 24; g = g + 3)
    {
      bitToSend ( g, 0);
    }
    sendToRegister ();    // Шлем в регистр
  }

 for (layer = 4; layer >= 0; layer--)
  {
    for (g = 1; g < 24; g = g + 3)
    {
      bitToSend ( g, 1);
    }
  sendToRegister ();    // Шлем в регистр
  FadeIn (layer);
  delay (timestop2);
  FadeOut (layer);
  delay (timestop2);
  for (g = 1; g < 24; g = g + 3)
  {
    bitToSend ( g, 0);
  }
  sendToRegister ();    // Шлем в регистр
  }



//  if (irrecv.decode(&results))
//  {
//    Serial.println(results.value, HEX);
////    translateIR();
//    irrecv.resume(); // Receive the next value
//  }
//
//
//  switch (channel)
//  {
//    case 0:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//      //  wave_all_1_0() ;  ///********** зажечь все по одному подряд
//      //  wave_all_1_1() ;    ///********** потушить все по одному подряд
//      //     effect3 ();
//
//      break;
//    case 1:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//
//      break;
//    case 2:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//
//
//      break;
//    case 3:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//      break;
//    case 4:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//      break;
//    case 5:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//      break;
//    case 6:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//      break;
//    case 7:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//      break;
//    case 8:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//      break;
//    case 9:
//      Serial.print(" CH            ");
//      Serial.println(channel);
//      break;
//
//    default:
//      Serial.println(" other button   ");
//  }

//  delay(500);



}     //******************конец loop


//****функция передачи данных в сдвиговый регистр для зажигания светодиодов
void sendToRegister () {   // Шлем в регистр
  //Отключаем вывод на регистре
  digitalWrite(latchPin, LOW);

  // разбиваем наши 24 бит на 3 байта
  // для записи в первый и второй регистр
  byte register1 = (bitsToSend) >> 16;
  byte register2 = (bitsToSend) >> 8;
  byte register3 = (bitsToSend);

  // "проталкиваем" байты в регистры  - сначало в дальний
  shiftOut(dataPin, clockPin, MSBFIRST, register1);
  shiftOut(dataPin, clockPin, MSBFIRST, register2);
  shiftOut(dataPin, clockPin, MSBFIRST, register3);

  // "защелкиваем" регистр, чтобы биты появились на выходах регистра
  digitalWrite(latchPin, HIGH);
}

void bitToSend (int Point, int State1) {  //Запись в байт каждой точки
  bitWrite(bitsToSend, Point, State1);
}

/*-----( Выбор режима пультом )-----*/
//void translateIR() // takes action based on IR code received
//
//// describing Car MP3 IR codes
//
//{
//
//  switch (results.value)
//
//  {
//
//    case 0xFFA25D:
//      Serial.println(" CH-            ");
//      if (channel == 0)
//      {
//        channel = 9;
//      }
//      else
//      {
//        channel--;
//      }
//      Serial.println(channel);
//      break;
//
//    case 0xFF629D:
//      Serial.println(" CH             ");
//      break;
//
//    case 0xFFE21D:
//      Serial.println(" CH+            ");
//      if (channel == 9)
//      {
//        channel = 0;
//      }
//      else
//      {
//        channel++;
//      }
//      Serial.println(channel);
//      break;
//
//    case 0xFF22DD:
//      Serial.println(" PREV           ");
//      break;
//
//    case 0xFF02FD:
//      Serial.println(" NEXT           ");
//      break;
//
//    case 0xFFC23D:
//      Serial.println(" PLAY/PAUSE     ");
//      break;
//
//    case 0xFFE01F:
//      Serial.println(" VOL-           ");
//      break;
//
//    case 0xFFA857:
//      Serial.println(" VOL+           ");
//      break;
//
//    case 0xFF906F:
//      Serial.println(" EQ             ");
//      break;
//
//    case 0xFF6897:
//      Serial.println(" 0              ");
//      channel = 0;
//      break;
//
//    case 0xFF9867:
//      Serial.println(" 100+           ");
//      break;
//
//    case 0xFFB04F:
//      Serial.println(" 200+           ");
//      break;
//
//    case 0xFF30CF:
//      Serial.println(" 1              ");
//      channel = 1;
//      break;
//
//    case 0xFF18E7:
//      Serial.println(" 2              ");
//      channel = 2;
//      break;
//
//    case 0xFF7A85:
//      Serial.println(" 3              ");
//      channel = 3;
//      break;
//
//    case 0xFF10EF:
//      Serial.println(" 4              ");
//      channel = 4;
//      break;
//
//    case 0xFF38C7:
//      Serial.println(" 5              ");
//      channel = 5;
//      break;
//
//    case 0xFF5AA5:
//      Serial.println(" 6              ");
//      channel = 6;
//      break;
//
//    case 0xFF42BD:
//      Serial.println(" 7              ");
//      channel = 7;
//      break;
//
//    case 0xFF4AB5:
//      Serial.println(" 8              ");
//      channel = 8;
//      break;
//
//    case 0xFF52AD:
//      Serial.println(" 9              ");
//      channel = 9;
//      break;
//
//    default:
//      Serial.println(" other button   ");
//  }
//
//  delay(500);
//
//
//} //END translateIR
//
//
//


// ЭФФЕКТЫ

////************* FadeIn Layer
void FadeIn (int layerF)
{

  for (int i = 0; i < 250; i = i + 10)
  {
    analogWrite(LayerPin[layerF], i);     //регулируем яркость светодиодов
    delay (10);
  }

} //конец FadeIn

////************* FadeOut Layer
void FadeOut (int layerF)
{
  for (int i = 250; i >= 0; i = i - 10)
  {
    analogWrite(LayerPin[layerF], i);     //регулируем яркость светодиодов
    delay (10);
  }

} //конец  FadeOut ()



как только включаю строку 22

 //  irrecv.enableIRIn(); // Старт приемника IR 

так вырубаются слои 0 и 4. В чем может быть дело?

 

popUP
Offline
Зарегистрирован: 09.10.2014

Пожалуйста, вернитесь к вопросу :)

Я поспешался совета, в каждом столбике резистор 220ом  и теперь единовременно горит не более 1 диода в столбике.

Посмотрите, пожалуйста вопрос выше :) 

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

popUP пишет:

Пожалуйста, вернитесь к вопросу :)

Я поспешался совета, в каждом столбике резистор 220ом  и теперь единовременно горит не более 1 диода в столбике.

Посмотрите, пожалуйста вопрос выше :) 

Все правильно, так и должно быть.

popUP
Offline
Зарегистрирован: 09.10.2014

andriano пишет:

popUP пишет:

Пожалуйста, вернитесь к вопросу :)

Я поспешался совета, в каждом столбике резистор 220ом  и теперь единовременно горит не более 1 диода в столбике.

Посмотрите, пожалуйста вопрос выше :) 

Все правильно, так и должно быть.

Вопрос:

Зато появились проблемы с кодом. Добавил IR и все посыпалось.

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

popUP пишет:

Вопрос:

Зато появились проблемы с кодом. Добавил IR и все посыпалось.

1. Это не вопрос, а утверждение

2. И утверждение абсолютно неинформативное: куда добавил? что посыпалось? куда посыпалось? Детали на пол упали, что-ли? Когда добавлял, перемешал как следует?

popUP
Offline
Зарегистрирован: 09.10.2014

Евгений,

Извините, что я так...неконкретно. Просто растерялся

Код

как только включаю строку 22

 //  irrecv.enableIRIn(); // Старт приемника IR 

так вырубаются слои 0 и 4. Без этой строчки код работает. Причем, я пробовал и зажигать только эти слои - не получается. 

Я закомментировал все, что касалось IR и включал по кускам. Вот как только включил эту строку - так и пропадает свечение слоев.

Код без IR устойчиво работает.

В чем может быть дело?

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

Что-то не так с кодом - не открывается. У Вас открывается? Перевставьте ещё раз.