проблемы с Liqid cristal I2C

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем antik65, 18 июл 2016.

  1. antik65

    antik65 Нуб

    здравствуйте, нужна помощь: возникла проблема с Liqid cristal I2C раньше нормально выводил надпись, а теперь только первый символ из строки пишет. Но если выводить надпись через serial monitor то пишет полностью. прилагаю библиотеку:

    Код (C++):

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

    LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

    void setup()
    {
      lcd.init();                      // initialize the lcd
      lcd.init();
      // Print a message to the LCD.
      lcd.backlight();
      lcd.setCursor(3,0);
      lcd.print("Hello, world!");
    }
    void loop()
    {
    }
     

    Вложения:

    Последнее редактирование: 18 июл 2016
  2. Securbond

    Securbond Гуру


    А так что пишет?

    Код (C++):


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

    LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

    void setup()
    {
      lcd.init();                      // initialize the lcd
      // Print a message to the LCD.
      lcd.backlight();
      lcd.setCursor(0,0);
      lcd.print("Hello, world!");
    }
    void loop()
    {
    }
     
     
  3. antik65

    antik65 Нуб

    ошибок не выдает при компилировании, просто на дисплее только одна первая буква
     
  4. Securbond

    Securbond Гуру

    2 раза писать lcd.init(); точно не нужно, проверьте подключение проводов и питание.... Чудес не бывает.
     
  5. antik65

    antik65 Нуб

    а в чем дело может быть? кроме этого?
     
  6. Securbond

    Securbond Гуру

    Попробуйте вывод текста в loop() перенести, будут изменения ?
     
  7. antik65

    antik65 Нуб

    пробовал, все так же
     
  8. Securbond

    Securbond Гуру

    Ещё попробуйте очистить экран перед выводом
    lcd.clear();
    Больше да же не знаю что можно предложить.
     
  9. DIYMan

    DIYMan Гуру

    Откройте LiquidCrystal_I2C.cpp, найдите там метод write, и если в нём стоит
    Код (C++):
    return 0;
    замените на
    Код (C++):
    return 1;
    Естественно, среда должна быть закрыта. Потом откройте среду и пересоберите скетч.
     
    VALEK1809, Un_ka и ZAZ-965 нравится это.
  10. antik65

    antik65 Нуб

    спасибо, помогло!
     
  11. DIYMan

    DIYMan Гуру

    Да не за что. Эту проблему имхо уже надо где-то пришпилить сверху каждого форума по ардуино, ибо это баг кривой библиотеки, писаной левой ногой.
     
  12. Securbond

    Securbond Гуру

    Почему раньше работало? Библиотеку обновили ?
     
  13. DIYMan

    DIYMan Гуру

    Библиотек под LCD I2C - вагон с тележкой, форков там всяких и пр. Описанный баг с завидным постоянством всплывает то там, то тут, я лично уже раз 5 на своей памяти отвечаю по этой теме с лечением.
     
    9xA59kK и Securbond нравится это.
  14. ZAZ-965

    ZAZ-965 Гуру

    Посмотрел на гитхабе исходники Print::write которая в итоге используется для lcd.print
    Было
    Код (C++):

    size_t Print::write(const uint8_t *buffer, size_t size)
    {
    size_t n = 0;
    while (size--) {
    n += write(*buffer++);
    }
    return n;
    }
     
    стало
    Код (C++):
    size_t Print::write(const uint8_t *buffer, size_t size)
    {
      size_t n = 0;
      while (size--) {
        if (write(*buffer++)) n++;
        else break;
      }
      return n;
    }
    т.е в новой версии IDE проверяется возвращаемое значение функции write, а старая библиотека этого не учитывала.
     
    9xA59kK и DIYMan нравится это.
  15. DIYMan

    DIYMan Гуру

    Ну там дело-то всё равно в кривости либы, ибо - раз метод write возвращает значение, надо его и возвращать. Старая версия:
    Код (C++):

    inline size_t LiquidCrystal_I2C::write(uint8_t value) {
        send(value, Rs);
        return 0;
    }
     
    В функцию передаётся байт, в шину пишется байт - накохер возвращать 0, если по-любому записали байт?

    Новая, поправленная версия:
    Код (C++):

    inline size_t LiquidCrystal_I2C::write(uint8_t value) {
        send(value, Rs);
        return 1;
    }
     
    Т.е. налицо, как по мне, багофича самой либы.
     
  16. Всем доброго времени суток.
    Явно после обновления IDE до 1.6.11 не верно работает LCD МЭЛТ 16S2H.
    Проблема в том, что 1 и 2 строка отображают 8 символов как положено (работают). Остальные знакоместа обеих строк с 9 по 16 - просто светятся.
    Выглядит так:
    12345678########
    12345678########
    Где только не искал, но похожа проблема инициализации дисплея. Соответственно явно глюк в библиотеке. Может кто столкнулся с этим... ну или знает где ручками библиотечку поправить?
     
  17. yden

    yden Гик

    Здравствуйте.
    С разрешения ТС можно здесь задам вопрос, чтоб темы не плодить.
    Такой же дисплей. Вывожу значения температуры. Двухзначные значения - норма, но как только температура становится меньше 10, т.е однозначное число, то нолик не затирается и дисплей отображает 90, 80, 70 и т.д.
    Как можно избавиться от этого бага?
    Спасибо
     
  18. vvr

    vvr Инженерище

    это не баг
    это программа так ваша написана
     
  19. vvr

    vvr Инженерище


    откатись до версии когда всё работало
    у меня вообще 1.5.2 основная, и ничего))))
     
  20. yden

    yden Гик

    Согласен, не точно сформулировал вопрос. Как мне исправить мою криворукость?