wtorek, 19 kwietnia 2016

[23] Arduino - Wyświetlacz OLED

W tym poście chciałbym zaprezentować wyświetlacz OLED 0,96" wykorzystujący interfejs I2C, ze sterownikiem SSD1306.

Opis


Parametry wyświetlacza są następujące:

  • zasilanie 3-5V
  • kolor niebieski
  • temperatura pracy od -30 st. C do 80 st. C
  • komunikacja poprzez SPI
  • pobór mocy maksymalnie 0,08W
  • sterownik SSD1306

Rys. 1. Wyświetlacz OLED obok Arduino Uno Rev3. 

Do tego wyświetlacza można wykorzystać bibliotekę Adafriut. Należy ją pobrać z następujących linków.


Po ściągnięciu ich na komputer w formacie zip należy je dodać do Arduino poprzez Szkic -> Dołącz bibliotekę -> Dodaj bibliotekę zip

Podłączenie


Wyświetlacz należy podłączyć w następujący sposób:

  • GND - Arduino GND
  • VCC - Zasilanie 5V lub 3,3V
  • SCL - Arduino pin 10
  • SDA - Arduino pin 9
  • RST - Arduino pin 13
  • D/C - Arduino pin 11

Programowanie


W celu poprawnej obsługi należy wykorzystać następujące biblioteki:

  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <Adafruit_GFX.h>
  4. #include <Adafruit_SSD1306.h>

Kolejnym krokiem jest dodanie odpowiedniej nazwy pinów i przyporządkować je do odpowiedniego obiektu w bibliotece. Poniżej przedstawione jest domyślne ustawienie i wybranie pinów

  1. #define OLED_MOSI   9
  2. #define OLED_CLK   10
  3. #define OLED_DC    11
  4. #define OLED_CS    12
  5. #define OLED_RESET 13
  6. Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

Część włączająca wyświetlacz opiera się na jego włączeniu w programie. Do tego celu służy następująca linijka kodu:


  1. display.begin(SSD1306_SWITCHCAPVCC);

Włączenie przyporządkowanych ustawień do wyświetlacza wykonuje się poprzez polecenie.

  1. display.display();

Czyszczenie wyświetlacza odbywa się poprzez podanie następującej komendy.

  1. display.clearDisplay();

Jeśli chodzi o rysowanie bitmapy, należy ją oczywiście zdeklarować w formie tablicy. Natomiast w celu jej wywołania stosuje się następującą linijkę kodu.

  1. //Podaje się następujące parametry
  2. //Położenie w osi X oraz Y, następnie
  3. //Odnośnik do tablicy z bitmapą
  4. //Kolejne wartości okreslaja wielkosc obrazu
  5. display.drawBitmap(10, 0,  bitmapa, 88, 64, 1);

Pierwszy program będzie przykładowy, przedstawi on krótko możliwości wyświetlacza. Opiera się on na przykładzie dodanym do biblioteki. Wklejam przerobioną wersję poniżej. Zawiera ona podstawowe sposoby wykorzystania bez wywoływania bitmapy oraz tworzenia grafik na ekranie. Każda linijka została przeze mnie poprzedzona odpowiednim komentarzem wyjaśniającym jej funkcję.

  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <Adafruit_GFX.h>
  4. #include <Adafruit_SSD1306.h>
  5. #define OLED_MOSI   9
  6. #define OLED_CLK   10
  7. #define OLED_DC    11
  8. #define OLED_CS    12
  9. #define OLED_RESET 13
  10. Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
  11. #define NUMFLAKES 10
  12. #define XPOS 0
  13. #define YPOS 1
  14. #define DELTAY 2
  15. #define LOGO16_GLCD_HEIGHT 16
  16. #define LOGO16_GLCD_WIDTH  16
  17. //Zabezpieczenie przed zdefiniowana wielkoscia
  18. //wyskosci wysiwietlacza
  19. //Opisywany przezemnie ma 128x32, mozna jeszcze kupic 128x64
  20. #if (SSD1306_LCDHEIGHT != 32)
  21. #error("Height incorrect, please fix Adafruit_SSD1306.h!");
  22. #endif
  23. void setup()  
  24. {                
  25.   //Inicjacja wyswietlacza
  26.   display.begin(SSD1306_SWITCHCAPVCC);
  27.   display.display();
  28.   delay(2000);
  29.   //Czyszczenie wyswietlacza w tym przypadku
  30.   //okna glownego
  31.   display.clearDisplay();
  32.   //wyswietlenie tekstu
  33.   //ustawienie rozmiaru
  34.   display.setTextSize(1);
  35.   //ustawienie koloru wyswietlacza
  36.   display.setTextColor(WHITE);
  37.   //Ustawienie kursora na wyswietlaczu
  38.   display.setCursor(0,0);
  39.   //Wypisanie tekstu
  40.   display.println("Dziala");
  41.   //Wyswietlenie tekstu o odwroconych kolorach
  42.   display.setTextColor(BLACK, WHITE);
  43.   //Wyswietlenie liczby
  44.   //Po przecinku wyswietlane sa dwie liczby maksymalnie
  45.   display.print(3.14);
  46.   display.setTextColor(WHITE);
  47.   display.print("   ");
  48.   display.setTextColor(WHITE);
  49.   display.println(10, BIN);
  50.   //Ustawienie rozmiaru tekstu drugiego
  51.   display.setTextSize(2);
  52.   //Ustawienie koloru
  53.   display.setTextColor(WHITE);
  54.   //Wyswietlenie znaku
  55.   display.print("0x");
  56.   //Wyswietlenie liczby, przed przecinkiem podawana
  57.   //jest liczba w odpowiednim zapisie, po przecinku
  58.   //wprowadzany jest format w jakim ma zostać wyswietlone
  59.   display.println(80, HEX);
  60.   //Inicjacja wyswietlacza wprowadzonymi parametrami
  61.   display.display();
  62. }
  63. void loop() {}

Drugi przykład będzie przedstawiał wynik odczytu parametrów z konwertera analogowo cyfrowego. Wykorzystałem piny A0 oraz A1, do których zostały podłączone dwa potencjometry.

  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <Adafruit_GFX.h>
  4. #include <Adafruit_SSD1306.h>
  5. #define OLED_MOSI   9
  6. #define OLED_CLK   10
  7. #define OLED_DC    11
  8. #define OLED_CS    12
  9. #define OLED_RESET 13
  10. Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
  11. #define NUMFLAKES 10
  12. #define XPOS 0
  13. #define YPOS 1
  14. #define DELTAY 2
  15. #define LOGO16_GLCD_HEIGHT 16
  16. #define LOGO16_GLCD_WIDTH  16
  17. //Zabezpieczenie przed zdefiniowana wielkoscia
  18. //wyskosci wysiwietlacza
  19. //Opisywany przezemnie ma 128x32, mozna jeszcze kupic 128x64
  20. #if (SSD1306_LCDHEIGHT != 32)
  21. #error("Height incorrect, please fix Adafruit_SSD1306.h!");
  22. #endif
  23. int DaneZPinuA0 = 0;
  24. int DaneZPinuA1 = 0;
  25. void setup()  
  26. {                
  27.   //Inicjacja wyswietlacza
  28.   display.begin(SSD1306_SWITCHCAPVCC);
  29.   display.display();
  30.   delay(2000);
  31.   //Czyszczenie wyswietlacza w tym przypadku
  32.   //okna glownego
  33.   display.clearDisplay();
  34. }
  35. void loop()
  36. {
  37.   //Pobranie danych z ADC
  38.   DaneZPinuA0 = analogRead(A0);
  39.   DaneZPinuA1 = analogRead(A1);
  40.   //Czyszczenie wyswietlacza
  41.   display.clearDisplay();
  42.   //Ustawienienie rozmiaru
  43.   //i koloru wyswietlanego tekstu
  44.   display.setTextSize(2);
  45.   display.setTextColor(WHITE);
  46.   display.setCursor(0,0);
  47.   //Wypisanie tekstu
  48.   display.print("A0: ");
  49.   display.println(DaneZPinuA0);
  50.   display.print("A1: ");
  51.   display.println(DaneZPinuA1);
  52.   delay(500);
  53.   display.display();
  54. }

Rys. 2. Widok działającego wyświetlacza z podłączonymi potencjometrami

W trzecim przykładzie podłącze do Arduino czujnik odległości HC-SR04. Wynik natomiast będzie prezentowany na wyświetlaczu w postaci czasu trwania impulsu oraz odległości od przeszkody podanej w cm. 

  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <Adafruit_GFX.h>
  4. #include <Adafruit_SSD1306.h>
  5. #define OLED_MOSI   9
  6. #define OLED_CLK   10
  7. #define OLED_DC    11
  8. #define OLED_CS    12
  9. #define OLED_RESET 13
  10. #define ECHO 6
  11. #define TRIGGER 7
  12. Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
  13. #define NUMFLAKES 10
  14. #define XPOS 0
  15. #define YPOS 1
  16. #define DELTAY 2
  17. #define LOGO16_GLCD_HEIGHT 16
  18. #define LOGO16_GLCD_WIDTH  16
  19. //Zabezpieczenie przed zdefiniowaniem za dużej wielkości wyświetlacza
  20. //Opisywany przezemnie ma 128x32, mozna jeszcze kupic 128x64
  21. #if (SSD1306_LCDHEIGHT != 32)
  22. #error("Height incorrect, please fix Adafruit_SSD1306.h!");
  23. #endif
  24. int DaneZPinuA0 = 0;
  25. int DaneZPinuA1 = 0;
  26. float ODLEGLOSC = 0;     //odległość w cm
  27. long CZAS = 0;         //długość impuslu na pinie echo
  28. float MAX = 0;
  29. float MIN = 0;
  30. void pomiar_odleglosci(void);
  31. void setup()  
  32. {                
  33.   //Inicjacja wyswietlacza
  34.   display.begin(SSD1306_SWITCHCAPVCC);
  35.   display.display();
  36.   delay(2000);
  37.   //Czyszczenie wyswietlacza w tym przypadku
  38.   //okna glownego
  39.   display.clearDisplay();
  40.   pinMode(TRIGGER, OUTPUT);  //Ustawienie pinu Trigger jako wyjście
  41.   pinMode(ECHO, INPUT);      //Ustawienie pinu Echo jako wejście
  42. }
  43. void loop()
  44. {
  45.   pomiar_odleglosci();    //Wywołanie funkcji zewnętrznej
  46.   //Czyszczenie wyswietlacza
  47.   display.clearDisplay();
  48.   //Ustawienienie rozmiaru
  49.   //i koloru wyswietlanego tekstu
  50.   display.setTextSize(2);
  51.   display.setTextColor(WHITE);
  52.   display.setCursor(0,0);
  53.   //Wypisanie tekstu
  54.   display.print("T: ");
  55.   display.println(CZAS);
  56.   ODLEGLOSC = (CZAS / 58.0);
  57.   display.print("O: ");
  58.   display.println(ODLEGLOSC);
  59.   delay(1200);
  60.   display.display();
  61. }
  62. void pomiar_odleglosci()
  63. {
  64.   // impuls 10 uS inicjalizujacy
  65.   digitalWrite(TRIGGER, HIGH);  //Ustawienie stanu wysokiego pin Trigger
  66.   delayMicroseconds(10);        //Opóźnienie 10us
  67.   digitalWrite(TRIGGER, LOW);   //Stan niski na pin Trigger
  68.   CZAS = pulseIn(ECHO, HIGH);   //Obliczenie długości trwania impulsu
  69. }