MODULE ARDUINO & THƯ VIỆN

Hướng dẫn kết nối Arduino với màn hình OLED full thư viện

Hướng dẫn kết nối Arduino với màn hình OLED full thư viện

Màn hình OLED được điều khiển dựa trên IC SSD1306. Trong hướng dẫn này sử dụng màn hình OLED đơn sắc 0,96 inch kết nối và điều khiển với Arduino. Bộ thư viện cài đặt bao gồm một số chương trình ví dụ có sẵn.

Màn hình OLED kết nối với Arduino bốn dây dẫn – hai dây cho nguồn (VCC & GND) và hai dây cho dữ liệu (SDA & SCL). Đây là kiểu kết nối dữ liệu I2C (I ²C hoặc IIC).

Trong phần hướng dẫn này, chúng ta sử dụng bộ thư viện để hiển thị những ký tự và hình ảnh đơn giản lên màn hình OLED 0.96 inch 128×64.

Sơ đồ nối dây màn hình OLED với Arduino

Điều đầu tiên và quan trọng nhất là bạn cần phải chú ý 2 chân VCC & GND. Bạn phải chắc chắn rằng bạn kết nối đúng chân VCC & GND với Arduino. Đôi lúc 2 chân này bị đổi cực ở một số module khác nhau.

Các chân được nối với Arduino như sau:

  • OLED GND – Arduino GND
  • OLED VCC – Arduino 5V
  • OLED SCL – Arduino Uno A5
  • OLED SDA – Arduino Uno A4

Đối với Arduino MEGA 2560, các chân được thay đổi như sau:

  • OLED GND – Arduino GND
  • OLED VCC – Arduino 5V
  • OLED SCL – Arduino MEGA 2560 pin 21
  • OLED SDA – Arduino MEGA 2560 pin 20

Thư viện OLED I2C dành cho IC SSD1306 và phần mềm hỗ trợ

Hai thư viện Arduino cần cài đặt để có thể điều khiển màn hình OLED. Thư viện trình điều khiển SSD1306 được sử dụng để khởi tạo màn hình và cung cấp các chức năng hiển thị ở mức thấp. Thư viện GFX cung cấp các chức năng đồ họa để hiển thị văn bản, đường vẽ và hình tròn, vv

Cài đặt thư viện SSD1306

Download thư viện SSD1306 tại đây

Cài đặt thư viện GFX

Download thư viện GFX tại đây

Cấu hình thư viện điều khiển SSD1306

Kích thước màn hình phải được thay đổi trong trình điều khiển trước khi nó có thể được sử dụng. Nếu không thay đổi trước, một thông báo lỗi sẽ xuất hiện khi upload chương trình như bên dưới:
#error (“Height incorrect, please fix Adafruit_SSD1306.h!”);

Mở thư mục Adafruit_SSD1306 vừa được cài đặt trong thư mục thư viện Arduino. Đường dẫn mặc định là: Documents → Arduino → libraries.

Mở file Adafruit_SSD1306.h. Tìm đến phần có tiêu đề SSD1306, comment dòng lệnh bằng dấu ‘#’ phía trước dòng define SSD1306_128_32 và xóa dấu ‘#’ ở lệnh #define SSD1306_128_64 để code trông như sau:

/*=========================================================================
    SSD1306 Displays
    -----------------------------------------------------------------------
    The driver is used in multiple displays (128x64, 128x32, etc.).
    Select the appropriate display below to create an appropriately
    sized framebuffer, etc.

    SSD1306_128_64  128x64 pixel display

    SSD1306_128_32  128x32 pixel display

    SSD1306_96_16

    -----------------------------------------------------------------------*/
   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16
/*=========================================================================*/

Chạy thử code mẫu

Bạn mở code mẫu theo ở trên phần mềm Arduino IDE: File → Examples → Adafruit SSD1306ssd1306_128x64_i2c

void setup()   {                
  Serial.begin(9600);

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  //display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // changed this to 0x3C to make it work
  // init done

Bạn có thể thay đổi địa chỉ màn hình thành 3D và 3C để có thể hiển thị lên màn hình OLED. (thông thường là 3C).

Hello World

Màn hình OLED được cầu thành từ 128 pixel (điểm ảnh) theo chiều ngang và 64 pixel theo chiều dọc. Vì vậy, bạn có thể hiển thị những hình ảnh đơn sắc lên màn hình này thông qua từng điểm ảnh riêng biệt.

Bạn nạp thử đoạn code Hello world này xuống Arduino:

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

// OLED display TWI address
#define OLED_ADDR   0x3C

Adafruit_SSD1306 display(-1);

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup() {
  // initialize and clear display
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.clearDisplay();
  display.display();

  // display a pixel in each corner of the screen
  display.drawPixel(0, 0, WHITE);
  display.drawPixel(127, 0, WHITE);
  display.drawPixel(0, 63, WHITE);
  display.drawPixel(127, 63, WHITE);

  // display a line of text
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(27,30);
  display.print("Hello, world!");

  // update display with all of the above graphics
  display.display();
}

void loop() {
  // put your main code here, to run repeatedly:

}

Trong đoạn code trên có 4 lệnh để hiện thị 4 điểm ảnh tại 4 góc của màn hình

  // display a pixel in each corner of the screen
  display.drawPixel(0, 0, WHITE);
  display.drawPixel(127, 0, WHITE);
  display.drawPixel(0, 63, WHITE);
  display.drawPixel(127, 63, WHITE);

Tương ứng với điểm 0,0 là điểm nằm ở góc trên bên trái màn hình và các điểm còn lại có vị trí như sau

  • Phía trên bên trái: x = 0, y = 0.
  • Phía trên bên phải: x = 127, y = 0.
  • Phía dưới bên trái: x = 0, y = 63.
  • Phía dưới bên phải: x = 127, y = 63.

Để hiển thị một dòng chữ lên trên màn hình OLED ta sử dụng lệnh:

 

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

Nhưng trước khi gửi lệnh in chữ ra màn hình ta cần phải xác định kích thước chữ (setTextSize), màu sắc chữ (setTextColor) và vị trí hiển thị (setCursor).

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(27,30);
  display.print("Hello, world!");

Dòng chữ Hello, world sẽ được hiển thị tại vị trí bắt đầu là x=27 và y=30 với kích thước là 1 và chữ màu trắng.

Một số câu lệnh điều khiển cơ bản theo Arduino.vn

  • *.init(0x3C);
    • Khởi động oled với địa chỉ i2c đó, loại mình đang đề cập có địa chỉ đó.
  • *.display();
    • Bắt đầu vẽ lên màn hình
  • *.clearDisplay();
    • Xóa hết màn hình
  • *.clearArea(x,y,w,h);
    • Xóa một vùng nào đó. x,y là tọa độ điểm bắt đầu của vùng đó (đỉnh trên cùng bên trái), w và h là chiều dài và cao của vùng cần xóa.
  • *.setCursor(x,y);
    • Đưa điểm bắt đầu vẽ lên màn hình tới x,y
  • *.setBrightness(brightness);
    • Chỉnh độ sáng của oled, 0->255
  • *.setTextSize(s);
    • Chỉnh size chữ, mặc định không dùng lệnh thì s=1.
  • *.setTextColor(c);

Hoặc

  • *.setTextColor(c,bg);
    • c là màu chữ, WHITE(1) hoặc BLACK(0)
    • bg là màu nền, WHITE(1) hoặc BLACK(0)
    • Nếu chỉ điền c thì bg tự động chỉnh ngược với c.
  • *.setRotation(r);
    • r nhập từ 0 đến 3
  • *.getRotation();
    • Trả về giá trị từ 0-3 cho biến gán vào hàm này.
  • *.width();
    • Trả về giá trị chiều dài màn hình cho biến gán vào hàm này. Đối với loại này thì là 128.
  • *.height();
    • Trả về giá trị chiều dài màn hình cho biến gán vào hàm này. Đối với loại này thì là 64.
  • *.print();
  • *.println();
    • Hai hàm này giống trong serial, lưu ý: Sau hai hàm này phải thêm lệnh *.display(); để màn hình hiển thị.
  • *.drawPixel(x,y,c);
    • Vẽ 1 điểm tại x,y với c là màu của điểm (WHITE hoặc BLACK)
  • *.drawChar(x,y,char,color,bg,size);
    • Vẽ một kí tự
      • x, y: tọa độ điểm vẽ
      • char: kí tự cần vẽ
      • color: Màu kí tự (WHITE hoặc BLACK)
      • bg: Màu nền CỦA kí tự (WHITE hoặc BLACK)
      • size: Kích cỡ kí tự (Kích cỡ kí tự bằng (sizex5pixel) X (sizex7pixel))

Vẽ hình ảnh lên trên OLED

Để có thể hiển thị hình ảnh lên OLED ta cần phải chuyển hình ảnh đó về dạng bitmap. Phần mềm LCD Assistance sẽ hỗ trợ bạn phần này: Link download tại đây

Bước 1: Bạn resize ảnh bằng Paint.

Bước 2: Bạn chọn File>Load Image và chọn ảnh vừa resize

Bước 3: File>Load Image và chọn ảnh vừa resize

Bước 4: File>Save output và điền tên để lưu lại

Bước 5: Mở file vừa lưu bằng Notepad

Bước 6: Copy phần biến const unsigned char bitmap và paste vô file sketch arduino để lập trình.

#include <Wire.h>
#include <GOFi2cOLED.h>
#include <avr/pgmspace.h>
 
GOFi2cOLED GOFoled;
 
//32x32 pixeles
const unsigned char PROGMEM heart1[]={
0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xC0, 0x80,
0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F,
0x0F, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
 
//56x56 pixeles
const unsigned char PROGMEM heart2[]={
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0,
0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x80, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0xF8, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x00, 0x00, 0x00, 0x07, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x1F, 0x0F,
0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x0F, 0x07,
0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0F, 0x1F, 0x1F, 0x0F, 0x07, 0x03,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
};
 
void setup()   {                  
  //default address is 0x3D.
  GOFoled.init(0x3C);
  // init done
 
  GOFoled.display(); // show splashscreen
  delay(2000);
  GOFoled.clearDisplay();
 
  GOFoled.setTextSize(1);
  GOFoled.setTextColor(WHITE);
}
 
void loop() {
 
  GOFoled.setCursor(20,56);
  GOFoled.print("www.arduino.vn"); 
  GOFoled.drawBitmap(48, 16, heart1, 32, 32, WHITE);  //draw heart1 bitmap.
  GOFoled.display();
  delay(500);  
  GOFoled.clearDisplay();
 
  GOFoled.setCursor(20,56);
  GOFoled.print("www.arduino.vn");   
  GOFoled.drawBitmap(36, 2, heart2, 56, 56, WHITE);  //draw heart2 bitmap.
  GOFoled.display();
  delay(500);  
  GOFoled.clearDisplay();  
}

Nguồn:

  • Arduino.vn
  • learn.adafruit.com
  • startingelectronics.org