Страница 1 из 1

Мах7219 7сегмент. метод добавления своих знаков

Добавлено: 18 апр 2020, 21:46
hatul
Решил собрать простенькие часы с температурой на Мах7219 и 7 сегментных индикаторах. Все работает прекрасно. Но не знаю как добавить перед знаком "С" значек "градус" ,чтобы получилось так:
Часы_темп. МАХ7219_7segm.flp

Часы/Темп. на Мах7219_7сегмент.

Добавлено: 18 апр 2020, 22:16
belyx
2Часы_темп. МАХ7219_7segm.flp
Отправлено спустя 6 минут 36 секунд:
а вообще то это пройдёт для индикатора lcd 44780, для этого - вряд ли,попробуйте

Отправлено спустя 5 минут 50 секунд:
когда то экспериментально проверял
[spoiler]
символы для MAX7219.jpg
[/spoiler]

Часы/Темп. на Мах7219_7сегмент.

Добавлено: 18 апр 2020, 23:17
hatul
[ref]belyx[/ref], Направление то верное,проверил-работает.Только в библиотеке нет нужного символа.То что на первой картинке я делал на ТМ1638.Там тоже нет нужного символа. Я открывал библиотеку для ТМ1638 и добавлял код нужного символа. В частности нужный мне символ это Нех 0х63 или двоичный В01100011. И как видно работает. Осталось найти используемую библиотеку и либо добавить символ,либо подменить какую либо не используемую букву.А вот как это сделать я не знаю.

Отправлено спустя 17 минут 16 секунд:
Вот например вставил маленькую о.

Часы/Темп. на Мах7219_7сегмент.

Добавлено: 19 апр 2020, 16:20
Labu559
hatul писал(а): 18 апр 2020, 23:17Только в библиотеке нет нужного символа.
В используемой библиотеке "arduino-Max72xxPanel" вообще нет знакогенератора, в МАХ7219 вшит дешифратор с минимальным набором символом, но штатный блок не использует его, а имеет собственный знакогенератор по совпадению, при чем, извините, не самой лучшей конструкции. Предлагаю Вам самый простой метод добавления своих знаков. Для этого найти в Ардуино ИДЕ при компиляции Вашего проекта [spoiler title=функцию byte _Max7216IntToSevenSegment(int value)]
FunctionMAX7219.png
[/spoiler] и заменить её содержимое следующим кодом

Код: Выделить всё

byte  _Max7216IntToSevenSegment(int value)
{
  if (value == 48) {
    return 126;
  }
  else if (value == 49) {
    return 48;
  }
  else if (value == 50) {
    return 109;
  }
  else if (value == 51) {
    return 121;
  }
  else if (value == 52) {
    return 51;
  }
  else if (value == 53) {
    return 91;
  }
  else if (value == 54) {
    return 95;
  }
  else if (value == 55) {
    return 112;
  }
  else if (value == 56) {
    return 127;
  }
  else if (value == 57) {
    return 123;
  }
  else if (value == 45) {
    return 1;
  }
  else if (value == 65) {
    return 119;
  }
  else if (value == 67) {
    return 78;
  }
  else if (value == 99) {
    return 13;
  }
  else if (value == 100) {
    return 61;
  }
  else if (value == 69) {
    return 79;
  }
  else if (value == 70) {
    return 71;
  }
  else if (value == 72) {
    return 55;
  }
  else if (value == 104) {
    return 23;
  }
  else if (value == 76) {
    return 14;
  }
  else if (value == 79) {
    return 126;
  }
  else if (value == 111) {
    return 29;
  }
  else if (value == 80) {
    return 103;
  }
  else if (value == 114) {
    return 5;
  }
  else if (value == 83) {
    return 91;
  }
  else if (value == 116) {
    return 15;
  }
  else if (value == 85) {
    return 62;
  }
  else if (value == 117) {
    return 28;
  }
  else if (value == 110) {
    return 21;
  }
  else if (value == 42) {
    return 99;
  }
  else return 0;
}
В котором Ваш искомый символ градуса сопоставлен символу звёздочка * и заменена конструкция if на else if (не на много лучше :) ).
В дальнейшем можете воспользоваться приложенной ниже инструкцией в рисунках [spoiler title=для самостоятельного добавления/кодирования желаемых символов.]
ASCII_7seg_MATCH.png
ascii-chars-landscape.jpg
7-Segments-CodeTable.jpg
[/spoiler]
Удачи и весёлых праздников!

