Вывод на LCD из массива в теле цикла и без цикла.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

char* main_Menu[] PROGMEM = 
 {"Chapter 1",
 "Chapter 2",
 "Chapter 3",
 "Chapter 4",
};

void setup()
{
  lcd.init();                     
  lcd.backlight();
}

void loop() {
lcd.clear();
for (byte i=0; i<4; i++) {
  lcd.setCursor(1, i);
  lcd.print (main_Menu[i]);
}
delay (1000);
}

Выводит на экра кракозабру в позиции 0, 0; 0,1; 0, 2; 0, 3;

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

char* main_Menu[] PROGMEM = 
 {"Chapter 1",
 "Chapter 2",
 "Chapter 3",
 "Chapter 4",
};

void setup()
{
  lcd.init();                     
  lcd.backlight();
}

void loop() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print (main_Menu[0]);
lcd.setCursor(1, 1);
lcd.print (main_Menu[1]);
lcd.setCursor(1, 2);
lcd.print (main_Menu[2]);
lcd.setCursor(1, 3);
lcd.print (main_Menu[3]);
delay (1000);
}

Выводит нормальным текстом.

Где подвох?

dmw
Offline
Зарегистрирован: 24.03.2013
for (byte i=0; i<4; i++) {

заменить на:

for (int i=0; i<4; i++) {

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

dmw пишет:

for (byte i=0; i<4; i++) {

заменить на:

for (int i=0; i<4; i++) {

 

Менял, разници нет. 

char()
char() приводит значение к типу char.

Синтаксис
char(x)
Параметры
x: переменная любого типа
Возвращаемое значение
char

 

maksim
Offline
Зарегистрирован: 12.02.2012

Когда начинаете чем то пользоваться, надо читать как этим пользоваться PROGMEM

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

char string_1[] PROGMEM = "Chapter 1";
char string_2[] PROGMEM = "Chapter 2";
char string_3[] PROGMEM = "Chapter 3";
char string_4[] PROGMEM = "Chapter 4";

PROGMEM char *main_Menu[] = {
  string_1,
  string_2,
  string_3,
  string_4,
};

void setup()
{
  lcd.init();                     
  lcd.backlight();
}

void loop() 
{
  lcd.clear();
  for (byte i = 0; i < 5; i++) 
  {
    lcd.setCursor(1, i);
    char buff[21];
    strcpy_P(buff, (char*)pgm_read_byte(&(main_Menu[i])));
    lcd.print(buff);
  }
  delay (1000);
}

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

Когда начинаете чем то пользоваться, надо читать как этим пользоваться PROGMEM

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

char string_1[] PROGMEM = "Chapter 1";
char string_2[] PROGMEM = "Chapter 2";
char string_3[] PROGMEM = "Chapter 3";
char string_4[] PROGMEM = "Chapter 4";

PROGMEM char *main_Menu[] = {
  string_1,
  string_2,
  string_3,
  string_4,
};

void setup()
{
  lcd.init();                     
  lcd.backlight();
}

void loop() 
{
  lcd.clear();
  for (byte i = 0; i < 5; i++) 
  {
    lcd.setCursor(1, i);
    char buff[21];
    strcpy_P(buff, (char*)pgm_read_byte(&(main_Menu[i])));
    lcd.print(buff);
  }
  delay (1000);
}

 

 

Максим ворчливый, но всегда помогает. 

Спасибо!

maksim
Offline
Зарегистрирован: 12.02.2012

Это не ворчание, а совет с какой стороны нудно подходить к проблеме, и там в цикле должно быть 4 ,а не 5, так как у вас 4 строки.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Maksim еще вопрос.

Насколько вообще справедливо и полезно в данном случае использовать флеш память? Возможно менее нагруженно будет char* ?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

И там в цикле должно быть 4 ,а не 5, так как у вас 4 строки.

в моем исходнике 4.

maksim
Offline
Зарегистрирован: 12.02.2012

В кокретном привере без разницы, а вот когда программа разростается и встает вопрос о нехватке оперативной памяти, тогда это просто необходимо.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

В кокретном привере без разницы, а вот когда программа разростается и встает вопрос о нехватке оперативной памяти, тогда это просто необходимо.

тогда в PROGMEM, т.к. после блока меню будем разрастаться.

gra_ver
Offline
Зарегистрирован: 23.01.2013

Добрый день! Пытаюсь адаптировать код Maksima под себя

mega2560, IDE1.5.4


#include <LiquidCrystal.h> 

LiquidCrystal lcd(52, 50, 48,   46,   44,   42  );
char string_1[] PROGMEM = "Chapter 1";
char string_2[] PROGMEM = "Chapter 2";
char string_3[] PROGMEM = "Chapter 3";
char string_4[] PROGMEM = "Chapter 4";

PROGMEM char *main_Menu[] = {
  string_1,
  string_2,
  string_3,
  string_4,
};

void setup()
{
  lcd.begin(20, 4);
}

void loop() 
{
  lcd.clear();
  for (byte i = 0; i < 4; i++) 
  {
    lcd.setCursor(1, i);
    char buff[21];
    strcpy_P(buff, (char*)pgm_read_byte(&(main_Menu[i])));
    lcd.print(buff);
  }
  delay (1000);
}

Не выводится 4-я строка!

А код ingener.solovyev


#include <LiquidCrystal.h> 
LiquidCrystal lcd(52, 50, 48,   46,   44,   42  );
char* main_Menu[] PROGMEM = 
 {"Chapter 1",
 "Chapter 2",
 "Chapter 3",
 "Chapter 4",
};

void setup()
{
  lcd.begin(20, 4);
}

void loop() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print (main_Menu[0]);
lcd.setCursor(1, 1);
lcd.print (main_Menu[1]);
lcd.setCursor(1, 2);
lcd.print (main_Menu[2]);
lcd.setCursor(1, 3);
lcd.print (main_Menu[3]);
delay (1000);
}

- выводит все строки.

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

gra_ver пишет:

Добрый день! Пытаюсь адаптировать код Maksima под себя

mega2560, IDE1.5.4


#include <LiquidCrystal.h> 

LiquidCrystal lcd(52, 50, 48,   46,   44,   42  );
char string_1[] PROGMEM = "Chapter 1";
char string_2[] PROGMEM = "Chapter 2";
char string_3[] PROGMEM = "Chapter 3";
char string_4[] PROGMEM = "Chapter 4";

PROGMEM char *main_Menu[] = {
  string_1,
  string_2,
  string_3,
  string_4,
};

void setup()
{
  lcd.begin(20, 4);
}

void loop() 
{
  lcd.clear();
  for (byte i = 0; i < 4; i++) 
  {
    lcd.setCursor(1, i);
    char buff[21];
    strcpy_P(buff, (char*)pgm_read_byte(&(main_Menu[i])));
    lcd.print(buff);
  }
  delay (1000);
}

Не выводится 4-я строка!

А код ingener.solovyev


#include <LiquidCrystal.h> 
LiquidCrystal lcd(52, 50, 48,   46,   44,   42  );
char* main_Menu[] PROGMEM = 
 {"Chapter 1",
 "Chapter 2",
 "Chapter 3",
 "Chapter 4",
};

void setup()
{
  lcd.begin(20, 4);
}

void loop() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print (main_Menu[0]);
lcd.setCursor(1, 1);
lcd.print (main_Menu[1]);
lcd.setCursor(1, 2);
lcd.print (main_Menu[2]);
lcd.setCursor(1, 3);
lcd.print (main_Menu[3]);
delay (1000);
}

- выводит все строки.

 

возможно функция lcd.clear вызванная более 25 раз в секунду не дает нормально отобразиться 4-й строке, и даже мерцание ее происходит с такой частотой, что глаз его не распознает. Попробейте хотя бы, пока delay (1000); в код Максима и по смотрите появится ли 4-ая строка.

gra_ver
Offline
Зарегистрирован: 23.01.2013

Вы имеете ввиду добавить delay после lcd.clear? - поставил 5 секунд - результат тот же