Подскажите про диоды и транзисторы
- Войдите на сайт для отправки комментариев
Сб, 21/04/2018 - 22:59
Доброго времени суток!
Собираж лед-куб. Слой - 24 светодиода, дешевые китайские 3 мм, параметров не нашел но врядли больше 20 мА каждый.
Каждый слой с общим катодом. Поставил транзисторы BC337 и 100 Ом резистор для ограничения тока на светодиод. Внешнее питание 5в, 1 А.
Когда зажигаю пару диодов - горят ярко, чем больше диодов слоя включено - тем тусклее. Проверял на покеа только на одном слое. Что будет, когда включу все 5 слоев? Мне казалось, что должнот было работать . В чем не прав?
Схема от руки, но вроде понятно

Поделите 5В на 100ом - получите 50мА. Это ток, который Вы даёте на все 24 светодиода! Не маловато? А если ещё и падение на переходе транзистора учесть то вообще 44мАполучается.
Кроме того, каждому диоду нужен свой резистора. так что выбрость этот резистор, посчитайте какой нужен на каждый диод и ставьте.
И еще - не забывайте, что у 595-го ограничение - не более 70мА на корпус.
Спасибо, Евгений , за столь быстрый ответ.
Схему брал с китайской поделки-конструктора который собрал ранее
вот так выглядит в сборе
А сделать хочу вот такой
И просто не представляю себе как к каждому поставить по резистору. Как максимум на 1 колонну из 5 штук.
т.е. между 595 и колонной вставить резистор. А акакой? :) и убрать между транзистором и катодом диодов?
Так же как учесть,что молгут гореть и по 1 диоду в каждом слое
Ну, вообще-то сюда лучше не 595 ставить, а что-нибудь с контролем тока (н.п. TLC5940). Тогда резисторы вовсе не нужны. А так - делайте как хотите, но это неправильно. Токоограничвающий резистор должен быть свой у каждого светодиода.
Токоограничвающий резистор должен быть свой у каждого светодиода.
Точнее сказать, "у каждого светодиода, через который идет ток". При динамической индикации, например, один резистор может использоваться для нескольких светодиодов, ток через которые никогда не течет одновременно.
2popUP: т.е. в Вашем случае все 24 светодиода одного слоя должны гореть строго по очереди, одновременное зажигание двух светодиодов одного слоя недопустимо.
В любом случае схема и скетч должны проектироваться одновременно и быть взаимоувязаны. Судя по описанию проблемы, у Вас этого не происходит: схема сама по себе, скетч сам по себе.
Пробный код для 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
В продолжение темы
кусочек видео работы куба 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/ тем более, что я их для него заказал и жду поставку а диоды уже спаял.
Звездочку хотел собрать чтобы потренироваться с кодом, пока жду микросхемы
Доброго вечера!
В общем и целом следуюя советам мастеров - я таки собрал звездочку. поставил резисторы для каждого столбика. Работает.
Видео 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. В чем может быть дело?
Пожалуйста, вернитесь к вопросу :)
Я поспешался совета, в каждом столбике резистор 220ом и теперь единовременно горит не более 1 диода в столбике.
Посмотрите, пожалуйста вопрос выше :)
Пожалуйста, вернитесь к вопросу :)
Я поспешался совета, в каждом столбике резистор 220ом и теперь единовременно горит не более 1 диода в столбике.
Посмотрите, пожалуйста вопрос выше :)
Все правильно, так и должно быть.
Пожалуйста, вернитесь к вопросу :)
Я поспешался совета, в каждом столбике резистор 220ом и теперь единовременно горит не более 1 диода в столбике.
Посмотрите, пожалуйста вопрос выше :)
Все правильно, так и должно быть.
Вопрос:
Зато появились проблемы с кодом. Добавил IR и все посыпалось.
Вопрос:
Зато появились проблемы с кодом. Добавил IR и все посыпалось.
1. Это не вопрос, а утверждение
2. И утверждение абсолютно неинформативное: куда добавил? что посыпалось? куда посыпалось? Детали на пол упали, что-ли? Когда добавлял, перемешал как следует?
Евгений,
Извините, что я так...неконкретно. Просто растерялся
Код
как только включаю строку 22
// irrecv.enableIRIn(); // Старт приемника IR
так вырубаются слои 0 и 4. Без этой строчки код работает. Причем, я пробовал и зажигать только эти слои - не получается.
Я закомментировал все, что касалось IR и включал по кускам. Вот как только включил эту строку - так и пропадает свечение слоев.
Код без IR устойчиво работает.
В чем может быть дело?
Что-то не так с кодом - не открывается. У Вас открывается? Перевставьте ещё раз.