Подключение двух дисплеев по I2C к Ардуино про мини ( Китай)

Тема в разделе "Arduino & Shields", создана пользователем Ursus, 20 янв 2018.

  1. Ursus

    Ursus Нуб

    Здравствуйте. Я новичок, и просто пока изучаю ардуино. В дальнейшем хочу немного переделать под себя проект: http://sxem.org/2-vse-stati/24-izmereniya/78-avtomobilnyj-izmeritel-mmmetr. Вернее выполнить этот проект на ардуино, и использовать или OLED, или TFT экраны. Причём хочу выводить инфу на несколько экранов. Вот тут у меня затык и случился. Подсоединил к ардуинке по I2c два OLED 0,96 дисплея, при чём один сразу был заточен по I2C, а второй был и по I2C, и по SPI. Переделав второй дисплей под I2C, подключил оба дисплея к плате. Далее взял библиотеку:Adafruit_SSD1306, и из неё демо по выводу информации на экран, всё получилось. На оба дисплея выводилась одинаковая инфа. Потом для эксперимента , на втором дисплее поменял адрес, загрузил сканер шины I2C, и пошло самое интересное, когда стоят оба дисплея, выводится адрес только того дисплея который сразу был сделан под I2C, а когда я его отсоединяю, появляется адрес дисплея, который был переделан. Далее для пробы из библиотеки:iarduin:confused:LED, взял скетч:TwoDisplays,результатом работы которого, является вывод на каждый дисплей его номер и адрес, а у меня вышло по другому. Когда стоят оба дисплея, инфа появляется только на первом дисплее, а когда я его отсоединяю, появляется инфа на втором. Подскажите куда копать.
     
  2. vvr

    vvr Инженерище

    сначала копать в публикацию отформатированного кода по правилам форума.
     
  3. Ursus

    Ursus Нуб

    Код (C++):
    [code]
    //  Раскомментируйте для программной реализации шины I2C:    //
    //  #define pin_SW_SDA 3                                     // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
    //  #define pin_SW_SCL 9                                     // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C.
    //  Раскомментируйте для совместимости с большинством плат:  //
    //  #include <Wire.h>                                        // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire.
    //  Ссылки для ознакомления:                                 //
    //  Подробная информация о подключении модуля к шине I2C:    // http://wiki.iarduino.ru/page/i2c_connection/
    //  Подробная информация о функциях и методах библиотеки:    // http://wiki.iarduino.ru/page/OLED_trema/
    //  Библиотека  iarduino_OLED_txt (текстовая) экономит ОЗУ:  // http://iarduino.ru/file/341.html
    //  Бибилиотека iarduino_OLED     (графическая):             // http://iarduino.ru/file/340.html
                                                                 //
    //  ДАННЫЙ ПРИМЕР НЕ БУДЕТ РАБОТАТЬ НА ПЛАТАХ                //
    //  С ОБЪЁМОМ ДИНАМИЧЕСКОЙ ПАМЯТИ НИЖЕ 2.5 КБ                //
                                                                 //
    #include <iarduino_OLED.h>                                   // Подключаем библиотеку iarduino_OLED.
    iarduino_OLED myOLED_1(0x3C);                                // Объявляем объект myOLED_1, указывая адрес первого дисплея на шине I2C: 0x3C.
    iarduino_OLED myOLED_2(0x3D);                                // Объявляем объект myOLED_2, указывая адрес второго дисплея на шине I2C: 0x3D.
                                                                 //
    extern uint8_t MediumFontRus[];                              // Подключаем шрифт MediumFontRus.
    extern uint8_t SmallFontRus[];                               // Подключаем шрифт SmallFontRus.
                                                                 // Если Вы не используете Кириллицу, то лучше подключить шрифты MediumFont и SmallFont, они займут меньше места в памяти программ.
    void setup(){                                                //
        myOLED_1.begin  ();                                      // Инициируем работу с первым дисплеем.
        myOLED_2.begin  ();                                      // Инициируем работу с вторым дисплеем.
        myOLED_1.setFont(MediumFontRus);                         // Указываем шрифт который требуется использовать для вывода цифр и текста на первом дисплее.
        myOLED_2.setFont(MediumFontRus);                         // Указываем шрифт который требуется использовать для вывода цифр и текста на втором дисплее.
        myOLED_1.print  ("1 дисплей", OLED_C, 31);               // Выводим текст на первый дисплей по центру экрана, координата нижней части текста по оси Y равна 31.
        myOLED_2.print  ("2 дисплей", OLED_C, 31);               // Выводим текст на второй дисплей по центру экрана, координата нижней части текста по оси Y равна 31.
        myOLED_1.setFont(SmallFontRus);                          // Указываем шрифт который требуется использовать для вывода цифр и текста на первом дисплее.
        myOLED_2.setFont(SmallFontRus);                          // Указываем шрифт который требуется использовать для вывода цифр и текста на втором дисплее.
        myOLED_1.print  ("Адрес дисплея 0x3C", OLED_C, 47);      // Выводим текст на первый дисплей по центру экрана, координата нижней части текста по оси Y равна 47.
        myOLED_2.print  ("Адрес дисплея 0x3D", OLED_C, 47);      // Выводим текст на второй дисплей по центру экрана, координата нижней части текста по оси Y равна 47.
    }                                                            //
                                                                 //
    void loop(){}                                                //
     
    [/code]
    Вот этот скетч, но проблема не в коде, а в том что два дисплея с разными адресами не работают вместе по I2c, а только раздельно!
     
  4. Slaiterx

    Slaiterx Гик

  5. Ursus

    Ursus Нуб

    Я попробовал, как мне подсказал Slaiterx, но у меня ничего не получилось, вот часть моего кода:
    Код (C++):
    #include <Wire.h>                              //Подключение библиотеки Wire.h
    #include <iarduino_OLED_txt.h>                 //Подключение билиотеки iarduino_OLED_tht.h
      #define pin_SW_SDA A4      // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
      #define pin_SW_SCL A5
      #define pin_SW_SDA 6      // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
      #define pin_SW_SCL 7
    #define SSD1306_I2C_ADDRESS 0x3C           //1-Й ДИСПЛЕЙ
    #define SSD1306_I2C_ADDRESS 0x3D           //2-Й ДИСПЛЕЙ                      
    //SSD1306 ssd1306(SDA,SDL);                //2  дисплея SSD1306 c Ардуино
    SSD1306 ssd1306(A4,A5);                        //1-Й ДИСПЛЕЙ
    SSD1306 ssd13061(6,7);                       //2-Й ДИСПЛЕЙ
    //
    void setup() {
    Wire.begin();                            // Подключаем библиотеку Wire.h
    iarduino_OLED_txt.begin();          // Подключаем библиотеку iarduino_OLED_txt.
    }
    На строке где я объявляю дисплеи выскакивает сообщение :'SSD1306' does not name a type. Переводчик выдаёт:«SSD1306» не называет тип. Как это побороть?
     
  6. sser

    sser Гик

    SSD1306 ssd1306(A4,A5); //1-Й ДИСПЛЕЙ
    SSD1306 ssd13061(6,7); //2-Й ДИСПЛЕЙ

    А тут 13061 почему?
     
  7. Ursus

    Ursus Нуб

    Это я у кого-то подсмотрел, второй дисплей на другие пины хотел вывести
     
  8. arssev1

    arssev1 Гик

    Если вы уже пошли на такие костыли, как программный I2C, может всё-таки лучше будет подключить один дисплей по I2C, а другой по SPI. Решение тоже так-себе конечно :)
    Единственное, я боюсь вы не очень понимаете, что делаете в целом: в коде очевидные косяки, куски кода непонятно откуда...
    И ещё я плохо себе представляю проект, где нужны несколько мелких OLED дисплеев? Не проще вам будет отбойтись текстовым ЖК?
     
    DetSimen нравится это.
  9. Ursus

    Ursus Нуб

    Ну, во-первых, самое главное, это то, что мне интересно попробовать что-то новое. Просто что бы мозги не заплыли. Во-вторых, хочу попробовать воткнуть это на приборку своего авто(оно японское и 92 года выпуска), родные показометры уже ерунду показывают. Есть конечно готовые решения, но на Атмегах, а там почти везде используются ЖК-индикаторы или LSD дисплеи, на которых всё что мне надо не отобразить, да и не симпатично это. И не факт что получится, мне просто интересно! А то что разные кучки кода, так я пока осваиваю, занимаюсь всего пару недель, программист из меня ещё тот. Я решил поэтапно осваивать, сейчас идёт этап освоения дисплеев, вернее освоение вывода информации. Так что не судите меня строго.
     
  10. b707

    b707 Гуру

    :'SSD1306' does not name a type.
    - эта ошибка означает, что вы не установили библиотеку для дисплея.
    Ну и еще добавлю, что ваш код все равно с двумя дисплеями работать не будет, например из вот этих двух строк сработает только одна, нижняя - и у вас в программе будет только один адрес.
    Код (C++):
    #define SSD1306_I2C_ADDRESS 0x3C           //1-Й ДИСПЛЕЙ
    #define SSD1306_I2C_ADDRESS 0x3D           //2-Й ДИСПЛЕЙ
    Вообще, по коду очень хорошо видно, что "программист из вас еще тот" . Надо учиться, начинать с азов языка Си, а не с попыток тупо слепить программу из чужих кусков.
     
  11. arssev1

    arssev1 Гик

    Ну и выводить на OLED-дисплей показания можно, но не долго. Прочитайте про выгорание OLED
     
  12. Ursus

    Ursus Нуб

    Так я и говорю, что беру куски из тех программ которые у кого-то работают, и пытаюсь приспособить для себя. А в этом куске кода, как раз срабатывает только первый дисплей, а второй если отключить первый физически.
     
  13. Ursus

    Ursus Нуб

    Читал я про выгорание, а например TFT дисплеи как по срокам службы? Подскажите пожалуйста.
     
  14. b707

    b707 Гуру

    так я вам и говорю :), что так не программируют. Читайте учебники, а не занимайтесь фигней.

    Вполне возможно, что без правки внутреннего кода библиотек вашу задачу не решить. Без серьезных знаний такое не осилить.
     
  15. b707

    b707 Гуру

    по большей части это страшилки. У меня емть планшет с ОЛЕД более 10 лет в пользовании - никакого выгорания незаметно.
     
  16. Ursus

    Ursus Нуб

    Я не спорю с этим, но почему нельзя попробовать? Тем более что я просто пытаюсь подключить несколько дисплеев, кстати по этой теме инфы мало.
     
  17. Ursus

    Ursus Нуб

    Надо учитывать условия эксплуатации, это если говорить про машину. Уже есть готовые решения по замене всей приборки на планшетный дисплей, но мне пока этого не надо.
     
  18. b707

    b707 Гуру

    почему вам не приходит в голову написать роман по японски, составляя вместе куски японских текстов, найденных в инете? :) Просто попробовать? :)
    Пока вы не начнете понимать, что именно делает тот или иной кусок кода - у вас ничего не выйдет.
     
    Airbus, slyubez и DetSimen нравится это.
  19. b707

    b707 Гуру

    эти "решения" - попугайщина, типа китайскиз магнитол на андроиде. Обратите внимание, что на новых машинах до сих пор очень мало где ставят дисплеи вместо приборок, хотя дисплеи эти давно стоят копейки.
     
    DetSimen нравится это.
  20. arssev1

    arssev1 Гик

    А я вот почему-то уверен, что все можно приспособить под LCD2004. Во-первых его можно аккуратно врезать в панель, во-вторых с ним будет намного проще по коду, в-третьих символы там покрупнее.
    Я не поверю, что нельзя вывести все на него. Что вы планируете выводить то? Обороты, заряд аккума, температуру антифриза, температуру масла? Может УЗСК? Все это можно вывести. Причём цифрами будет намного информативнее, чем шкалами на 0.96” дисплее
    ——————
    Но вообще не мешало бы вникнуть в то, что делаете. В заимствовании кода нет ничего плохого, но только если вы понимаете, что делаете, а не просто пихаете куски кода, которые больше понравились