Часы/Темп. на Мах7219_7сегмент.

Добавлено: 19 апр 2020, 18:30
belyx

Часы/Темп. на Мах7219_7сегмент.

Добавлено: 19 апр 2020, 18:49
rw6cm
[ref]hatul[/ref],
Если не замарачиваться можно так:
Поставить символ n и заменить в коде при заливке цифру 21 (это символ n) на 99
2020_04_19_18_46_39_pr12_Arduino_1.8.11.png

Часы/Темп. на Мах7219_7сегмент.

Добавлено: 19 апр 2020, 19:08
hatul
[ref]Labu559[/ref],
Класс! Сработало как надо! Огромное спасибо! Сначала,как Вы сказали,заменил полностью на Ваш код.Сработало отлично. Потом,когда вник как это работает, решил просто добавить строку:
else if (value == 42)
{ return 99;
и тоже все работает!

Отправлено спустя 6 минут 5 секунд:
[ref=#ff8000]rw6cm[/ref], Спасибо большое за помощь! Уже
hatul писал(а): 19 апр 2020, 19:02Labu559
научил как сделать.Единственное он подставил * (звездочку).

Часы/Темп. на Мах7219_7сегмент.

Добавлено: 19 апр 2020, 19:23
belyx
[ref]hatul[/ref],
Предлагаю немного изменить название вашей темы: добавить + простой метод добавления своих знаков.

Часы/Темп. на Мах7219_7сегмент.

Добавлено: 19 апр 2020, 19:57
hatul
[ref]belyx[/ref], Да я бы с удовольствием,только я не знаю как редактировать заголовок.

Мах7219 7сегмент. метод добавления своих знаков

Добавлено: 19 апр 2020, 21:57
Labu559
hatul писал(а): 19 апр 2020, 19:08 просто добавить строку:
else if (value == 42)
{ return 99;
и тоже все работает!
Ув. [ref]hatul[/ref], Рад за Вас, однако это не одно и то-же. Если в указанной выше функции, при поиске символа он будет первый (к примеру value == 48 символ 0 ), то в конструкции else if функция прекратит своё выполнение и возвратит байтовое представление этого символа. В оригинальном коде она продолжит поиск неизвестно чего до последней строки, хотя совпадение уже было найдено в первой сроке конструкции if.
Для информации пользователям, точно такой же знакогенератор (функция byte _IntToSevenSegment(int value)) используется в штатном (встроенном) блоке программы "Блок декодирования семисегментного индикатора" папка "Дисплеи", и этот метод применим тут тоже.
P.S. Вопрос исправления конструкции я поднимал несколько лет назад в теме про этот блок, "но ход не дошёл" по Якубовичу. :)

Мах7219 7сегмент. метод добавления своих знаков

Добавлено: 19 апр 2020, 22:26
hatul
[ref]Labu559[/ref], Еще раз огромное спасибо! По поводу последнего поста,это ну прямо по анкдоту"дяденька,это ты с кем щас разговаривал!?" Если бы я все это знал...! Кстати я маленько ошибся.Я добавлял без else . Вот так:
if (value == 42)
{ return 99;
Возможно так более правильно. Еще раз повторюсь-я пробую методом тыка. Вы показали как НАДО делать,а я уже тыкаю наугад,что получится.Естественно Ваш метод,как основной,законсперирован,и подшит в памятную тетрадку.