Подключить 60 светодиодов.

Тема в разделе "Arduino & Shields", создана пользователем hatul, 14 апр 2017.

  1. hatul

    hatul Нерд

    Ситуация такова. Свою первую электронную поделку я собрал более 45-ти лет назад.Это была пищалка на одном транзисторе,для обучения азбуки Морзе. И наконец созрел для следующей поделки. Решил что это будут часы на Ардуино Уно. Поискав в интернете нашел приемлимый(читай простой) проект на 4-х светодиодных матрицах.Ну то что в скетче я мало (а точнее ничего) что понял, пояснять не надо. Но как ни странно часы идут,и даже имеют несколько режимов отображения. Это была преамбула. А теперь суть вопроса.Для начала технические вопросы. Если они решатся,будут вопросы по скетчу.
    Решил я их усовершнствовать. Добавить по кругу 60 светодиодов.Св-диоды подключаются через сдвиговый регистр 74HC595 . Если просто зажигать св-диод,и при этом гасить предыдущий,проблем нет. Но по моей задумки предыдущий диод не гасится,то-есть в какой-то момент горят 60 светодиодов. Светодиоды 3-х милиметровые. Примерное потребление- 20 mA . 20х60=120mA . Мощности Ардуины не хватит. Вот и вопрос: как подключить 60 св-диодов? Схемы,что я нашел,показывают как подключить либо через регистр,либо через транзистор. Как их объединить? Как я понял понадобятся 60 транзисторов. Возможно есть какое-то более простое решение? Желательно всё-таки через 74НС595,они у меня уже есть. Возможны решения и через какие-либо драйвера,но придется заказывать в интернете и ждать полтора-два месяца!
     
    arkadyf нравится это.
  2. rkit

    rkit Гуру

    Берете достаточный блок питания, и подключаете параллельно к своей цепи. Транзисторы в регистрах достаточные.
     
    hatul нравится это.
  3. hatul

    hatul Нерд

    То есть примерно так
    Тр-р12 [640x480].jpg

    И ардуина потянет 60 светодиодов?
     
  4. rkit

    rkit Гуру

    не к vcc, а к 5v
    на vcc уно нужно не меньше 7 вольт.
     
    hatul нравится это.
  5. hatul

    hatul Нерд

    А,ну правильно. Это я ступил. Думаю одно ,а пишу другое. Регистр я же подключаю к 5 вольтам. А на матрицу ,я так понимаю,можно подать напряжение вообще не касаясь Ардуины. К Ардуине подключаем только DIN , CLK и CS.
     
  6. rkit

    rkit Гуру

    gnd обязательно и везде
     
    hatul нравится это.
  7. hatul

    hatul Нерд

    Огромное спасибо за помощь! С технической составляющей разобрался. Ещё бы с кодом разобраться.
    Вот скетч,часы на матрице. Как заставить светодиоды загораться по одному,каждую секунду.
    Почему-то сюда вставить код не могу. Добавил во вложения.
     

    Вложения:

    • clock_8x32.ino
      Размер файла:
      43,6 КБ
      Просмотров:
      313
  8. REm

    REm Гик

    будет удобнее если вы код вставите текстом, а не файлом
     
    hatul нравится это.
  9. hatul

    hatul Нерд

    Так в том то и дело,что не получается. Пытаюсь вставить,выходит сообщение,что то типа " ошибка! слишком длинное сообщение." Поэтому и пришлось выкладывать вложением.
     
  10. REm

    REm Гик

    hatul нравится это.
  11. hatul

    hatul Нерд

    Как подключаются регистры я разобрался. И даже твой скетч переделал,чтобы зажигать светодиоды по одному. Я не знаю как это совместить со скетчем часов.
    Здесь на два регистра,ещё добавить уже не проблема. Вот как этот скетч вставить в скетч часов.
    Код (C++):
    const byte latchPin = 8;
    const byte clockPin = 12;
    const byte dataPin = 7;


    //byte number[] = {0b11111111, 0b10011111, 0b1000110, 0b01100010, 0b00110011, 0b00101010, 0b00001010, 0b11100011, 0b00000010, 0b00100010};
    //
    byte number2[] ={0b10000010, 0b10011111, 0b1000110, 0b01100010, 0b00110011, 0b00101010, 0b00001010, 0b11100011, 0b00000010, 0b00100010};
    byte number[] = {0b00000001, 0b00000011, 0b00000111, 0b00001111, 0b00011111, 0b00111111, 0b01111111, 0b11111111, 0b00000000};
    void setup()
    {

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

    }
    void loop() {

      digitalWrite (latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[8]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);

      digitalWrite (latchPin, HIGH);

       delay(1000);

       digitalWrite (latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[8]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[1]);


      digitalWrite (latchPin, HIGH);
       delay(1000);
        digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[8]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[2]);


      digitalWrite (latchPin, HIGH);
       delay(1000);
     
       digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[8]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[3]);


      digitalWrite (latchPin, HIGH);
       delay(1000);
        digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[8]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[4]);


      digitalWrite (latchPin, HIGH);
       delay(1000);
       digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[8]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[5]);


      digitalWrite (latchPin, HIGH);

       delay(1000);

       digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[8]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[6]);


      digitalWrite (latchPin, HIGH);
       delay(1000);
        digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[8]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);

      digitalWrite (latchPin, HIGH);
       delay(1000);
     
       digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);


      digitalWrite (latchPin, HIGH);
       delay(1000);
        digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[1]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);



      digitalWrite (latchPin, HIGH);
       delay(1000);
        digitalWrite (latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[2]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);


      digitalWrite (latchPin, HIGH);

       delay(1000);

       digitalWrite (latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[3]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);


      digitalWrite (latchPin, HIGH);
       delay(1000);
        digitalWrite (latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[4]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);


      digitalWrite (latchPin, HIGH);
       delay(1000);
     
       digitalWrite (latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[5]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);

      digitalWrite (latchPin, HIGH);
       delay(1000);
     
    digitalWrite (latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[6]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);

      digitalWrite (latchPin, HIGH);
       delay(1000);
     
        digitalWrite (latchPin, LOW);

      shiftOut(dataPin, clockPin, MSBFIRST, number[0]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);
      shiftOut(dataPin, clockPin, MSBFIRST, number[7]);


      digitalWrite (latchPin, HIGH);
       delay(1000);

     
    }
    Или как-то по другому подключить светодиоды.
     
  12. REm

    REm Гик

    вот тут не могу посоветовать ничего, Ваш код для меня очень непонятен, в следствии примитивности мышления моего.
    Просто хочу заметить что delayочень паразитная функция, её нужно исключить
    http://arduino.ru/tutorials/BlinkWithoutDelay
    тут можно посмотреть как это сделать (по теме есть ещё более разумный код)
    и нарисуйте блок схему своего алгоритма. Одного и второго
     
    hatul нравится это.
  13. hatul

    hatul Нерд

    Так это-ж твой код. Я просто подправил его,чтобы зажигать не цифры на семисегменте, а 16 светодиодов. 16-потому,что просто на макетке больше не помещаются. А схема часов очень проста ,подключаем матрицу:
    CS -> 10pin , DIN -> 11 pin , CLK -> 13 pin , Vcc -> 5v , GND -> GND .
    DS3231 : SDA -> pin A4 , SCL -> pin A5 .
    Я даже кнопки для настройки не подключал. А регистры и светодиоды ещё никак не подключал. Ещё не придумал как. Тренируюсь пока на другой ардуинке,на макетной плате.
     
  14. REm

    REm Гик

    я о коде часов, который большим файлом выложен