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.

Теги

ArduinoLCD дисплейМенюПамятьПамять программПрограммированиеЭнергонезависимая память