Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Obsługa OLED zintegrowany z ESP8266 Wemos D1

JanuszKornas 24 Feb 2020 10:46 1416 17
Altium Designer Computer Controls
  • #1
    JanuszKornas
    Level 11  
    Kupiłem taką płytkę:

    https://abc-rc.pl/product-pol-9534-Modul-NODE...SP-12F-z-wyswietlaczem-OLED-0-96-Arduino.html

    Ma zintegrowany moduł Oled. Po podaniu zasilania przez USB, startuje jakieś demo, więc płytka chyba dobra. Programowałem ESP32 poprzez środowisko Arduino IDE i tak samo chciałem tutaj. Niestety, ale nie mogę znaleźć biblioteki do obsługi tego OLED. ABC-RC pisze, że jest tam 1306, a sam wyświetlacz ma 168x64. Biblioteki zaś do 1306 mają opisy, że są do 128x64 lub mniejsze. Abstrachując od rozdzielczości, nie działają.
    Próbowałem tej biblioteki:
    https://github.com/ThingPulse/esp8266-oled-ssd1306

    Ale pozostawienie SDA/SCL nie przynosi rezultatów, a zamiana na na D1/D2 (jak sugerują opisy na płytce drukowanej), wyrzucają błędami.

    Ktoś programować taką płytkę z pomocą Arduino IDE?
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Altium Designer Computer Controls
  • #3
    vieleicht
    Level 36  
    Sprawdź adres I2c scanerem. Może jest inny niż w przykładzie.
  • #4
    JanuszKornas
    Level 11  
    vieleicht wrote:
    Sprawdź adres I2c scanerem. Może jest inny niż w przykładzie.

    Próbowałem i nic nie wykrywał. Ale miałem warninga, że bibiotego times.h, albo wires.h jest w kilku wersjach (sprawdzę dokładnie wieczorem). Brzmiało to tak jak bym miał ją w kilku wersjach i teraz nie wiem, która się ładowała.

    Sprawdzę wieczorem te przykłady od producenta.
  • #5
    khoam
    Level 41  
    JanuszKornas wrote:
    Próbowałem i nic nie wykrywał.

    Ten moduł używa D1 jako SDA oraz D2 jako SCL do sterowania wyświetlaczem, czyli odwrotnie niż ma to miejsce w wypadku domyślnych pinów I2C dla ESP8266.
  • Altium Designer Computer Controls
  • #6
    JanuszKornas
    Level 11  
    1. Nie wiem jak w I2C skanerze miabym wskazać, że SDA/SCL jest na takim a takim porcie, szukałem i nie doszedłem, jak to zrobić. Jeśi ktoś wie, to dla sportu chętnie bym się dowiedział.
    2.
    khoam wrote:
    Proponuję zacząć od przykładów, które zostały przygotowane przez producenta tej płytki D-duino:
    https://github.com/lspoplove/D-duino/tree/master/Arduino-examples

    Ten link działa, ale tam są linki do dwu bibiotek, niestety pierwsza nie działa (błędny link). Natomiast kluczowy okazał się opis pinów (PinMap z tego linku:
    https://github.com/lspoplove/D-duino
    Na niebiesko opisane są numerki używane w ArduinoIDE. Po wpisaniu numerów SDA/SCL jako piny 5 i 4, niektóre przykłądy działają (mam przykłady, które sa opisane jako "ESP8266 and ESP32 OLED driver for SSD1306 displays". Są to przykłady z biblioteki, którą wskazaem w pierwszym poście. Działa też przykład z linku wskazanego w obecnym (tym) poscie.

    UFF, już coś się uda wyświetlać. Dziękuję wszystkim za pomoc.
  • Helpful post
    #7
    khoam
    Level 41  
    JanuszKornas wrote:
    Nie wiem jak w I2C skanerze miabym wskazać, że SDA/SCL jest na takim a takim porcie

    Zmienić Wire.begin(), na Wire.begin(D1, D2).

    Dodano po 4 [minuty]:

    JanuszKornas wrote:
    Ten link działa, ale tam są linki do dwu bibiotek, niestety pierwsza nie działa (błędny link).

    Chodziło mi o przykłady zawarte w poszczególnych podkatalogach np. AdafruitGFX, OLED itd.
  • #8
    vieleicht
    Level 36  
    JanuszKornas wrote:
    1. Nie wiem jak w I2C skanerze miabym wskazać, że SDA/SCL jest na takim a takim porcie, szukałem i nie doszedłem, jak to zrobić. Jeśi ktoś wie, to dla sportu chętnie bym się dowiedział.


    I2C Scanerem sprawdzisz adresy urządzeń jakie są na magistrali, ale oczywiście musza w nią być już prawidłowo włączone.
  • #9
    xeank
    Level 2  
    W sprzedaży są też moduły z chipem ESP8266EX ( należy je odróżnić od ESP8266MOD ). W handlu sprzedawane są jako:"ESP8266 NodeMCU v3 Wifi 2.4Ghz CH340". Do współpracy z wyświetlaczem OLED ze sterownikiem SSD1306 należy ustawić piny: #define SCL D3 , #define SDA D5 ,// Initialize the OLED display using Wire library. SSD1306 display(0x3c, SDA, SCL);. Pod arduino wybieramy wtedy płytkę: "LOLIN(WEMOS) D1 mini PRO".
    Przykładowy program po modyfikacji winien wyglądać tak:
    /**
    * The MIT License (MIT)
    *
    * Copyright (c) 2016 by Daniel Eichhorn
    *
    * Permission is hereby granted, free of charge, to any person obtaining a copy
    * of this software and associated documentation files (the "Software"), to deal
    * in the Software without restriction, including without limitation the rights
    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    * copies of the Software, and to permit persons to whom the Software is
    * furnished to do so, subject to the following conditions:
    *
    * The above copyright notice and this permission notice shall be included in all
    * copies or substantial portions of the Software.
    *
    * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    * SOFTWARE.
    *
    */

    // Include the correct display library
    // For a connection via I2C using Wire include
    #include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
    #include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
    // or #include "SH1106.h" alis for `#include "SH1106Wire.h"`
    // For a connection via I2C using brzo_i2c (must be installed) include
    // #include <brzo_i2c.h> // Only needed for Arduino 1.6.5 and earlier
    // #include "SSD1306Brzo.h"
    // #include "SH1106Brzo.h"
    // For a connection via SPI include
    // #include <SPI.h> // Only needed for Arduino 1.6.5 and earlier
    // #include "SSD1306Spi.h"
    // #include "SH1106SPi.h"

    // Include custom images
    //#include "images.h"

    // Initialize the OLED display using SPI
    // D5 -> CLK
    // D7 -> MOSI (DOUT)
    // D0 -> RES
    // D2 -> DC
    // D8 -> CS
    // SSD1306Spi display(D0, D2, D8);
    // or
    // SH1106Spi display(D0, D2);

    // Initialize the OLED display using brzo_i2c
    // D3 -> SDA
    // D5 -> SCL
    // SSD1306Brzo display(0x3c, D3, D5);
    // or
    // SH1106Brzo display(0x3c, D3, D5);
    // D3 -> SCL
    // D5 -> SDA
    #define SCL D3
    #define SDA D5
    // Initialize the OLED display using Wire library
    SSD1306 display(0x3c, SDA, SCL);
    // SH1106 display(0x3c, D3, D5);


    #define DEMO_DURATION 3000
    typedef void (*Demo)(void);

    int demoMode = 0;
    int counter = 1;

    void setup() {
    Serial.begin(115200);
    Serial.println();
    Serial.println("ok");


    // Initialising the UI will init the display too.
    display.init();

    display.flipScreenVertically();
    display.setFont(ArialMT_Plain_10);

    }

    void drawFontFaceDemo() {
    // Font Demo1
    // create more fonts at http://oleddisplay.squix.ch/
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.setFont(ArialMT_Plain_10);
    display.drawString(0, 0, "Hello world");
    display.setFont(ArialMT_Plain_16);
    display.drawString(0, 10, "Hello world");
    display.setFont(ArialMT_Plain_24);
    display.drawString(0, 26, "Hello world");
    }

    void drawTextFlowDemo() {
    display.setFont(ArialMT_Plain_10);
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.drawStringMaxWidth(0, 0, 128,
    "Lorem ipsum\n dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore." );
    }

    void drawTextAlignmentDemo() {
    // Text alignment demo
    display.setFont(ArialMT_Plain_10);

    // The coordinates define the left starting point of the text
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.drawString(0, 10, "Left aligned (0,10)");

    // The coordinates define the center of the text
    display.setTextAlignment(TEXT_ALIGN_CENTER);
    display.drawString(64, 22, "Center aligned (64,22)");

    // The coordinates define the right end of the text
    display.setTextAlignment(TEXT_ALIGN_RIGHT);
    display.drawString(128, 33, "Right aligned (128,33)");
    }

    void drawRectDemo() {
    // Draw a pixel at given position
    for (int i = 0; i < 10; i++) {
    display.setPixel(i, i);
    display.setPixel(10 - i, i);
    }
    display.drawRect(12, 12, 20, 20);

    // Fill the rectangle
    display.fillRect(14, 14, 17, 17);

    // Draw a line horizontally
    display.drawHorizontalLine(0, 40, 20);

    // Draw a line horizontally
    display.drawVerticalLine(40, 0, 20);
    }

    void drawCircleDemo() {
    for (int i=1; i < 8; i++) {
    display.setColor(WHITE);
    display.drawCircle(32, 32, i*3);
    if (i % 2 == 0) {
    display.setColor(BLACK);
    }
    display.fillCircle(96, 32, 32 - i* 3);
    }
    }

    void drawProgressBarDemo() {
    int progress = (counter / 5) % 100;
    // draw the progress bar
    display.drawProgressBar(0, 32, 120, 10, progress);

    // draw the percentage as String
    display.setTextAlignment(TEXT_ALIGN_CENTER);
    display.drawString(64, 15, String(progress) + "%");
    }

    void drawImageDemo() {
    // see http://blog.squix.org/2015/05/esp8266-nodemcu-how-to-create-xbm.html
    // on how to create xbm files
    // display.drawXbm(34, 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits);
    }

    Demo demos[] = {drawFontFaceDemo, drawTextFlowDemo, drawTextAlignmentDemo, drawRectDemo, drawCircleDemo, drawProgressBarDemo, drawImageDemo};
    int demoLength = (sizeof(demos) / sizeof(Demo));
    long timeSinceLastModeSwitch = 0;

    void loop() {
    // clear the display
    display.clear();
    // draw the current demo method
    demos[demoMode]();

    display.setTextAlignment(TEXT_ALIGN_RIGHT);
    display.drawString(10, 128, String(millis()));
    // write the buffer to the display
    display.display();

    if (millis() - timeSinceLastModeSwitch > DEMO_DURATION) {
    demoMode = (demoMode + 1) % demoLength;
    timeSinceLastModeSwitch = millis();
    }
    counter++;
    delay(10);
    }
  • #10
    khoam
    Level 41  
    xeank wrote:
    W sprzedaży są też moduły z chipem ESP8266EX ( należy je odróżnić od ESP8266MOD )

    Różnica pomiędzy ESP8266EX a ESP8266MOD jest taka, że ten pierwszy jest produkowany przez Espressif, a drugi jest, a raczej był przez AI-Thinker. Funkcjonalnie nie ma żadnej różnicy.

    xeank wrote:
    W handlu sprzedawane są jako:"ESP8266 NodeMCU v3 Wifi 2.4Ghz CH340". Do współpracy z wyświetlaczem OLED ze sterownikiem SSD1306 należy ustawić piny: #define SCL D3 , #define SDA D5 ,// Initialize the OLED display using Wire library. SSD1306 display(0x3c, SDA, SCL);

    W ESP8266 piny dla I2C ustawia się programowo. Mogą one przyjmować domyślne wartości lub też nie, w zależności od tego do których pinów jest podpięty wyświetlacz. Nie ma to nic wspólnego z "typem" ESP8266.
  • #11
    JanuszKornas
    Level 11  
    Moje ArduinoIDE nie łyka D1, D2, D3 itd... musiałem ręcznie dopisać odpowiednie definicje, aby stosować D1, D2.... Jak robicie, aby to było elegancko, aby nie wpisywać tego ręcznie? Może mam coś nie doinstalowane w moim środowisku, że czegoś się nie includuje?
  • #12
    khoam
    Level 41  
    JanuszKornas wrote:
    Moje ArduinoIDE nie łyka D1, D2, D3 i

    Enumeracja w stylu D1, D2 itd. jest opcjonalna i dotyczy tylko części wariantów płytek z ESP8266. IMHO lepiej używać naturalną numerację GPIO niż tę dodatkową. Jaki masz wybrany wariant płytki w Arduino IDE?
  • #13
    JanuszKornas
    Level 11  
    Mam ustawioną "Generic ESP8266 Module". Większość przykładów, które oglądałem używa D1...
  • #14
    khoam
    Level 41  
    JanuszKornas wrote:
    Mam ustawioną "Generic ESP8266 Module".

    W tym wariancie płytki nie ma zdefiniowanych D1, D2, itd.

    JanuszKornas wrote:
    Większość przykładów, które oglądałem używa D1...

    Też nad tym ubolewam ;) Zawsze możesz zajrzeć pod poniższy link i sprawdzić, co za tymi Dx się kryje.
    https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/
    Niestesty oznaczenia Dx są niejednoznaczne i różne dla wariantów płytek. Naprawdę lepiej polegać na natywnym oznaczeniu GPIOx. Pod poniższym linkiem są pliki pins_arduino.h dla różnych płytek z ESP8266. W plikach tych są m.in. definicje Dx.
    https://github.com/esp8266/Arduino/tree/master/variants
  • #15
    Aimeiz
    Level 15  
    Hej.
    Mam dwa moduły esp8266 z zintegrowanymi wyświetlaczami OLED 128x32.
    Płytka wyjęta z torebki ma fabrycznie załadowany program skaner wifi i on działa bezproblemowo.
    Niestety mam problem z użytkowaniem innych programów.
    Próbowałem różne biblioteki, używane w róznych przykładach:
    Adafruit_GFX z Adafruit_SSD1306
    OLED.h
    SSD1306Wire.h

    Niby wszystko działa, ale wyświetlacz po kilku, kilkunastu sekundach gaśnie i trzeba zresetować albo nawet włączyć i wyłączyć.
    Niestety w zestawie płytek nie widzę płytki ESP8266 OLED, więc próbowałem Generic, ESP-12E, ten sam efekt.
    Nie mogę nigdzie znaleźć źródła tego programu, skanera wifi, który był załadowany fabrycznie, bo tam działało to bezproblemowo a po załadowaniu innych programów ciągle ten sam problem.

    Myślałem że programy się zawieszają - przepełnienie stosu etc.., ale gdy program ma komunikację przez serial, to cały czas działa, tylko display gaśnie.
    W deklaracjach wyświetlacza stosuję SDA i SCL - to działa, ale problem z gaśnięciem jest.

    Jakiś pomysł??
  • #16
    khoam
    Level 41  
    Aimeiz wrote:
    Mam dwa moduły esp8266 z zintegrowanymi wyświetlaczami OLED 128x32.

    Jaki to konkretnie moduł? Na rynku jest kilka wariantów.
  • #17
    Aimeiz
    Level 15  
    Hej.
    Na Ebay kupione dwa moduły w zeszłym roku.
    Nazywa się to:
    "ESP8266 Nodemcu WIFI Chip 0.91 inch OLED Display Screen CP2104 Board For Arduino".
    Płytka ciemnego koloru. Są wersje z białą płytka.
    Obydwa zachowują się tak samo. Oryginalny kod załadowany fabrycznie - wifiscan działa prawidłowo, wiec moduł może działać poprawnie.
    Przykłady OLED z dostępnych bibliotek, zarówno Adafruit jak i inne dostępne poprzez managera bibliotek zachowują się podobnie.
    Wyświetlacz albo nic wyświetla, albo tylko przez krótki czas i gaśnie.
    Nigdzie nie mogłem znaleźć informacji o bibliotece użytej w fabrycznie załadowanym programie.
  • #18
    khoam
    Level 41  
    Aimeiz wrote:
    Nigdzie nie mogłem znaleźć informacji o bibliotece użytej w fabrycznie załadowanym programie.

    Link