progmem_menu: как на Arduino с библиотекой LiquidMenu отображать строки, сохраненные во флеш-памяти

Добавлено 9 мая 2018 в 14:44

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

Обычно все переменные хранятся в RAM (которая в ATmega328 составляет 2 килобайта). Чтобы сохранить ОЗУ, большие переменные, такие как массивы символов, могут храниться вместе с программой во флеш-памяти (которая в ATmega328 составляет 32 КБ). По сути, переменная добавляется с модификатором "const" и добавленным ключевым словом "PROGMEM". После этого переменная добавляется к объекту LiquidLine, как обычно. Разница в том, что позже в setup() для объекта LiquidLine, хранящего переменную, должен быть вызван метод bool LiquidLine::set_asProgmem(byte number). Параметр "number" является последовательным номером переменной для этого объекта LiquidLine. Если в LiquidLine две переменные, первая является целым числом, а вторая – строкой, хранящейся во флеш-памяти, "number" будет равен 2.

Схема

Схема для примера progmem_menu
Схема для примера progmem_menu

Соединения:

  • вывод RS LCD к выводу 12 Arduino;
  • вывод E LCD к выводу 11 Arduino;
  • вывод D4 LCD к выводу 5 Arduino;
  • вывод D5 LCD к выводу 4 Arduino;
  • вывод D6 LCD к выводу 3 Arduino;
  • вывод D7 LCD к выводу 2 Arduino;
  • вывод R/W LCD на корпус;
  • вывод VSS LCD на корпус;
  • вывод VCC LCD к +5В;
  • потенциометр 10 кОм: концы к корпусу и +5В, средний вывод к выводу V0 LCD;
  • резистор 150 Ом между +5В и анодом LCD подсветки;
  • катод LCD подсветки к корпусу.

Код

Код скетча progmem_menu.ino

#include <LiquidCrystal.h>
#include <LiquidMenu.h>
#include <avr/pgmspace.h> // Библиотека PROGMEM

// Выводы, подключенные к дисплею:
const byte LCD_RS = 12;
const byte LCD_E = 11;
const byte LCD_D4 = 5;
const byte LCD_D5 = 4;
const byte LCD_D6 = 3;
const byte LCD_D7 = 2;
//LCD R/W вывод на корпус
//Средний вывод потенциометра 10кОм к VO
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);


// Эти массивы символов хранятся во флеш-памяти
const char text1[] PROGMEM = "Lorem ipsum dolo";
const char text2[] PROGMEM = "r sit amet, cons";
const char text3[] PROGMEM = "ectetur adipisci";
const char text4[] PROGMEM = "ibendum, sem ac ";
const char text5[] PROGMEM = "venenatis rhoncu";
const char text6[] PROGMEM = "s, nisi justo eu";
const char text7[] PROGMEM = "ismod lectus, eu";
const char text8[] PROGMEM = " eleifend ante n";
const char text9[] PROGMEM = "isl vitae eros. ";
const char text10[] PROGMEM = "Pellentesque hab";
const char text11[] PROGMEM = "itant morbi tris";
const char text12[] PROGMEM = "tique senectus e";
const char text13[] PROGMEM = "t netus et males";
const char text14[] PROGMEM = "uada fames ac tu";
const char text15[] PROGMEM = "rpis egestas. Or";
const char text16[] PROGMEM = "ci varius natoqu";
const char text17[] PROGMEM = "e penatibus et m";
const char text18[] PROGMEM = "agnis dis partur";
const char text19[] PROGMEM = "ient montes, nas";
const char text20[] PROGMEM = "cetur ridiculus ";

LiquidLine welcome_line1(1, 0, "LiquidMenu ", LIQUIDMENU_VERSION);
LiquidLine welcome_line2(0, 1, "PROGMEM example");
LiquidScreen welcome_screen(welcome_line1, welcome_line2);

LiquidLine line11(0, 0, text1);
LiquidLine line12(0, 1, text2);
LiquidScreen screen1(line11, line12);

LiquidLine line21(0, 0, text3);
LiquidLine line22(0, 1, text4);
LiquidScreen screen2(line21, line22);

LiquidLine line31(0, 0, text5);
LiquidLine line32(0, 1, text6);
LiquidScreen screen3(line31, line32);

LiquidLine line41(0, 0, text7);
LiquidLine line42(0, 1, text8);
LiquidScreen screen4(line41, line42);

LiquidLine line51(0, 0, text9);
LiquidLine line52(0, 1, text10);
LiquidScreen screen5(line51, line52);

LiquidLine line61(0, 0, text11);
LiquidLine line62(0, 1, text12);
LiquidScreen screen6(line61, line62);

LiquidLine line71(0, 0, text13);
LiquidLine line72(0, 1, text14);
LiquidScreen screen7(line71, line72);

LiquidLine line81(0, 0, text15);
LiquidLine line82(0, 1, text16);
LiquidScreen screen8(line81, line82);

LiquidLine line91(0, 0, text17);
LiquidLine line92(0, 1, text18);
LiquidScreen screen9(line91, line92);

LiquidLine line101(0, 0, text19);
LiquidLine line102(0, 1, text20);
LiquidScreen screen10(line101, line102);

LiquidMenu menu(lcd);


void setup() 
{
  Serial.begin(250000);

  lcd.begin(16, 2);

  // Настраиваем переменные как PROGMEM. Параметр - это последовательный
  // номер переменной PROGMEM для этого объекта LiquidLine.
  line11.set_asProgmem(1);
  line12.set_asProgmem(1);
  line21.set_asProgmem(1);
  line22.set_asProgmem(1);
  line31.set_asProgmem(1);
  line32.set_asProgmem(1);
  line41.set_asProgmem(1);
  line42.set_asProgmem(1);
  line51.set_asProgmem(1);
  line52.set_asProgmem(1);
  line61.set_asProgmem(1);
  line62.set_asProgmem(1);
  line71.set_asProgmem(1);
  line72.set_asProgmem(1);
  line81.set_asProgmem(1);
  line82.set_asProgmem(1);
  line91.set_asProgmem(1);
  line92.set_asProgmem(1);
  line101.set_asProgmem(1);
  line102.set_asProgmem(1);

  menu.add_screen(welcome_screen);
  menu.add_screen(screen1);
  menu.add_screen(screen2);
  menu.add_screen(screen3);
  menu.add_screen(screen4);
  menu.add_screen(screen5);
  menu.add_screen(screen6);
  menu.add_screen(screen7);
  menu.add_screen(screen8);
  menu.add_screen(screen9);
  menu.add_screen(screen10);
}

void loop() 
{
  static unsigned long lastMs_nextScreen = 0;
  static unsigned int period_nextScreen = 1000;
  // Периодическое переключение на следующий экран.
  if (millis() - lastMs_nextScreen > period_nextScreen) 
  {
    lastMs_nextScreen = millis();
    menu.next_screen();
  }
}

Для более подробной информации смотрите документацию на библиотеку LiquidMenu.


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


Сообщить об ошибке