logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Obsługa wyświetlacza OLED ESP-12F na NodeMCU z Arduino IDE

JanuszKornas 24 Lut 2020 10:46 4290 17
REKLAMA
  • #1 18490356
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    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?
  • REKLAMA
  • Pomocny post
    #2 18490406
    Konto nie istnieje
    Poziom 1  
  • #3 18490492
    vieleicht
    Poziom 37  
    Posty: 2163
    Pomógł: 463
    Ocena: 455
    Sprawdź adres I2c scanerem. Może jest inny niż w przykładzie.
  • #4 18490558
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    vieleicht napisał:
    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 18490584
    Konto nie istnieje
    Poziom 1  
  • #6 18491589
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    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 napisał:
    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.
  • REKLAMA
  • Pomocny post
    #7 18491604
    Konto nie istnieje
    Poziom 1  
  • #8 18492123
    vieleicht
    Poziom 37  
    Posty: 2163
    Pomógł: 463
    Ocena: 455
    JanuszKornas napisał:
    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.
  • REKLAMA
  • #9 18503329
    xeank
    Poziom 2  
    Posty: 4
    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);
    }
    Załączniki:
    • ESP8266EX_D1_LOIN_D1_mini_PRO.zip (2.38 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 18503479
    Konto nie istnieje
    Poziom 1  
  • #11 18504962
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    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 18505226
    Konto nie istnieje
    Poziom 1  
  • #13 18505647
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    Mam ustawioną "Generic ESP8266 Module". Większość przykładów, które oglądałem używa D1...
  • REKLAMA
  • #14 18506161
    Konto nie istnieje
    Poziom 1  
  • #15 19110455
    Aimeiz
    Poziom 16  
    Posty: 290
    Pomógł: 2
    Ocena: 20
    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 19110628
    Konto nie istnieje
    Poziom 1  
  • #17 19134406
    Aimeiz
    Poziom 16  
    Posty: 290
    Pomógł: 2
    Ocena: 20
    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 19134566
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ Użytkownik zakupił moduł NodeMCU z zintegrowanym wyświetlaczem OLED 0.96, jednak napotkał problemy z jego obsługą w Arduino IDE. Po podłączeniu zasilania, wyświetlacz uruchamia demo, ale biblioteki do sterowania OLED, takie jak SSD1306, nie działają poprawnie z rozdzielczością 168x64. Użytkownicy sugerują sprawdzenie adresu I2C oraz użycie pinów D1 (SDA) i D2 (SCL) do komunikacji. Po kilku próbach i modyfikacjach kodu, w tym zmianie definicji pinów w bibliotece, udało się uzyskać działający wyświetlacz. W dyskusji poruszono również różnice między chipami ESP8266EX a ESP8266MOD oraz problemy z gaśnięciem wyświetlacza w innych projektach.
Wygenerowane przez model językowy.
REKLAMA