Adafruit_ssd1306 не работает

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

Метки:
  1. Код (C++):
    // библиотеки для работы с OLED экраном Arduino IDE
    #include "Wire.h"
    #include "Adafruit_GFX.h"
    #include "Adafruit_SSD1306.h"

    Adafruit_SSD1306 display(128, 64, &Wire, 4); // указываем размер экрана в пикселях

    void setup() {
       display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // указываем адрес устройства на шине
       display.clearDisplay();
    выдает на экран мусор
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Если ошибаюсь - прошу не пинать. Вроде там так -
    операции типа display.clearDisplay(); работают с буфером экрана, но не с самим экраном. После этого надо добавить команду записи из буфера в экран - display.display();
     
  3. b707

    b707 Гуру

    а вопрос в чем?
     
  4. почему
     
  5. b707

    b707 Гуру

    не умеете
     
  6. научите
     
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Адрес экрана 128х64 = 0x3D. Но от китайцев всего можно ожидать, так что пробуйте оба (3С / 3D).
     
  8. issaom

    issaom Гуру

    Там есть стандартные примеры их загружали?
     
  9. да, такой.
    Код (C++):
    /**************************************************************************
    This is an example for our Monochrome OLEDs based on SSD1306 drivers

    Pick one up today in the adafruit shop!
    ------> http://www.adafruit.com/category/63_98

    This example is for a 128x32 pixel display using I2C to communicate
    3 pins are required to interface (two I2C and one reset).

    Adafruit invests time and resources providing this open
    source code, please support Adafruit and open-source
    hardware by purchasing products from Adafruit!

    Written by Limor Fried/Ladyada for Adafruit Industries,
    with contributions from the open source community.
    BSD license, check license.txt for more information
    All text above, and the splash screen below must be
    included in any redistribution.
    **************************************************************************/


    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>

    #define SCREEN_WIDTH 128 // OLED display width, in pixels
    #define SCREEN_HEIGHT 64 // OLED display height, in pixels

    // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
    // The pins for I2C are defined by the Wire-library.
    // On an arduino UNO:       A4(SDA), A5(SCL)
    // On an arduino MEGA 2560: 20(SDA), 21(SCL)
    // On an arduino LEONARDO:   2(SDA),  3(SCL), ...
    #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
    #define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

    #define NUMFLAKES     10 // Number of snowflakes in the animation example

    #define LOGO_HEIGHT   16
    #define LOGO_WIDTH    16
    static const unsigned char PROGMEM logo_bmp[] =
    { 0b00000000, 0b11000000,
      0b00000001, 0b11000000,
      0b00000001, 0b11000000,
      0b00000011, 0b11100000,
      0b11110011, 0b11100000,
      0b11111110, 0b11111000,
      0b01111110, 0b11111111,
      0b00110011, 0b10011111,
      0b00011111, 0b11111100,
    ......................................................  



        }
      }
    }
     
  10. b707

    b707 Гуру

    это что за обрывок? Где setup() где loop() ?
     
  11. весь код не влез - слишком много строк.
    меня интересует исключительно инициализация устройств.
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    тут нет явного указания на адрес устройства.
    Однако, я, видимо, что то проглядел, если есть
    #define SCREEN_ADDRESS 0x3D
     
  12. точно, проглядел
    Код (C++):
    if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        Serial.println(F("SSD1306 allocation failed"));
        for(;;); // Don't proceed, loop forever
    ... не проглядел.
    в адафруит с адресацией понятно - просто на экран выводится шум и немного мелькающего изображения.
     
  13. это взят стандартный пример из библиотеки.
     
  14. b707

    b707 Гуру

    зачем врать-то?
    В "стандартном примере" обязан быть setup() и loop()

    Дайте ссылку на свой "стандартный пример" в библиотеке
     
  15. чего врать то?
    я
    не говорил, что в примере этого нет. Форум заблокировал внесение кода более 1000 строк.
     
  16. Код (C++):
    /**************************************************************************
    This is an example for our Monochrome OLEDs based on SSD1306 drivers

    Pick one up today in the adafruit shop!
    ------> http://www.adafruit.com/category/63_98

    This example is for a 128x64 pixel display using I2C to communicate
    3 pins are required to interface (two I2C and one reset).

    Adafruit invests time and resources providing this open
    source code, please support Adafruit and open-source
    hardware by purchasing products from Adafruit!

    Written by Limor Fried/Ladyada for Adafruit Industries,
    with contributions from the open source community.
    BSD license, check license.txt for more information
    All text above, and the splash screen below must be
    included in any redistribution.
    **************************************************************************/


    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>

    #define SCREEN_WIDTH 128 // OLED display width, in pixels
    #define SCREEN_HEIGHT 64 // OLED display height, in pixels
     
  17. пример из библиотеки Adafruit SSD 1306
    ssd1306_128x64_i2c
     
  18. b707

    b707 Гуру

    в примере всего чуть более 400 строк... ну да ладно.
    Адрес дисплея задается в 35-й строке:
    Код (C++):
    #define SCREEN_ADDRESS 0x3D
    для проверки уберите из схемы все, кроме ардуино и одного дисплея. Подтяните линии SDA SCL к питанию и тогда проверяйте
    Не перепутайте адрес дисплея. если у вас два дисплея с разными адресами.
     
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Натыкался на эффект с мусором вроде вашего. Пришел к выводу, что процесс работы шины И2С заносит мусор в буфер дисплея, даже если к нему нет обращения. Если вы потом пишете в буфер - запишутся нужные адреса. Но мусор в неиспользованных адресах буфера останется. И потом выведется на экран. Поэтому процесс вывода на экран должен быть - очистка буфера-запись в буфер-вывод буфера на экран.
     
    Последнее редактирование: 18 май 2022
  20. возможно, но это я брал пример, и там много разного демонстрируется. Надпись скошенная, вверху ползает. Не похоже на просто мусор