U8glib.h + 2 дисплея 1306

Тема в разделе "Arduino & Shields", создана пользователем Михаил123, 16 май 2022.

  1. что-то я пропустил рабочий пример
     
  2. User248

    User248 Гик

    Попробовал в эмуляторе Tinkercad с библиотекой Adafruit_LiquidCrystal. Оба дисплея на одном I2C, но с разными адресами (в эмуляторе можно менять адрес). Работают независимо.
    Код (C++):
    #include <Adafruit_LiquidCrystal.h>

    Adafruit_LiquidCrystal lcd_1(0); // address 32
    Adafruit_LiquidCrystal lcd_2(1); // address 33

    void setup()
    {
      lcd_1.begin(16, 2);
      lcd_1.clear();
      lcd_1.print("Display 1");
      lcd_2.begin(16, 2);
      lcd_2.clear();
      lcd_2.print("Display 2");
    }

    void loop()
    {
    }
    Dual Display.png
     
  3. issaom

    issaom Гуру

    Дык Вам на одну шину надо - такого там нет. Выделяете на каждый дисплей по 2 пина на меге и вешаете их сколько угодно, без танцев с бубном с адресами и расширителями портов.
     
  4. User248

    User248 Гик

    В новой библиотеке U8g2lib есть такой класс:
    Код (C++):
    U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* reset=*/ 8);
    SW означает software, то есть софтовая эмуляция I2C. Можно использовать любые пины данных. Нужно создать два объекта с разными пинами. Вместо пина reset можно указать U8X8_PIN_NONE, если заработает так.
     
    issaom нравится это.
  5. parovoZZ

    parovoZZ Гуру

    У ТС другие дисплеи.
     
  6. parovoZZ

    parovoZZ Гуру

    Это означает дичайшие тормоза. Вся эта софтэмуляция в дуринобиблиотеках реализована крайне убого.
     
  7. User248

    User248 Гик

    Кстати, забыл сказать. Тут несколько типов классов.
    Код (C++):

    U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 12, /* data=*/ 11, /* reset=*/ 8);
    U8G2_SSD1306_128X64_NONAME_2_SW_I2C u8g2(U8G2_R0, /* clock=*/ 12, /* data=*/ 11, /* reset=*/ 8);
    U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 12, /* data=*/ 11, /* reset=*/ 8);
     
    Где 1, 2 и F это колличество строк. Если использовать способ вывода full_buffer, то понадобится класс типа F, иначе будет отображаться только часть экрана. Но это займёт раза в три больше динамической памяти.
    Код (C++):
    void loop(void) {
      // full_buffer
      u8g2.clearBuffer();
      u8g2.drawCircle(10, 30, 9);
      u8g2.sendBuffer();
    }
    Можно использовать класс типа 1, но тогда придётся использовать метод page_buffer.
    Код (C++):
    void loop(void) {
      // page_buffer
      u8g2.firstPage();
      do {
        u8g2.drawCircle(10, 30, 9);
      } while( u8g2.nextPage() );
     }
     
  8. так а я про что?
    мне надобно на одну шину. Пины в обрез расписаны
     
  9. а по какому принципу определение адресов?
    у меня с дисплеями еще и расширители идут
     
  10. User248

    User248 Гик

    В эмуляторе можно менять адрес дисплея. Может быть продаются дисплеи с разными адресами.
     
  11. каким образом?
     
  12. User248

    User248 Гик

    Попробуйте уже и узнаете.

    В случае u8g2, можно вывод clock сделать общим для обоих дисплеев. Экономия один пин. Но это не точно. Хотя я точно знаю, что частота подаётся кратковременно, только в момент передачи данных.
     
    Последнее редактирование: 18 май 2022
  13. не указывается явно никак
     
  14. User248

    User248 Гик

    Эмулятор Tinkercad, клик по дисплею и появляется окно настройки.

    Display Address.png
     
  15. а по факту как поставить адрес?
     
  16. b707

    b707 Гуру

    пипец.... все пины занял на Меге? Даеще и с кучей расширителей? Ты что такое наворотил-то?
    Ты бы поделился. часто новички по глупости задумывают монтров с тысячей кнопок и десятком дисплеев, где по факту можно обойтись одним светодиодом. С твоими знаниями одну кнопку суметь бы подключить...
     
  17. ну, комплексы автозагрузки сырья по весам, как то работают, видимо, с божьей помощью, да с помощью адекватных участников форума. К сожалению, появляются и неадекваты, маскирующие свои пробелы под "пузыри". таких я блокирую и исключаю из общения. Всем остальным премного благодарен. Для этого и существуют форумы, исключительно, для получения быстрой адекватной помощи тем, у кого опыта мало. Но некоторые дебилы с низкой самооценкой и никчёмностью в этой жизни, пытаются поднять свою самооценку на форуме за счёт других.
    Это их убогий выбор.
     
    Airbus нравится это.
  18. User248

    User248 Гик

    Последнее редактирование: 18 май 2022
  19. Airbus

    Airbus Радиохулиган Модератор

    Можно и на одном адресе несколько LCD дисплеев. Тут с полгода назад Чел поднимал вопрос. Тоже много мусолили а он взял да и проверил. Кажется 3 LCD у него было на одном адресе параллельно. И все работало. Так что можно
     
  20. как же их адресовать, однако...
    будут ли они занимать при инициализации одну и ту же последовательность?
    проверю. спасибо