Бегущая строка с помощью ARDUINO И LCD


Имеется аналог Arduino Duemilanove (Freeduino 2009) c ATmega328 на борту,LCD индикатор WH1602B-YYH-CTK на базе HD44780, производства Тайваньской фирмы Winstar Display Co., LTD.

Возникла идея «прокрутить» текстовую строку, произвольной длины на LCD.
В данной статье не рассматриваю способ подключения LCD к Arduino, так как об этом написано много и на этом сайте тоже. Скажу только, что подключено по принципу максимальной экономии пинов. Использовались 7,6,5,4,3,2 пины. Вы, конечно, можете использовать любые другие, которые вам нравятся, с соответствующими изменениями в скетче.
Средствами штатной библиотеки «LiquidCrystalRus.h» ничего вразумительного не получилось. Google-ние в инете так же не дало результатов. ( Возможно плохо искал.) Решил попробовать, что-нибудь спрограммировать.

Скетч получился небольшой (Почти половина — текстовые данные). Конечно, с кириллицей, как всегда, проблемы. Поэтому пришлось добавить несколько, на первый взгляд, не нужных операторов. А с «американскими» буквами, всегда все замечательно.

#include <LiquidCrystalRus.h>
LiquidCrystalRus lcd(7,6, 5, 4, 3, 2);

 const char *strings[] = {/*"Arduino can sense the environment by receiving input from a variety of sensors and can affect its surroundings by controlling lights, motors, and other actuators.",
                   "Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software.",
                   "Если заменить слово 'проблема' на слово 'приключение', то жить становится гораздо интереснее.",
                   "Свобода не там, где нет стен, а там, где их не чувствуешь.",
                   "Есть такие люди, к которым просто хочется подойти и поинтересоваться, сложно ли без мозгов жить./Фаина Георгиевна Раневская",
                   "Лишь возможность осуществить мечту, делает нашу жизнь достойной продолжения./Пауло Коэльо",
                   "Кто в верности не клялся никогда, тот никогда ее и не нарушит. (Платон)",
                   "Это всегда было тайной для меня: как люди могут уважать себя, унижая таких же, как они сами. (Махатма Ганди)",
                   "Человек смотрит в будущее своим прошлым. ( Перл Бак )",
                   "Каждый человек, подобно луне, имеет свою неосвещенную сторону, которую он никому не показывает. (М. Твен)",
                   "Наш мир был неплохим местом до тех пор, пока мы не захотели сделать его лучше. (Джорж Ромеро)"

};*/
                   "Тысячи путей уводят от цели, и лишь один - единственный ведет к ней. (Монтень Мишель Эйкем де)",
                   "Трусость - мать жестокости. (Монтень)",
                   "Сильное воображение порождает событие. (Монтень)",
                   "Самая великая вещь на свете - уметь принадлежать себе. (Монтень)",
                   "Люди ничему не верят так твердо, как тому, о чем они меньше всего знают. (Монтень)",
                   "Часто самый верный способ ввести человека в заблуждение - сказать ему чистую правду. (М.Твен)",
                   "Женись, несмотря ни на что. Если попадется хорошая жена - станешь исключением, если плохая - философом. (Сократ)",
                   "Жизнь подобна карточной игре, в которую ты играешь, не зная правил. (П.Л.Капица)",
                   "У вас не будет второго шанса произвести первое впечатление. (П. Куэльо)",
                   "Человеку свойственно рассуждать мудро, а поступать глупо. (Анатоль Франс)",
                   "Мудрый человек требует всего только от себя, ничтожный же человек - всего от других.",
                   "Не гоняйся за счастьем: оно всегда находится в тебе самом. (Пифагор)",
                   "Чудеса случаются там, где в них верят, и чем больше верят, тем чаще они случаются (Д.Дидро)"

                    };


char string_lcd[] = "                ";
byte num_str = 13; //кол-во прокручевыемых строк

void setup() {

  lcd.begin(16, 2);

}

void loop() {


  for (byte k = 0 ; k < num_str ; k++) { //Перебор строк.

  word len_str  = 0;

    while (*strings[k])  {  // Пока не конец строки ...

           for (byte i=0 ; i < 15 ; i++) string_lcd[i] = string_lcd[i+1] ; // Производим побайтовый сдвиг влево,
           string_lcd[15] = *strings[k] ;                                  // отображаемой на LCD строки, и добавляем
           strings[k]++ ;                                                  // символ в последний байт.
           len_str++ ; // Счётчик длины строки.
             lcd.clear() ;
             lcd.setCursor(1,0);lcd.print("Бегущая строка") ;

            for (byte i=0 ; i < 16 ; i++) {  // Отображаем на LCD посимвольно.

                 lcd.setCursor(i,1);
                 lcd.print(string_lcd[i]);
                 lcd.setCursor(0,1);
                 lcd.print(' ');
             }

           blink( 13 , 190 ) ; // Задержка отображения строки и мигание светодиодом ))

  }

  for (word n = 0 ; n < len_str ; n++) strings[k]-- ; //Возвращаем указатель на начало строки.
                                                      //Иначе строки прокрутятся тольео один раз.
  for (byte n = 0 ; n < 16 ; n++) {
       for (byte i=0 ; i < 15 ; i++) string_lcd[i] = string_lcd[i+1] ; //Добиваем строку пробелами.
       string_lcd[15] = ' ' ;
       lcd.clear() ;
       lcd.setCursor(1,0);lcd.print("Бегущая строка") ;
           for (byte i=0 ; i < 16 ; i++) {

                lcd.setCursor(i,1);
                lcd.print(string_lcd[i]);
                lcd.setCursor(0,1);
                lcd.print(' ');
             }

           blink( 13 , 190 ) ;

  }

   delay(2000);

 }

}

void blink( int Pin , int Delay )  {
   digitalWrite(Pin, HIGH);   // set the LED on
   delay(Delay/2);              // wait
   digitalWrite(Pin, LOW);    // set the LED off
   delay(Delay/2);              // wait

}

Вот есть видео на RUTUB, иллюстрирующее работу скетча. Прошу сильно не возмущаться, т.к. качество видео весьма «телефонное» )).
https://rutube.ru/video/3e5935c47c12e75a56e8e1a2c9bcba11/

В заключение, хотелось бы добавить, что настоятельно не рекомендую добавлять дополнительные строки. Лучше заменить существующие. Т.к. количество ОЗУ в микроконтроллере весьма ограничено. Добавление дополнительных данных приводит к полному забиванию памяти, как следствие, неправильной работе программы и даже к блокированию работы бутлоадера! Реанимировать МК штатными методами становится весьма проблематично !
Для 168 меги количество данных нужно уменьшить, как минимум, в два раза !
Для возможности работы с большим объемом данных можно попробовать использовать библиотеку

<avr\pgmspace.h>< pre="">

, которая позволяет размещать данные в области программного кода и работать с ними.
Если кто имел подобный опыт программирования поделитесь. Конечно «Войну и мир» в Arduino зашить не получится, но раз в 15 объем текста увеличить будет можно.

</avr\pgmspace.h><>

0 комментариев на «“Бегущая строка с помощью ARDUINO И LCD”»

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение