библиотека LiquidCrystal_I2C

Здесь обсуждаем Arduino
Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

библиотека LiquidCrystal_I2C

Сообщение GhostX » 17 фев 2016, 16:21

В общем работать с ней одно удовольствие. Есть команды
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print("NasheSoobschenie"); // Выводим текст на экран
Вроде все просто и вот задумал я все эти сообщения записать в пзу и от туда вызывать нужные так как слов много повторяющихся. Полез в недры этой библиотеки и не понял как она текст в кавычках понимает...
Она хоть и большая, но не сложная. Все культурно написано.
Надо, короче, помощь опытного глаза.))
Вложения
LiquidCrystal_I2C.zip
(19.88 КБ) 419 скачиваний

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: библиотека LiquidCrystal_I2C

Сообщение gurvinok » 17 фев 2016, 19:36

Открываю я LiquidCrystal_I2C.h и не вижу функции print. Далее шарюсь по файлу и вижу...

Код: Выделить всё

#include <inttypes.h>
#include "Print.h" 
#include <Wire.h>
Ага... Значит #include "Print.h" где-то рядом. Рылся в папках и нашел.

Код: Выделить всё

class Print
{
  private:
    int write_error;
    size_t printNumber(unsigned long, uint8_t);
    size_t printFloat(double, uint8_t);
  protected:
    void setWriteError(int err = 1) { write_error = err; }
  public:
    Print() : write_error(0) {}
  
    int getWriteError() { return write_error; }
    void clearWriteError() { setWriteError(0); }
  
    virtual size_t write(uint8_t) = 0;
    size_t write(const char *str) {
      if (str == NULL) return 0;
      return write((const uint8_t *)str, strlen(str));
    }
    virtual size_t write(const uint8_t *buffer, size_t size);
    size_t write(const char *buffer, size_t size) {
      return write((const uint8_t *)buffer, size);
    }
    
    size_t print(const __FlashStringHelper *);
    size_t print(const String &);
    size_t print(const char[]);
    size_t print(char);
    size_t print(unsigned char, int = DEC);
    size_t print(int, int = DEC);
    size_t print(unsigned int, int = DEC);
    size_t print(long, int = DEC);
    size_t print(unsigned long, int = DEC);
    size_t print(double, int = 2);
    size_t print(const Printable&);

    size_t println(const __FlashStringHelper *);
    size_t println(const String &s);
    size_t println(const char[]);
    size_t println(char);
    size_t println(unsigned char, int = DEC);
    size_t println(int, int = DEC);
    size_t println(unsigned int, int = DEC);
    size_t println(long, int = DEC);
    size_t println(unsigned long, int = DEC);
    size_t println(double, int = 2);
    size_t println(const Printable&);
    size_t println(void);
};
Вопрос... Кокой из методов используется для вывода на ЖК. Вот их кишки.

Код: Выделить всё

size_t Print::print(const String &s)
{
  return write(s.c_str(), s.length());
}

size_t Print::print(const char str[])
{
  return write(str);
}

size_t Print::print(char c)
{
  return write(c);
}

size_t Print::print(unsigned char b, int base)
{
  return print((unsigned long) b, base);
}

size_t Print::print(int n, int base)
{
  return print((long) n, base);
}

size_t Print::print(unsigned int n, int base)
{
  return print((unsigned long) n, base);
}

size_t Print::print(long n, int base)
{
  if (base == 0) {
    return write(n);
  } else if (base == 10) {
    if (n < 0) {
      int t = print('-');
      n = -n;
      return printNumber(n, 10) + t;
    }
    return printNumber(n, 10);
  } else {
    return printNumber(n, base);
  }
}

size_t Print::print(unsigned long n, int base)
{
  if (base == 0) return write(n);
  else return printNumber(n, base);
}

size_t Print::print(double n, int digits)
{
  return printFloat(n, digits);
}

size_t Print::println(const __FlashStringHelper *ifsh)
{
  size_t n = print(ifsh);
  n += println();
  return n;
}

size_t Print::print(const Printable& x)
{
  return x.printTo(*this);
}
Не проще делать так...

Код: Выделить всё

// Любая строка, как я уже писал ранее, это массив. Создаем массив в 20 элементов
unsigned char buffer_text[20] = {0};

// Здесь выуживаем из памяти строку по байту и записываем в массив
void eeprom_to_string(unsigned char *str, unsigned char size_data)
{
    unsigned int count = 0;
    for(count=0; count<size_str; count++)
    {
        *str = read_eeprom(add, data);
        str++;
    }
    // Обязательно последний символ нулевой!
    *str = 0x00;
}

// Загружаем в буферный массив строку из eeprom
eeprom_to_string(buffer_text, 16);

// Выводим на дисплей
lcd.print(buffer_text);
Как-то так.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: библиотека LiquidCrystal_I2C

Сообщение GhostX » 17 фев 2016, 20:05

а я вот это "Print.h" не нашел. и не одна эта библиотека где я подобное не могу найти.
gurvinok писал(а):Не проще делать так...

Код: Выделить всё

// Любая строка, как я уже писал ранее, это массив. Создаем массив в 20 элементов
unsigned char buffer_text[20] = {0};

// Здесь выуживаем из памяти строку по байту и записываем в массив
void eeprom_to_string(unsigned char *str, unsigned char size_data)
{
    unsigned int count = 0;
    for(count=0; count<size_str; count++)
    {
        *str = read_eeprom(add, data);
        str++;
    }
    // Обязательно последний символ нулевой!
    *str = 0x00;
}

// Загружаем в буферный массив строку из eeprom
eeprom_to_string(buffer_text, 16);

// Выводим на дисплей
lcd.print(buffer_text);

Как-то так.
Конечно проще. Я к такому и хочу прийти. Вот только не знаю как массив засунуть в функцию принт библиотеки. Нужно экспериментировать. :)
Сейчас пытаюсь массив, массивов запихнуть в eeprom AT24C32.
Если по русский, то это русский алфавит, который сам создавал. Состоит из 8 байт, по 5 бит каждый. 5*8=40 бит каждая буква. Сама буква массив и все количество букв тоже массив.
Короче как то так, я еще сам не понял. А с учетом, что несколько дней не подходил, так вообще все перепутал.)))))
Беда.
Буду воевать. :)

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: библиотека LiquidCrystal_I2C

Сообщение gurvinok » 17 фев 2016, 20:12

Что значит?
Если по русский, то это русский алфавит, который сам создавал.
Как называется дисплей?
Вот только не знаю как массив засунуть в функцию принт библиотеки.
Вот так.
// Выводим на дисплей
lcd.print(buffer_text);
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: библиотека LiquidCrystal_I2C

Сообщение GhostX » 17 фев 2016, 23:16

gurvinok писал(а):Что значит?
Если по русский, то это русский алфавит, который сам создавал.

Код: Выделить всё

byte degree[8] = { B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000,};// кодируем символ градуса
byte PE_lit[8] = { B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000,};// кодируем символ П
byte EL_lit[8] = { B00111, B01001, B10001, B10001, B10001, B10001, B10001, B00000,};// кодируем символ Л
byte ZH_lit[8] = { B10001, B10101, B10101, B01110, B10101, B10101, B10001, B00000,};// кодируем символ Ж
byte MZ_lit[8] = { B10000, B10000, B10000, B11110, B10001, B10001, B11110, B00000,};// кодируем символ Ь
byte U_lit[8] = { B10001, B10001, B10001, B01111, B00001, B00001, B01110, B00000,};// кодируем символ У
byte YA_lit[8] = { B01111, B10001, B10001, B01111, B00101, B01001, B10001, B00000};// кодируем символ Я
byte D_lit[8] = { B00110, B01010, B01010, B01010, B01010, B01010, B11111, B10001};// кодируем символ Д
byte CH_lit[8] = { B10001, B10001, B10001, B01111, B00001, B00001, B00001, B00000};// кодируем символ Ч
byte Z_lit[8] = { B01110, B10001, B00001, B00110, B00001, B10001, B01110, B00000};// кодируем символ З
Символы, которых нет создаем сами. Вот те что выше, я рисовал в своем коде.
Хочу их запихнуть в память.
Дисплей lsd 16х2 обычный коих тысячами продают китайцы. Русского языка нет.
gurvinok писал(а):Вот так.
Цитата:
// Выводим на дисплей
lcd.print(buffer_text);
так мы выводим содержание переменной. На сколько я не забыл. Массивы так же?

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: библиотека LiquidCrystal_I2C

Сообщение GhostX » 18 фев 2016, 04:07

Что то получилось. Но пока без двумерных массивов. Тупо чтоб заработало. И вроде работает.))
Пара скетчей один пишет, второй читает и в сериал порт выкидывает.
Теперь сижу думаю, а все это запихательство в память, дает что то полезного, с точки зрения экономии памяти в самой ардуине?! Надо до конца допилить, может что то и прояснится.)))
Вложения
ink.zip
(2.34 КБ) 272 скачивания

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: библиотека LiquidCrystal_I2C

Сообщение gurvinok » 18 фев 2016, 08:56

так мы выводим содержание переменной. На сколько я не забыл. Массивы так же?
Блин, ну ради чего я распинался в кино про указатели. Там и пример даже был где их используют.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: библиотека LiquidCrystal_I2C

Сообщение GhostX » 18 фев 2016, 12:54

Кино про указатели пересматривал последний раз прям до написания этих скетчей.
И в целом там все понятно. А вывести массив в сериал порт не сходу получилось, но в итоге вывел.
я не совсем понял последнее сообщение...
Узнать правила русского языка, это еще не стать писателем.
Где я накосячил?

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: библиотека LiquidCrystal_I2C

Сообщение gurvinok » 18 фев 2016, 15:59

Здесь нужно решить, либо передавать массив в функцию где кавычки, либо в сериал порт. Вопрос раздвояица.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: библиотека LiquidCrystal_I2C

Сообщение GhostX » 18 фев 2016, 18:21

Конкретно эти массивы будут передаваться в функцию создания символа. А уже существующие символы и созданные символы, нужно поместить в массив и выдавать на lcd при необходимости. Я еще понятия не имею как я это буду делать. И вообще целесообразность всего этого под вопросом. Хочется сделать более компактно. Так как память там не резиновая...

Ответить