Skocz do zawartości

OLED adafruitSSD1306 problem z dwoma wyświetlaczami


Pomocna odpowiedź

Napisano (edytowany)

Witam

Mam problem z podłączeniem dwóch wyświetlaczy do magistrali I2C

 Z jednym wyświetlaczem działa bez problemu ale podczas podroczenia drugiego mam problem ponieważ wygląda to tak jakby była zła rozdzielczość ekranu ustawiona. 

   

   IMG_20201122_120614.thumb.jpg.b875737d2945c42bfb75ee735b2b291a.jpg

Podczas podroczenia dwóch widać linie i obraz jest powiększony

[code]

#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

#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)

Adafruit_SSD1306 display1(OLED_RESET);
Adafruit_SSD1306 display2(OLED_RESET);


void setup() {
  Serial.begin(9600);

  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  display1.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display2.begin(SSD1306_SWITCHCAPVCC, 0x3D);
 
}

void loop() {

  display1.setTextColor(WHITE);
  display1.display();
  display1.clearDisplay();
  display1.setTextSize(2);
  display1.setCursor(1, 1);
  display1.println("oled 1");
  
 
  display2.setTextColor(WHITE);
  display2.display();
  display2.clearDisplay();
  display2.setTextSize(2);
  display2.setCursor(1, 1);
  display2.println("oled 2");
  
}
[/code]

    

Edytowano przez Romeo
(edytowany)

 Tak, adres zmieniony i sprawdzony 

 

Z tego co mi się wydaje problem morze być z kodem 

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

 na tym kodzie działa poprawnie ale nie chce współpracować z dwoma wyświetlacz. Musze z niego usunąć  cześć  "  SCREEN_WIDTH, SCREEN_HEIGHT,  &Wire,  " tylko z tego co mi się wydaje jest to cześć odpowiedzialna za rozdzielczość 

Edytowano przez Romeo
22 minuty temu, aerograf7 napisał:

@Romeo a próbowałeś stworzyć 2 różne instancje klasy (Adafruit_SSD1306) np. display1 i display 2

Tak, ale jak tak zrobię jest problem z rozdzielczością.

 

Adafruit_SSD1306 display1(OLED_RESET); Adafruit_SSD1306 display2(OLED_RESET);

2 godziny temu, Romeo napisał:

Z tego co mi się wydaje problem morze być z kodem 

Ty nam bajek o Misiach Wydajach na morzu nie opowiadaj, tylko powiedz dokładnie co nie działa, jeśli stworzysz dwie instancje displaya, np:
 

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Konkretnie:L komunikat błędu jeśli występuje, fotki obu ekranów jeśli pokazują nie to co trzeba, ew. inormacje w stylu "ekran pierwszy jest czarny".

BTW, wspólny reset dla dwóch ekranów to nie jest dobry pomysł...

3 minuty temu, ethanak napisał:

Ty nam bajek o Misiach Wydajach na morzu nie opowiadaj, tylko powiedz dokładnie co nie działa, jeśli stworzysz dwie instancje displaya, np:
 


Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Konkretnie:L komunikat błędu jeśli występuje, fotki obu ekranów jeśli pokazują nie to co trzeba, ew. inormacje w stylu "ekran pierwszy jest czarny".

BTW, wspólny reset dla dwóch ekranów to nie jest dobry pomysł...

Dwa ekrany pokazują tak jak na foto wyżej. 

Błędów brak.

Problem jest tylko z rozdzielczością (skalowaniem) obrazu przez co widać linie 

2 minuty temu, Romeo napisał:

Problem jest tylko z rozdzielczością (skalowaniem) obrazu przez co widać linie 

Przypominam, że pokazywałeś inny kod i fotkę jednego ekranu a nie obu.

Masz podłączone piny reset na displayach? Co będzie jeśli odłączysz lub podepniesz do dwóch różnych pinów Arduino?

 

 

(edytowany)

Dwa wyświetlacze razem 

IMG_20201122_210455.thumb.jpg.336bace910b32fa2b7e8a97edf88daa8.jpg

I dla porównania jeden 

IMG_20201122_211321.thumb.jpg.871ac23e802da64e17fe70c3cfc34643.jpg

W obydwu przypadka taki sam rozmiar tekstu.

(Zdjęcie oglądać na pełnym ekranie, inaczej nie widać różnicy)

Edytowano przez Romeo

Pytanie: te wyświetlacze nie mają pinu RESET. Dlaczego w konstruktorze podajesz pin 4 jako reset a nie -1? Procedura resetu wyświetlacza wygląda wtedy nieco inaczej.

Nie wiem czy to ma wpływ na wyświetlanie, ale podanie pinu "z czapy" jest błędem.

8 minut temu, ethanak napisał:

Pytanie: te wyświetlacze nie mają pinu RESET. Dlaczego w konstruktorze podajesz pin 4 jako reset a nie -1? Procedura resetu wyświetlacza wygląda wtedy nieco inaczej.

Nie wiem czy to ma wpływ na wyświetlanie, ale podanie pinu "z czapy" jest błędem.

Poprawiłem na -1, ale efektów brak 

Coś jeszcze znalazłem:

W dokumentacji stoi jak byk:

Cytat

/*!
    @brief  DEPRECATED constructor for I2C SSD1306 displays. Provided for
            older code to maintain compatibility with the current library.
            Screen size is determined by enabling one of the SSD1306_* size
            defines in Adafruit_SSD1306.h. New code should NOT use this.
            Only the primary I2C bus is supported.
    @param  rst_pin
            Reset pin (using Arduino pin numbering), or -1 if not used
            (some displays might be wired to share the microcontroller's
            reset pin).
    @return Adafruit_SSD1306 object.
    @note   Call the object's begin() function before use -- buffer
            allocation is performed there!
*/
Adafruit_SSD1306::Adafruit_SSD1306(int8_t rst_pin) :

Czyli takiej uproszczonej konstrukcji nie powinno się stosować...

 

 

26 minut temu, ethanak napisał:

Coś jeszcze znalazłem:

W dokumentacji stoi jak byk:

Czyli takiej uproszczonej konstrukcji nie powinno się stosować...

 

 

Z moim poziomem wiedzy na temat programowania nie wiele mi to mówi  

Więc dlaczego stosujesz konstrukcję, która jest oficjalnie uznana za przestarzałą, a jej użycie wymaga spełnienia dodatkowych warunków?

Niestety - mam tylko SH1106, a byłem pewien że to SSD1306, więc nie sprawdzę 😞

  • 1 miesiąc później...
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X64_NONAME_2_HW_I2C OLED_1(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_2_HW_I2C OLED_2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  OLED_1.setI2CAddress(0x3C * 2);        
  OLED_2.setI2CAddress(0x3D * 2);        
 
  OLED_1.begin();
  OLED_2.begin();

//  OLED_1.setFont(u8g_font_6x10);
//  OLED_2.setFont(u8g_font_6x10);

}
void loop(void) {

  OLED_1.clearBuffer();         
  OLED_1.setFont(u8g2_font_ncenB08_tr);
  OLED_1.drawStr(0,10,"hello World!"); 
  OLED_1.sendBuffer();         
  
  OLED_2.clearBuffer();        
  OLED_2.setFont(u8g2_font_ncenB08_tr); 
  OLED_2.drawStr(0,10,"hello World!");  
  OLED_2.sendBuffer();         
  delay(1000);  
}

 

Skorzystałem z innej biblioteki i teraz działa wszystko jak należy 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...