Глючит TM1637 при подключении внешнего питания

Есть arduino nano v.3 есть дисплей TM1637
качаю и ставлю библиотеку GyverTM1637
заливаю demo скетч из библиотеки. Все отлично работает если запитан от usb компа, но стоит подключить внешнее питание на uin 12v так дисплей начинает странно себя вести и глючить, некоторые разряды могут не отображаться или только один разряд из 4х. Может после подачи питания вообще долго не загораться. Дисплей запитан от выхода 5v arduino.
Подскажите в чем может быть проблема? Заранее спасибо)

Очевидно, в питании.

Зелёный провод неправильно присоединён и в строке №23 скетча ошибка.

А вообще, раз уж Вы

так и задавайте вопросы на https://community.alexgyver.ru/ Или с какой целью Вы это делали?

ясно, что в питании. что можно и как продиагностировать?

очевидно проблема не в скече и библиотеке, а в питании

Так я и сказал про зелёный провод.

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

Евгений, не темните. Подскажите чайнику, где проблема?

Проблема в том, что Вы задаёте вопрос, связанный с электроникой и программированием БЕЗ СХЕМЫ устройства и БЕЗ ТЕКСТА программы. Также, крайне желательно фото сборки, т.к. практика показывает, что схема не всегда соответствует тому, что реально собрано.

Откуда нам знать, что там у Вас и как? Вот я и намекаю про “зелёный провод”, про номер строки кода, а до Вас всё никак не дойдёт, что никто не может Вам помочь, пока не увидит что Вы там наворотили.

Ну, а то, что в коде есть проблема, так это очевидно - и не одна. Вы же GyverTM1637 используете.

/*
   Пример вывода на дисплей с регистром TM1637
   показывает все возможности библиотеки GyverTM1637
   AlexGyver Technologies http://alexgyver.ru/
*/

#define CLK 2
#define DIO 3

#include "GyverTM1637.h"
GyverTM1637 disp(CLK, DIO);

uint32_t Now, clocktimer;
boolean flag;

void setup() {
  Serial.begin(9600);
  disp.clear();
  disp.brightness(7);  // яркость, 0 - 7 (минимум - максимум)

}

void loop() {
  runningText();
  scrolls();
  scrollClock();
  twists();
  twistClock();
  ints();
  bytes();
  fadeBlink();
  normClock();
}

void twists() {
  // скручивание массив ЦИФР
  byte digs[4] = {3, 5, 7, 1};
  disp.twist(digs, 50);     // скорость прокрутки 100
  delay(1000);

  // скручивание прицельно (ячейка, БАЙТ, скорость)
  disp.twistByte(0, _1, 50);
  delay(1000);

  // скручивание прицельно (ячейка, ЦИФРА, скорость)
  disp.twist(0, 8, 70);
  delay(1000);

  disp.clear();
  delay(200);
  for (byte i = 0; i < 10; i++) {
    disp.twist(3, i, 20);
    delay(200);
  }

  // скручивание массива БАЙТ
  byte troll[4] = {_t, _r, _o, _l};
  disp.twistByte(troll, 50);
  delay(1000);

  // прицельное скручивание БАЙТА (ячейка, байт, скорость)
  disp.twistByte(2, _G, 50);
  delay(1000);
}

void twistClock() {
  byte hrs = 21, mins = 55;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   // выкл/выкл точки

      if (flag) {
        // ***** часы! ****
        mins ++;
        if (mins > 59) {
          mins = 0;
          hrs++;
          if (hrs > 24) hrs = 0;
        }
        // ***** часы! ****
        disp.displayClockTwist(hrs, mins, 35);    // выводим время
      }
    }
  }
  disp.point(0);   // выкл точки
}

void scrolls() {
  // прокрутка массив ЦИФР
  byte digs[4] = {3, 5, 7, 1};
  disp.scroll(digs, 100);     // скорость прокрутки 100
  delay(1000);

  // прокрутка прицельно (ячейка, ЦИФРА, скорость)
  disp.scroll(0, 8, 200);
  delay(1000);

  disp.clear();
  delay(1000);
  for (byte i = 0; i < 10; i++) {
    disp.scroll(3, i, 50);
    delay(400);
  }

  // прокрутка массива БАЙТ
  byte troll[4] = {_t, _r, _o, _l};
  disp.scrollByte(troll, 100);
  delay(1000);

  // прицельная прокрутка БАЙТА (ячейка, байт, скорость)
  disp.scrollByte(2, _G, 50);
  delay(1000);
}

