09-OLED顯示器

(2017/03/16)

0.96寸 藍色 白色 IIC通信 小OLED顯示屏模塊 51單片機

與Arduino Uno連接圖

  • 第一個程式(開啟範例程式:ssd1306_128x64_i2c)

  • 上傳程式時,發生錯誤

  • 去修改libraries\Adafruit_SSD1306-master下的Adafruit_SSD1306.h ,利用wordpad(不要用記事本)去開啟此檔

      • 因為本OLED是128X64,所以要改為

      • #define SSD1306_128_64

      • // #define SSD1306_128_32

      • // #define SSD1306_96_16

    • 上傳後,發現仍然沒有畫面,這是因為I2C的位址有錯,本OLED的address是0x3C,而非範例的0X3D,有其他程式可以測得此OLED的ADDRESS,後面再介紹

  • 修改後,重新上傳,成功

    • 程式中,有各種顯示指示,請自行參閱

參考資料:

发一个 绘图 Adafruit GFX图形库

概述 Overview

坐标系统和单位 Coordinate System and Units

图形语法 Graphics Primitives

画点(点) Drawing pixels (points)

画线 Drawing lines

矩形 Rectangles

圆 Circles

圆角矩形 Rounded rectangles

三角形 Triangles

字符和文本 Characters and text

位图 Bitmaps

清除或填充屏幕 Clearing or filling the screen

旋转屏幕 Rotating the Display

與NodeMCU連接

如何測得OLED的Address

  • 先到TUNIOT官網(http://easycoding.tn/index.php/resources/)找到 Download I2C scanner sketch.,並下載回來

  • 程式如下:

    1. #include <Wire.h>

    2. void setup()

    3. {

    4. Wire.begin();

    5. Serial.begin(9600);

    6. while (!Serial); // Leonardo: wait for serial monitor

    7. Serial.println("\nI2C Scanner");

    8. }

    9. void loop()

    10. {

    11. byte error, address;

    12. int nDevices;

    13. Serial.println("Scanning...");

    14. nDevices = 0;

    15. for(address = 1; address < 127; address++ )

    16. {

    17. // The i2c_scanner uses the return value of

    18. // the Write.endTransmisstion to see if

    19. // a device did acknowledge to the address.

    20. Wire.beginTransmission(address);

    21. error = Wire.endTransmission();

    22. if (error == 0)

    23. {

    24. Serial.print("I2C device found at address 0x");

    25. if (address<16)

    26. Serial.print("0");

    27. Serial.print(address,HEX);

    28. Serial.println(" !");

    29. nDevices++;

    30. }

    31. else if (error==4)

    32. {

    33. Serial.print("Unknow error at address 0x");

    34. if (address<16)

    35. Serial.print("0");

    36. Serial.println(address,HEX);

    37. }

    38. }

    39. if (nDevices == 0)

    40. Serial.println("No I2C devices found\n");

    41. else

    42. Serial.println("done\n");

    43. delay(5000); // wait 5 seconds for next scan

    44. }

  • 上傳程式,測得結果,如下

顯示指令:

// Clear the buffer.

display.clearDisplay();

// draw a single pixel

display.drawPixel(10, 10, WHITE);

// Show the display buffer on the hardware.

// NOTE: You _must_ call display after making any drawing commands

// to make them visible on the display hardware!

display.display();

delay(2000);

display.clearDisplay();

// draw many lines

testdrawline();

display.display();

delay(2000);

display.clearDisplay();

// draw rectangles

testdrawrect();

display.display();

delay(2000);

display.clearDisplay();

// draw multiple rectangles

testfillrect();

display.display();

delay(2000);

display.clearDisplay();

// draw mulitple circles

testdrawcircle();

display.display();

delay(2000);

display.clearDisplay();

// draw a white circle, 10 pixel radius

display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);

display.display();

delay(2000);

display.clearDisplay();

testdrawroundrect();

delay(2000);

display.clearDisplay();

testfillroundrect();

delay(2000);

display.clearDisplay();

testdrawtriangle();

delay(2000);

display.clearDisplay();

testfilltriangle();

delay(2000);

display.clearDisplay();

// draw the first ~12 characters in the font

testdrawchar();

display.display();

delay(2000);

display.clearDisplay();

// draw scrolling text

testscrolltext();

delay(2000);

display.clearDisplay();

// text display tests

display.setTextSize(1);

display.setTextColor(WHITE);

display.setCursor(0,0);

display.println("Hello, world!");

display.setTextColor(BLACK, WHITE); // 'inverted' text

display.println(3.141592);

display.setTextSize(2);

display.setTextColor(WHITE);

display.print("0x"); display.println(0xDEADBEEF, HEX);

display.display();

delay(2000);

display.clearDisplay();

// miniature bitmap display

display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);

display.display();

delay(1);

// invert the display

display.invertDisplay(true);

delay(1000);

display.invertDisplay(false);

delay(1000);

display.clearDisplay();

// draw a bitmap icon and 'animate' movement

testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);

}

void loop() {

}

void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {

uint8_t icons[NUMFLAKES][3];

// initialize

for (uint8_t f=0; f< NUMFLAKES; f++) {

icons[f][XPOS] = random(display.width());

icons[f][YPOS] = 0;

icons[f][DELTAY] = random(5) + 1;

Serial.print("x: ");

Serial.print(icons[f][XPOS], DEC);

Serial.print(" y: ");

Serial.print(icons[f][YPOS], DEC);

Serial.print(" dy: ");

Serial.println(icons[f][DELTAY], DEC);

}

while (1) {

// draw each icon

for (uint8_t f=0; f< NUMFLAKES; f++) {

display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);

}

display.display();

delay(200);

// then erase it + move it

for (uint8_t f=0; f< NUMFLAKES; f++) {

display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);

// move it

icons[f][YPOS] += icons[f][DELTAY];

// if its gone, reinit

if (icons[f][YPOS] > display.height()) {

icons[f][XPOS] = random(display.width());

icons[f][YPOS] = 0;

icons[f][DELTAY] = random(5) + 1;

}

}

}

}

void testdrawchar(void) {

display.setTextSize(1);

display.setTextColor(WHITE);

display.setCursor(0,0);

for (uint8_t i=0; i < 168; i++) {

if (i == '\n') continue;

display.write(i);

if ((i > 0) && (i % 21 == 0))

display.println();

}

display.display();

delay(1);

}

void testdrawcircle(void) {

for (int16_t i=0; i<display.height(); i+=2) {

display.drawCircle(display.width()/2, display.height()/2, i, WHITE);

display.display();

delay(1);

}

}

void testfillrect(void) {

uint8_t color = 1;

for (int16_t i=0; i<display.height()/2; i+=3) {

// alternate colors

display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);

display.display();

delay(1);

color++;

}

}

void testdrawtriangle(void) {

for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {

display.drawTriangle(display.width()/2, display.height()/2-i,

display.width()/2-i, display.height()/2+i,

display.width()/2+i, display.height()/2+i, WHITE);

display.display();

delay(1);

}

}

void testfilltriangle(void) {

uint8_t color = WHITE;

for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {

display.fillTriangle(display.width()/2, display.height()/2-i,

display.width()/2-i, display.height()/2+i,

display.width()/2+i, display.height()/2+i, WHITE);

if (color == WHITE) color = BLACK;

else color = WHITE;

display.display();

delay(1);

}

}

void testdrawroundrect(void) {

for (int16_t i=0; i<display.height()/2-2; i+=2) {

display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE);

display.display();

delay(1);

}

}

void testfillroundrect(void) {

uint8_t color = WHITE;

for (int16_t i=0; i<display.height()/2-2; i+=2) {

display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);

if (color == WHITE) color = BLACK;

else color = WHITE;

display.display();

delay(1);

}

}

void testdrawrect(void) {

for (int16_t i=0; i<display.height()/2; i+=2) {

display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);

display.display();

delay(1);

}

}

void testdrawline() {

for (int16_t i=0; i<display.width(); i+=4) {

display.drawLine(0, 0, i, display.height()-1, WHITE);

display.display();

delay(1);

}

for (int16_t i=0; i<display.height(); i+=4) {

display.drawLine(0, 0, display.width()-1, i, WHITE);

display.display();

delay(1);

}

delay(250);

display.clearDisplay();

for (int16_t i=0; i<display.width(); i+=4) {

display.drawLine(0, display.height()-1, i, 0, WHITE);

display.display();

delay(1);

}

for (int16_t i=display.height()-1; i>=0; i-=4) {

display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);

display.display();

delay(1);

}

delay(250);

display.clearDisplay();

for (int16_t i=display.width()-1; i>=0; i-=4) {

display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);

display.display();

delay(1);

}

for (int16_t i=display.height()-1; i>=0; i-=4) {

display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);

display.display();

delay(1);

}

delay(250);

display.clearDisplay();

for (int16_t i=0; i<display.height(); i+=4) {

display.drawLine(display.width()-1, 0, 0, i, WHITE);

display.display();

delay(1);

}

for (int16_t i=0; i<display.width(); i+=4) {

display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);

display.display();

delay(1);

}

delay(250);

}

void testscrolltext(void) {

display.setTextSize(2);

display.setTextColor(WHITE);

display.setCursor(10,0);

display.clearDisplay();

display.println("scroll");

display.display();

delay(1);

display.startscrollright(0x00, 0x0F);

delay(2000);

display.stopscroll();

delay(1000);

display.startscrollleft(0x00, 0x0F);

delay(2000);

display.stopscroll();

delay(1000);

display.startscrolldiagright(0x00, 0x07);

delay(2000);

display.startscrolldiagleft(0x00, 0x07);

delay(2000);

display.stopscroll();

}