Как написать программу для бегущей строки

Данная статья не претендует на толкование как единственно возможного метода отображения и прокрутки информации на светодиодной матрице. Я с удовольствием выслушаю ваши замечания и предложения по улучшению метода/функций. Данная статья – изложение личного опыта и описание результата, которого я добился.

Немного теории

image

В данной светодиодной матрице находится 64 красных светодиода. Если выводить контакты каждого светодиода отдельно, то понадобится 64 контакта на корпусе матрицы и микроконтроллер с 65 цифровыми портами ввода/вывода. Это нецелесообразно и невыгодно. Поэтому на заводе-изготовителе светодиоды объединяют в матрицы различных размеров (в нашем случае 8х8), то есть в 8 групп по строкам и столбцам следующим образом:

В таком случае нам понадобится лишь 16 цифровых вводов/выводов. Например, чтобы зажечь светодиод в левом верхнем углу, нам нужно на pin13 (см. картинку) подать лог 1, а на pin9 лог 0. Такой способ отображения называется статическая индикация.

LedshowTW как изменить данные USB

«Хорошо, а если нам, например, нужно зажечь несколько светодиодов в разных позициях матрицы, а все остальные оставить выключенными?» — спросите Вы. При статической индикации это не представляется возможным. Для этого нужно использовать динамическую индикацию.

Динамическая индикация

Быстро мелькающий объект кажется человеческому глазу постоянно светящимся. Это свойство человеческого глаза – инертность. Как вы догадались, именно на этом свойстве и основан метод вывода информации в светодиодной матрице. Например, чтобы вывести на «экран» некий символ, нужно последовательно, проходя все «пиксели» матрицы с высокой скоростью, включать светодиод в нужном месте.

Условия, которые необходимо соблюдать при программировании матриц динамической индикации:
1. Длительность отображения каждого столбца/строки («пикселя» в моем случае) постоянна, одинакова для всех столбцов/строк («пикселей» в моем случае).
2. Частота смены столбцов/строк («пикселей» в моем случае) не меняется.

Принцип действия прошивки микроконтроллера

Признаюсь, когда у меня появилась отладочная плата на МК Atmega1280 и светодиодная матрица, я и понятия не имел что такое динамическая индикация и для чего она нужна. До понимания необходимости ее использования я дошел методом проб и методом «тыка».

Принцип действия прошивки:

1. Вывод символа на экран

Давайте представим, что наша светодиодная матрица – это двухмерный массив размерностью I на J, совпадающей с размерностью нашей матрицы. В нашем случае это 8 на 8 пикселей. Итак, есть двухмерный массив типа boolean. К примеру:

boolean A[8][8] =

В цикле мы проверяем, если элемент массива A[i][j]=1, тогда включаем светодиод на матрице, находящийся в позиции (I;J), делаем паузу на отображения светодиода и выключаем светодиод в позиции (I;J). В результате работы программы по такому алгоритму на экране матрицы выведется символ «А» (в двумерном массиве именно этот символ отображен). Назовем этот алгоритм «Вывод на экран». Итак, с выводом информации на экран с помощью динамической индикации разобрались.

Бесплатный видео урок по Ledshow — настройка бегущей строки

2. Прокрутка информации на экране

Конечно, классно выводить на экран неподвижную информацию, но было бы интереснее «оживить» ее – заставить передвигаться. Рассмотрим алгоритм перемещения информации:

Вот и весь алгоритм прокрутки информации на экране. Теперь, зная алгоритмы вывода и прокрутки информации с помощью динамической индикации, мы можем приступить к практике.

Подключение матрицы к отладочной плате

Каждый из 16ти выводов матрицы пронумерован. В соответствии этим номерам были подпаяны и выведены 8 контактов, отвечающих за строки, и 8 контактов, отвечающих за столбцы. У меня, например, матрица подключена так:

Выводы, отвечающие за строки 23,25,27,29,31,33,35,37 – это номера выводов ножек микроконтроллера;
Выводы, отвечающие за столбцы 39,41,43,45,47,49,51,53 — это номера выводов ножек микроконтроллера.

Программирование

Программирование и прошивка микроконтроллера производится в среде разработки Arduino IDE.