void bytes() {
  // выводим байты из массива
  byte troll[4] = {_t, _r, _o, _l};
  disp.displayByte(troll);
  delay(1000);

  // выводим байты напрямую (4 в скобках)
  disp.displayByte(_L, _O, _L, _empty);
  delay(1000);

  // выводим байты "прицельно"
  disp.displayByte(3, _O);    // 3 ячейка, буква О
  delay(1000);

  // выводим цифры из массива
  byte hell[4] = {6, 6, 6, 6};
  disp.display(hell);
  delay(1000);

  // выводим цифры напрямую (4 в скобках)
  disp.display(1, 2, 3, 4);
  delay(1000);

  // выводим цифры "прицельно"
  disp.display(0, 9);    // 0 ячейка, цифра 9
  delay(1000);
}

void fadeBlink() {
  // пишем HELL
  disp.displayByte(_H, _E, _L, _L);

  Now = millis();
  while (millis () - Now < 3000) {    // 3 секунды
    for (int i = 7; i > 0; i--) {
      disp.brightness(i);   // меняем яркость
      delay(40);
    }
    for (int i = 0; i < 8; i++) {
      disp.brightness(i);   // меняем яркость
      delay(40);
    }
  }
}

void scrollClock() {
  byte hrs = 15, mins = 0;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   // выкл/выкл точки

      if (flag) {
        // ***** часы! ****
        mins ++;
        if (mins > 59) {
          mins = 0;
          hrs++;
          if (hrs > 24) hrs = 0;
        }
        // ***** часы! ****
        disp.displayClockScroll(hrs, mins, 70);    // выводим время
      }
    }
  }
  disp.point(0);   // выкл точки
}

void normClock() {
  byte hrs = 15, mins = 0;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   // выкл/выкл точки

      // ***** часы! ****
      mins ++;
      if (mins > 59) {
        mins = 0;
        hrs++;
        if (hrs > 24) hrs = 0;
      }
      // ***** часы! ****
      disp.displayClock(hrs, mins);   // выводим время функцией часов
    }
  }
  disp.point(0);   // выкл точки
}

void ints() {
  // тупо отправляем цифры
  disp.displayInt(-999);
  delay(500);
  disp.displayInt(-99);
  delay(500);
  disp.displayInt(-9);
  delay(500);
  disp.displayInt(0);
  delay(500);
  disp.displayInt(6);
  delay(500);
  disp.displayInt(66);
  delay(500);
  disp.displayInt(666);
  delay(500);
  disp.displayInt(6666);
  delay(500);
}

void runningText() {
  byte welcome_banner[] = {_H, _E, _L, _L, _O, _empty, _empty,
                           _e, _n, _j, _o, _y, _empty, _empty,
                           _1, _6, _3, _7, _empty, _d, _i, _S, _P, _l, _a, _y
                          };
  disp.runningString(welcome_banner, sizeof(welcome_banner), 200);  // 200 это время в миллисекундах!
}

добавил схему подключения и код

А какую библиотеку посоветуете для работы с TM1637?

Практически любая без букв “Gyver” в названии в большинстве случаев лучше

1 лайк

Не “тянет” линейный стаб на ардуино. Попробуйте добавить конденсатор прим. 470 мкф 16В на 5В питания ТМ1637.
Или питайте от другого источника

Вот, емае. А мне в ниточках на рисунке привиделось, что от 12В запитан ТМ.

Художника обидеть всякий может)))

1 лайк

Не нужно ничего запитывать от стабилизатора Нано. Поставьте отдельный стабилизатор на дисплей.

1 лайк

Вы имеете ввиду поставить отдельны понижающий преобразователь 12v->5v?

такой Конденсатор 470 мкФ 16 В (электролитический) ChongX VEHT купить в СПб за 8 руб. | SMDX.RU | SmartModules.ru подойдёт?
еще раз извиняюсь, но я чайник. объясните на пальцах как его подключить?

Да.


Если не поможет, делайте как говорят в #17
P.S. И это будет лучший вариант

PPS. И, кстати, если всё же будете дисплей запитывать от 5В ардуино, яркость на максимум не ставьте