Вывод букв из переменной на дисплей tm1637

Тема в разделе "Arduino & Shields", создана пользователем Дятел, 2 сен 2021.

  1. Дятел

    Дятел Нерд

    Дисплей 4х разрядный TM1637
    использую стандартную библиотеку
    #include "TM1637.h"
    Проблема:
    никак не вывести буквы на дисплей, если буквы находятся в переменных
    создал массив для вывода
    char display_func[7][6] = {"", "YEar"};

    пробовал вставить в displayByte, выводит, но там только вручную
    disp.displayByte(0, _Y);
    disp.displayByte(1, _E);
    disp.displayByte(2, _a);
    disp.displayByte(3, _r);

    пытался даже так
    // disp.displayByte(0, "_"+display_func[1][0]);

    пробовал display
    disp.display(0,display_func[1][0]);
    disp.display(1,display_func[1][1]);
    disp.display(2,display_func[1][2]);
    disp.display(3,display_func[1][3]);

    Даже так

    char a='Y';
    char b='E';
    char c='A';
    char d='r';
    disp.display(0,a);
    disp.display(1,b);
    disp.display(2,c);
    disp.display(3,d);

    Выводит только Y и то почему то 2й слева знак, а не первый
    И, следом, частично букву A

    Подскажите, как быть
    спасибо
     
  2. b707

    b707 Гуру

    укажите ссылку на гитхаб на свою библиотеку, в стандартной библиотеке "TM1637.h" методов display() displayByte() display_func(0 нет
    И приведите полный скетч, а не какие-то обрывки
     
    Vovka нравится это.
  3. Airbus

    Airbus Радиохулиган Модератор

    А шо там в примерах из библиотеки? Я нашел это
    Код (Text):
    #include "TM1637.h"   // Подключаем библиотеку для работы с модулем
    int8_t DispMSG[] = {1, 2, 3, 4};   // Настройка символов для последующего вывода на дислей
    //Определяем пины для подключения к плате Arduino
    #define CLK 3
    #define DIO 2
    //Создаём объект класса TM1637, в качестве параметров
    //передаём номера пинов подключения
    TM1637 tm1637(CLK, DIO);
    void setup()
    {
      //Инициализация модуля
      tm1637.init();
      //Установка яркости горения сегментов
      /*
         BRIGHT_TYPICAL = 2 Средний
         BRIGHT_DARKEST = 0 Тёмный
         BRIGHTEST = 7      Яркий
      */
      tm1637.set(BRIGHT_TYPICAL);
    }
    void loop()
    {
      //Задание на включение разделителя
      tm1637.point(true);
      //Выводим массив на дисплей
      tm1637.display(DispMSG);
      //Задержка
      delay(1000);
      //Задание на выключение разделителя
      tm1637.point(false);
      //Выводим массив на дисплей
      tm1637.display(DispMSG);
      //Задержка
      delay(1000);
    }
     
  4. b707

    b707 Гуру

    я такого не нашел, ссылку дай
     
  5. Дятел

    Дятел Нерд

    к сожалению, где скачал - не помню.
    могу выложить файл сюда в форум.
    так вроде понятно или вы загрузить себе хотите? а то скетч большой, надо вырезать много.

    примеры изучал, такого tm1637.display(DispMSG); нет, это работает, но и беда в том, что только с цифрами

    int8_t DispMSG[] = {1, 2, 3, 4}; // Настройка символов для последующего вывода на дисплей

    попробовал так:

    char DispMSG[] = {'r', 'r', 'r', 'r'}; // Настройка символов для последующего вывода на дисплей
    disp.display(DispMSG);

    не прокатывает

    Работает вот так, но это с эффектами и долго. Если ускорить, то некрасиво
    static byte buff[4] = {_S, _H, _O, _P};

    for (uint8_t i = 0; i < 4; i++)
    {
    disp.twistByte(i, buff, 70);
    delay(100);
    }
     
  6. b707

    b707 Гуру

    сорри, а вы вообще понимаете, как это работает? Семисегментный индикатор не умеет отображать произвольные символы, он может показать только то, что в нем заранее запрограммировано. Чего вы пытаетесь добиться. отправляя туда символы 'r' ? Вы уверены. что они есть в библиотеке?
     
  7. a1000

    a1000 Гуру

    Скачайте библиотеку от Гайвера
    https://alexgyver.ru/tm1637_display/
    И сделайте так
    Код (C++):
    #define CLK 2
    #define DIO 3

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



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

      byte troll[4] = {_Y, _E, _a, _r};
      disp.displayByte(troll);
      delay(1000);
     
    }

    void loop() {
    }
     
  8. b707

    b707 Гуру

    добавка, вроде нашел я ваш вариант библиотеки, вот этот?
    https://github.com/Seeed-Studio/Seeed_Grove_4Digital_Display_g

    смотрим в файл
    TM1637.cpp
    там в самом начале есть табличка символов, которые поддерживаются дисплеем
    Код (C++):
    static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71};//0~9,A,b,C,d,E,F
    как видите, это только цифры и символы a b c d e f
    Никакого символа 'r' тут нет, чтобы его вывести. его нужно сначала закодировать в виде сегментов дисплея
     
  9. a1000

    a1000 Гуру

    У Гайвера, хоть его тут и не любят, уже всё есть
    Код (C++):
    /************** БУКВЫ И СИМВОЛЫ *****************/
    #define _A 0x77
    #define _B 0x7f
    #define _C 0x39
    #define _D 0x3f
    #define _E 0x79
    #define _F 0x71
    #define _G 0x3d
    #define _H 0x76
    #define _J 0x1e
    #define _L 0x38
    #define _N 0x37
    #define _O 0x3f
    #define _P 0x73
    #define _S 0x6d
    #define _U 0x3e
    #define _Y 0x6e
    #define _a 0x5f
    #define _b 0x7c
    #define _c 0x58
    #define _d 0x5e
    #define _e 0x7b
    #define _f 0x71
    #define _h 0x74
    #define _i 0x10
    #define _j 0x0e
    #define _l 0x06
    #define _n 0x54
    #define _o 0x5c
    #define _q 0x67
    #define _r 0x50
    #define _t 0x78
    #define _u 0x1c
    #define _y 0x6e
    #define _- 0x40
    #define __ 0x08
    #define _= 0x48
    #define _empty 0x00
    #define _0 0x3f
    #define _1 0x06
    #define _2 0x5b
    #define _3 0x4f
    #define _4 0x66
    #define _5 0x6d
    #define _6 0x7d
    #define _7 0x07
    #define _8 0x7f
    #define _9 0x6f
     
    Andy16 нравится это.
  10. b707

    b707 Гуру

    Это понятно. проблема ТС в другом.
    Он не понимает, что семисегментик не умеет непосредственно выводить символы.
    Смотрите, у Гайвера тоже, чтобы напечатать "Year" - нужно задавать строку
    Код (C++):
    byte troll[4] = {_Y, _E, _a, _r};
     
    а не
    Код (C++):
    byte troll[4] = {'Y', 'E', 'a', 'r'};
     
     
    a1000 нравится это.
  11. a1000

    a1000 Гуру

    Согласен. По этому пусть берёт готовую библиотеку и не сильно напрягая мозг, пользуется готовыми решениями. Надеюсь не заблудится.
     
    Дятел и b707 нравится это.
  12. Дятел

    Дятел Нерд

    1. Пожалуйста, не придирайтесь к мелочам.
    2. каких из указанных мною символов нет в библиотеке? ну это так, ради любопытства.
    спасибо, НО
    и на моей библиотеке такая конструкция работает.
    Но это не совсем то, что хотелось бы. Пока пришлось сделать все вручную, без переменных

    Пришлось все же скачать Гайверовскую библиотеку, так как в конструкции
    int z= 1234;
    disp.displayInt(z);
    когда z из переменной (данные от часов текущий год) 2021 почему-то пропадал 0. (просто пустое место вместо цифры)
    После установки Гайверовсой библиотеки все заработало как надо
     
  13. Дятел

    Дятел Нерд

    понимаю, я не понимаю, почему библиотека не может этого исправить :)
     
  14. b707

    b707 Гуру

    это не мелочи. Именно из-за того. что вы этого не понимаете - у вас и не работает
    По символам - например, символ 'r' библиотека не поймет. Надо задавать как _r - тогда поймет.

    потому что этого в библиотеку никто не заложил. Допишите - будет работать
     
    Последнее редактирование: 2 сен 2021
  15. b707

    b707 Гуру

    вы, наверно, хотели выводить строчку символов из переменной? - это так работать не будет.
    Вам нужно написать функцию, которая будет преобразовывать каждый символ в соответвующий макрос для дисплея, то есть 'r' -> _r

    хотя... посмотрите гайверовскую либу получше. может гайвер это уже написал
     
  16. Дятел

    Дятел Нерд

    раз уж я такой лентяй, прошу вас помочь вывести на экран символ M, а точнее, его чем-то заменить, так как? понятно, что M вывести впрямую он не может. Ну что то похожее.
    Вот допустим составить из двух разрядов n и свой символ, который состоит из черточки посередине "-" и справа вниз от нее черточки вниз
    вот как на картинке.
    1493106479_tm1637_1.jpg
    [​IMG]
    коряво, но лучше не придумал. А вообще, Нужно вывести слово: Min
    Не смог найти понятного описания как сформировать нужный символ в нужный код.

    Спасибо, но понимаю :)
    Да, вот этого я как раз и не мог понять, что нет такой очевидной возможности. Пока у меня не тот уровень :))))))

    Да казалось очевидно, что можно взять слово до 4х букв и воткнуть его в дисплей. Это же очевидно.
    Но раз все оказалось так не просто, то пришлось просто написал вывод каждой строки вручную. Типа:
    disp.displayByte(0,_Y);disp.displayByte(1,_E);disp.displayByte(2,_A);disp.displayByte(3,_r);
    YEAr
    Гайвер не написал! :))
     
    Последнее редактирование: 2 сен 2021
  17. akl

    akl Гуру

    возьми экран lcd1602. Пихать слова в сегментный индикатор это какая-то порнография
     
    issaom и Andrey12 нравится это.
  18. akl

    akl Гуру

    просто берешь и вместо этого пишешь что-то типа
    byte x = 0b00101011;
    disp.displayByte(0,x);
    только вместо 0b00101011 соответственно ту конфигурацию битов, которая зажжет нужные сегменты
     
    Дятел нравится это.
  19. a1000

    a1000 Гуру

    Это всё потому, что не читаете того, что вам пишут. Я дал вам ссылку на статью Гайвера по работе с данным индикатором. Вы, очевидно, дальше слова "Библиотека" не читали. А зря. В конце есть раздел "Как задать свой символ?", и даже есть ссылка на онлайн генератор символов.
    А вот как на 7 сегментном индикаторе изобразить то, что этот индикатор в принципе не должен изображать - извращайтесь сами. Задумка ваша, вы и ломайте голову. Придумаете что должно гореть, а что нет - онлайн генератор в вашем распоряжении. Не разберётесь с генератором, помогу сгенерировать код для символа. А дизайнерские изыски, это всё за вами.
    Как пример, вывести ту М, что вы нарисовали можно так
    Код (C++):
    #define CLK 2
    #define DIO 3

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



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

      byte troll[4] = {0x54, 0x44, 0x00, 0x00};
      disp.displayByte(troll);
      delay(1000);

    }

    void loop() {
    }
     
    Дятел нравится это.
  20. Дятел

    Дятел Нерд

    Обожаю извращения :)
    А серьезно, lcd1602 - большой. нужен маленький. И цифры у него не так видно.

    спасибо за совет.
    не знал, что просто в двоичном коде можно написать, везде где читал был потом перевод в 0х50, а как - перевести не понял.
    в итоге получилось
    0b01000100
    disp.displayByte(0,_n); disp.displayByte(0,0b01000100);
    но не понравилось
    сделал так
    disp.displayByte(0,0b01110100);disp.displayByte(1,0b01010110);
    1493106479_tm1637_1.jpg
    Тоже коряво, но лучше не придумал

    А совсем в итоге, взял и написал букву H получилось HES а не MES (месяц)
     
    Последнее редактирование: 2 сен 2021