Что необходимо знать для понимания кода программы, написанного ниже:

Функция pinMode()
Устанавливает режим работы заданного вход/выхода(pin) как входа или как выхода.
pinMode(pin, mode), где pin: номер вход/выхода(pin), который Вы хотите установить; mode: режим одно из двух значение — INPUT или OUTPUT, устанавливает на вход или выход соответственно.

Функция digitalWrite()
Подает HIGH или LOW значение на цифровой вход/выход (pin).
digitalWrite(pin, value), где pin: номер вход/выхода(pin); value: значение HIGH или LOW

Функция delayMicroseconds()
Останавливает выполнение программы на заданное в параметре количество микросекунд (1 000 000 микросекунд в 1 секунде).
delayMicroseconds(us), где us: количество микросекунд, на которое приостанавливается выполнение программы. (unsigned int)

Читайте также:
Как запустить 2 программы

Структура любой программы (скетча, так как в среде разработки ардуино программы называются именно так) имеет следующий вид:

void setup() < … >void loop()

В функции setup() производятся настройки портов ввода/вывода МК, настройка подключенных устройств к МК, периферии МК, а так же выполняется все то, что нужно выполнить ОДИН раз.
В функции loop() пишется тело программы, которое будет выполняться циклически, пока микроконтроллер включен.

Выполним настройку выводов микроконтроллера. Состояний портов ввода/вывода существует два вида: настроен на вход либо на выход. В нашем случае нужно настроить на выход.

const int row[8]=; // Помните 8 выводов, отвечающих за строки и const int col[8]=; // столбцы? А вот и они. void setup() < for (int i=0; ifor (int i=0; i >

Давайте теперь реализуем алгоритмы, которые я описал выше. Итак, мы имеем двухмерный массив:

boolean A[8][8] =

Напишем функцию, которая реализует алгоритм «Вывод на экран».

int v=3; //Скорость прокручивания информации. То есть по сути это количество итераций цикла отрисовки информации в матрице int dms=400; //Скорость обновления «пикселей». То есть время, когда светодиод находится во включенном состоянии.

Чем оно больше, тем более заметнее глазу будет мерцание изображения void paint(boolean screen[8][8], int v) //В качестве параметров передаем матрицу и параметр v < int i, j; for (int c=0; c else < digitalWrite(row[i], HIGH); digitalWrite(col[j], LOW); delayMicroseconds(dms); digitalWrite(row[i], HIGH); digitalWrite(col[j], LOW); >// Иначе выключить светодиод в проверяемой позиции, задержать включенным, обновить экран. (даже если светодиод и был выключенным в этой позиции, то все равно его нужно «выключить» для того, чтобы проверка в цикле и действия проходили с одинаковой задержкой. Если в позиции 1 – то выполняются действия, если в позиции 0 – все равно должно что-то выполнится либо выполнится задержка, сопоставимая с задержкой выполнения включения светодиода) > > >

Напишем функцию, которая реализует алгоритм «Прокрутка информации».

void scroll(boolean screen[8][8]) // В качестве параметра передаем наш двухмерный массив < boolean buf[8][1]; for (int i=0; ifor (int i=0; i for (int i=0; i >

Теперь приведу полный код программы:

const int row[8]=; const int col[8]=; int v=3; int dms=400; boolean A[8][8] = ; void setup() < for (int i=0; ifor (int i=0; i > void loop() < paint(A, v); scroll(A); >void paint(boolean screen[8][8], int v) < int i, j; for (int c=0; c else < digitalWrite(row[i], HIGH); digitalWrite(col[j], LOW); delayMicroseconds(dms); digitalWrite(row[i], HIGH); digitalWrite(col[j], LOW); >> > > void scroll(boolean screen[8][8]) < boolean buf[8][1]; for (int i=0; ifor (int i=0; i for (int i=0; i >

Вот и все. Заливайте эту программу в свой микроконтроллер и наблюдайте, как буква «А» будет «бежать» влево. Добавлю, что массивом размерностью 8 на 8 элементов ограничиваться не стоит. Например, я использовал массив размером 8 на 86. Написал в нем целую фразу, как видно на этом видео.

  • arduino
  • динамическая индикация
  • светодиодная матрица

Источник: habr.com

Урок 16.1. Бегущая строка на русском языке. Arduino и MAX7221.

.Урок 16.1. Бегущая строка на русском языке. Arduino и MAX7221.

Сегодня в уроке научимся выводить текст на русском языке на матрицу MAX7221. Для более быстрой смены текста в бегущей строке «научим» Arduino выводить на матрицу полученный текст из монитора порта . Как подключать матрицу MAX7221 к Arduino, рассказывал в предыдущем уроке: Подключаемматрицу Max72xx (MAX7219) к Arduino. Простая анимация.

Подключение светодиодной матрицы 8×8 на MAX7219 к Arduino.

Для выполнения Arduino урока нам понадобится:

Для подключения необходимо пять проводов, которые чаше всего идут в комплекте с матрицей. Подключаем вывод CLK (MAX7219 ) к выводу 13 (Arduino), вывод CS подключаем к выводу 9, вывод DIN подключаем к выводу 11. Питание подключается VCC к +5В и GND к GND.

Схема подключения модуля с 4 матрицами к Arduino UNO .

Схема подключения модуля с 4 матрицами к Arduino UNO.

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO будет вот такой.

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO
Установка библиотек Adafruit_GFX и Max72xxPanel. И настройка для вывода русского текста.

Существует несколько библиотек, доступных для управления матрицей на драйвере MAX7219 . В этом уроке я буду использовать две библиотеки: Adafruit_GFX и Max72xxPanel .

Для установки этих библиотек выполните следующие действия.
1. Откройте Arduino IDE и перейдите в раздел Скетч > Подключить библиотеку > управление библиотеками .

Должен открыться менеджер библиотек.

2. Укажите “ GFX” в поле поиска, выберете из списка и установите библиотеку от Adafruit GFX.

Аналогично установите вторую библиотеку, для этого в поле поиска укажите “GFX”

3. Библиотеку Max72xxPanel можно установить из zip архива. Для этого скачайте архив с библиотекой отсюда или внизу урока из раздела «Файлы для скачивания». В Arduino IDE перейдите в раздел Скетч > Подключить библиотеку > Добавить .ZIP библиотеку . Выбираете архив с библиотекой.

Читайте также:
Как сбросить программу на посудомоечной машине мидеа

 Библиотеку Max72xxPanel можно установить из zip архива

4. Скачать файл glcdfont.c и заменить его в библиотеке Adafruit-GFX. Библиотека находится C:UsersUSERDocumentsArduinolibrariesAdafruit_GFX_Library. У вас путь до библиотеки может отличаться. Вы также можете скачать библиотеку Adafruit-GFX подготовленную для работы с русским текстом внизу статье есть раздел с материалами для урока.

5. В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */ String utf8rus(String source) < int i,k; String target; unsigned char n; char m[2] = < ‘0’, ‘’ >; k = source.length(); i = 0; while (i < k) < n = source[i]; i++; if (n >= 0xC0) < switch (n) < case 0xD0: < n = source[i]; i++; if (n == 0x81) < n = 0xA8; break; >if (n >= 0x90 n case 0xD1: < n = source[i]; i++; if (n == 0x91) < n = 0xB8; break; >if (n >= 0x80 n > > m[0] = n; target = target + String(m); > return target; >

6. После установки библиотек перезагрузите среду разработки Arduino.

Пример вывода русского текста на матрицу MAX7221.

Пример вывода русского текста на матрицу MAX7221.

Пример 1. Выводим русский текст на матрицу. Текст хранится в переменной. Для смены текста нужно постоянно загружать скетч в Arduino.

В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

#include // Подключаем библиотеку SPI #include // Подключаем библиотеку Adafruit_GFX #include // Подключаем библиотеку Max72xxPanel int pinCS = 9; // Указываем к какому выводу подключен контакт CS int numberOfHorizontalDisplays = 1; // Количество матриц по горизонтали int numberOfVerticalDisplays = 4; // Количество матриц по-вертикали Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = «»; int wait = 100; // интервал, чем меньше тем бытрее бежит строка int spacer = 1; // Промежуток между символами (кол-во точек) int width = 5 + spacer; // Ширина шрифта составляет 5 пикселей void setup() < Serial.begin(9600); tape = utf8rus(«Привет мир! Портал ПК»); matrix.setIntensity(5); // Задаем яркость от 0 до 15 matrix.setRotation(3); // Направление текста 1,2,3,4 >void loop() < for ( int i = 0 ; i < width * tape.length() + matrix.width() — spacer; i++ ) < matrix.fillScreen(LOW); int letter = i / width; // номер символа выводимого на матрицу int x = (matrix.width() — 1) — i % width; int y = (matrix.height() — 8) / 2; // отцентрировать текст по вертикали while ( x + width — spacer >= 0 letter >= 0 ) < if ( letter < tape.length() ) < matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1); >letter—; x -= width; > matrix.write(); // выведим значения на матрицу delay(wait); > > /* Функция перекодировки русских букв из UTF-8 в Win-1251 */ String utf8rus(String source) < int i, k; String target; unsigned char n; char m[2] = < ‘0’, ‘’ >; k = source.length(); i = 0; while (i < k) < n = source[i]; i++; if (n >= 0xC0) < switch (n) < case 0xD0: < n = source[i]; i++; if (n == 0x81) < n = 0xA8; break; >if (n >= 0x90 n case 0xD1: < n = source[i]; i++; if (n == 0x91) < n = 0xB7; break; >if (n >= 0x80 n > > m[0] = n; target = target + String(m); > return target; >

При выводе русского текста использовать функцию utf8rus() .

Как видно, вывод на матрицу не сильно отличается от вывода русского текста на SSD1306 OLED-диспл ей: SSD1306OLED-дисплей, вывод текста на русскомязыке в Arduino IDE

Пример 2. Выводим на матрицу русский текст, полученный из монитора порта.

Выводим на матрицу русский текст, полученный из монитора порта.

За основу возьмем первый пример. Добавим в него функцию, которая посимвольно считывает значения с монитора порта. Сохраним полученный результат в переменную для вывода значения на MAX7221. А остальная часть кода остается без изменений.

#include // Подключаем библиотеку SPI #include // Подключаем библиотеку Adafruit_GFX #include // Подключаем библиотеку Max72xxPanel int pinCS = 9; // Указываем к какому выводу подключен контакт CS int numberOfHorizontalDisplays = 1; // Количество матриц по горизонтали int numberOfVerticalDisplays = 4; // Количество матриц по-вертикали Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = «»; int wait = 100; // интервал, чем меньше тем бытрее бежит строка int spacer = 1; // Промежуток между символами (кол-во точек) int width = 5 + spacer; // Ширина шрифта составляет 5 пикселей void setup() < Serial.begin(9600); tape = utf8rus(«Привет мир! Портал ПК»); matrix.setIntensity(5); // Задаем яркость от 0 до 15 matrix.setRotation(3); // Направление текста 1,2,3,4 >void loop() < if (Serial.available()) < // получили данные tape = utf8rus(Serial_Read()); // Считываем и сохроняе в переменную >for ( int i = 0 ; i < width * tape.length() + matrix.width() — spacer; i++ ) < matrix.fillScreen(LOW); int letter = i / width; // номер символа выводимого на матрицу int x = (matrix.width() — 1) — i % width; int y = (matrix.height() — 8) / 2; // отцентрировать текст по вертикали while ( x + width — spacer >= 0 letter >= 0 ) < if ( letter < tape.length() ) < matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1); >letter—; x -= width; > matrix.write(); // выведим значения на матрицу delay(wait); > > String Serial_Read() < unsigned char c; // переменная для чтения сериал порта String Serial_string = «»; // Формируемая из символов строка while (Serial.available() >0) < // Если в сериал порту есть символы c = Serial.read(); // Читаем символ if (c == ‘n’) < // Если это конец строки return Serial_string; // Возвращаем строку >Serial_string = Serial_string + String(char(c)); //Добавить символ в строку > return Serial_string; > /* Функция перекодировки русских букв из UTF-8 в Win-1251 */ String utf8rus(String source) < int i, k; String target; unsigned char n; char m[2] = < ‘0’, ‘’ >; k = source.length(); i = 0; while (i < k) < n = source[i]; i++; if (n >= 0xC0) < switch (n) < case 0xD0: < n = source[i]; i++; if (n == 0x81) < n = 0xA8; break; >if (n >= 0x90 n case 0xD1: < n = source[i]; i++; if (n == 0x91) < n = 0xB7; break; >if (n >= 0x80 n > > m[0] = n; target = target + String(m); > return target; >

Читайте также:
Программа которая определяет возраст по лицу

Для проверки работы откроем монитор порта в Arduino IDE. И напишем нужный текст.

Для проверки работы откроем монитор порта в Arduino IDE. И напишем нужный текст.

После чего нужно нажать кнопку « Отправить». Вот, что получается.

Один минус. Пока не закончится показ предыдущего текста, новый не будет выводиться на матрицу. Это особенности работы матрицы MAX7221.

Матрицу можно сделать гораздо больше , и на нее выводить текст с анимацией из предыдущего урока. Пишите в комментарии, какой проект на Arduino вы бы хотели увидеть с использованием матриц MAX7221 и Arduino.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

Понравилась статья? Поделитесь ею с друзьями:

Источник: portal-pk.ru

LCD 1602 бегущая строка на Ардуино

LCD 1602 Arduino бегущая строка

Напомним, что дисплей имеет 16 символов в одной строке (от 0 до 15), но в контроллере дисплея заложена память на 40 символов в строке. При использовании дисплея с модулем I2C для сборки схемы вам потребуется всего 4 провода. После подключения дисплея, загрузите следующий код. Пояснения к программе даны ниже, если у вас останутся вопросы, вы можете их оставить в комментариях к посту.

Скетч бегущей строки на LCD 1602 I2C

#include «Wire.h» // библиотека для протокола I2C #include «LiquidCrystal_I2C.h» // библиотека для дисплея LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя дисплею void setup() < LCD.init(); // инициализация LCD дисплея LCD.backlight(); // включение подсветки дисплея LCD.print(«HELLO!»); // выводим надпись delay(1000); > void loop() < // передвигаем надпись вправо for (int i = 0; i < 10; i++) < LCD.setCursor(i, 0); LCD.print(«HELLO!»); delay(200); LCD.clear(); // очищаем экран > // передвигаем надпись влево for (int i = 10; i > 0; i—) < LCD.setCursor(i, 0); LCD.print(«HELLO!»); delay(200); LCD.clear(); // очищаем экран > >

Пояснения к коду:

  1. каждый раз в цикле for меняется переменная i , а значит и положение курсора. Через 200 мс надпись очищается и выводится в новом месте;
  2. бегущие буквы на дисплее можно сделать и с помощью цикла while Arduno.

В следующем примере используем команды из стандартной библиотеки LiquidCrystal.h — подключать ее в скетче не обязательно. Используем функции scrollDisplayRight и scrollDisplayLeft для перемещения строчки на дисплее в цикле for. При этом нам уже не требуется указывать местоположение надписи с помощью команды setCursor. Загрузите из следующего примера программу с перемещением надписи на дисплее.

Скетч для бегущей строчки на жк дисплее

#include «Wire.h» // библиотека для протокола I2C #include «LiquidCrystal_I2C.h» // библиотека для дисплея LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя дисплею void setup() < LCD.init(); // инициализация LCD дисплея LCD.backlight(); // включение подсветки дисплея LCD.print(«HELLO!»); // выводим надпись delay(1000); > void loop() < // передвигаем надпись вправо for (int i = 0; i < 10; i++) < LCD.scrollDisplayRight(); delay(200); > // передвигаем надпись влево for (int i = 10; i > 0; i—) < LCD.scrollDisplayLeft(); delay(200); > >

Пояснения к коду:

  1. условия цикла for можно менять — зависит от количества символов в строчке;
  2. при использовании scrollDisplay уже не требуется очищать экран с помощью команды clear() , что уменьшает размер кода и производительность платы.

(4 оценок, среднее: 5,00 из 5)

Источник: xn--18-6kcdusowgbt1a4b.xn--p1ai

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru