Skocz do zawartości

OLED adafruitSSD1306 problem z dwoma wyświetlaczami


Romeo

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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);

Link do komentarza
Share on other sites

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ł...

Link do komentarza
Share on other sites

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 

Link do komentarza
Share on other sites

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?

 

 

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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 

Link do komentarza
Share on other sites

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ć...

 

 

Link do komentarza
Share on other sites

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  

Link do komentarza
Share on other sites

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ę 😞

Link do komentarza
Share on other sites

#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 

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.