Trong bài trước, chúng ta đã làm quen và biết cách sử dụng thư viện để hiển thị ký tự hoặc chuỗi lên màn hình. Trong bài này, chúng ta sẽ hiển thị hình ảnh với OLED sử dụng thư viện mới và phần mềm tạo hình ảnh GIMP.
Các loại màn hình OLED hiện nay có giá thành ngày một giảm. Tuy nhiên, chip điều khiển các màn hình này rất đa dạng nên cần một thư viện tổng để có thể sử dụng chúng thuận tiện hơn. Thư viện OLED được sử dụng nhiều nhất là U8g2 (tải tại đây).
Hoặc tải trực tiếp từ Arduino IDE
Việc hiển thị ký tự rất đơn giản, ta có thể tham khảo các bài ví dụ có sẵn sau khi cài đặt thư viện. Để hiển thị hình ảnh tùy thích thì cần phần mềm chỉnh sửa hình ảnh để có định dạnh ảnh phù hợp. Phần mềm miễn phí dễ sử dụng được lựa chọn là GIMP
Bước 1: Kết nối Arduino với OLED
Bước 2: Kiểm tra tình trạng hoạt động của OLED bằng cách mở chương trình ví dụ. Trong phần mềm Arduino IDE
File > Examples > U8g2 > page_buffer > GraphicsTest
Chú ý: Phải bỏ phần đánh dấu chú thích truớc loại OLED đang sử dụng. Trong trường hợp này, OLED do Trung quốc sản xuất có chip SH1106 và vùng hiển thị 128×64 sử dụng chuẩn I2C.
Bước 3: Lựa chọn hình ảnh cần hiển thị rồi mở bằng phần mềm GIMP. Sau đó chuyển đổi sang dạng 1 bit như sau:
Image –> Mode –> Indexed –> Use black and white (1-bit)palette –> Convert
Bước 4: Cắt ảnh cho phù hợp, sử dụng công cụ lựa chọn Rectangular select tool rồi chọn Image –> Crop to selection.
Bước 5: Chuyển tỉ lệ cho vừa màn hình OLED bằng cách chọn Image –> Scale Image, chú ý khóa tỉ lệ aspect ratio và đặt kích thước theo pixels
Trong ví dụ này ta đưa hình về kích thước 44×64 px. Sau đó dùng các công cụ vẽ để chỉnh sửa hình nếu cần.
Bước 6: Xuất tập tin ra dạng phù hợp bằng File –> Export As –> lưu tên ironman.xbm
Chú ý tập tin hình ảnh phải có dạng .xbm
Bước 7: Mở Arduino IDE và sử dụng đoạn chương trình sau. Trong đó chú ý, vùng định nghĩa hình ảnh là chép từ nội dung tập tin ironman.xbm
#include<Arduino.h>
#include<U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include<SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include<Wire.h>
#endif
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// Vùng định nghĩa hình ảnh
#define ironman_width 44
#define ironman_height 64
static const unsigned char ironman_bits[] PROGMEM = { 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0x86, 0xff, 0x1f, 0x06, 0x00, 0x80, 0x81, 0xff, 0x1f, 0x18, 0x00, 0xc0, 0x80, 0xff, 0x1f, 0x30, 0x00, 0x20, 0x80, 0xff, 0x1f, 0xc0, 0x00, 0x10, 0x00, 0xff, 0x0f, 0x80, 0x01, 0x08, 0x00, 0xff, 0x0f, 0x00, 0x01, 0x08, 0x00, 0xff, 0x0f, 0x00, 0x02, 0x08, 0x00, 0xff, 0x0f, 0x00, 0x02, 0x08, 0x00, 0xfe, 0x07, 0x00, 0x02, 0x08, 0x00, 0xfe, 0x07, 0x00, 0x02, 0x08, 0x00, 0xfe, 0x07, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xc6, 0x07, 0x00, 0x00, 0x7c, 0x0e, 0xe6, 0xff, 0xff, 0xff, 0xff, 0x0e, 0xe6, 0xff, 0x03, 0xf8, 0xff, 0x0c, 0x02, 0x3f, 0x00, 0x80, 0x1f, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0x16, 0x00, 0x00, 0x00, 0x00, 0x06, 0x2e, 0x00, 0x00, 0x00, 0x80, 0x07, 0x6e, 0x00, 0x00, 0x00, 0x40, 0x07, 0x6e, 0x00, 0x00, 0x00, 0x60, 0x07, 0xde, 0x00, 0x00, 0x00, 0xb0, 0x07, 0xde, 0x00, 0x00, 0x00, 0xb0, 0x07, 0x9c, 0x01, 0x00, 0x00, 0xd8, 0x03, 0xbc, 0x01, 0x00, 0x00, 0xf8, 0x03, 0x3c, 0x01, 0x00, 0x00, 0xe8, 0x03, 0x7c, 0x03, 0x00, 0x00, 0xf4, 0x03, 0xfc, 0x02, 0x00, 0x00, 0xf4, 0x03, 0xfc, 0xc2, 0xff, 0x1f, 0xfa, 0x03, 0xf8, 0x25, 0xff, 0x27, 0xfa, 0x01, 0xf8, 0x38, 0x00, 0x60, 0xf9, 0x01, 0xf8, 0x10, 0x00, 0xc0, 0xf8, 0x01, 0xf0, 0x00, 0x00, 0x00, 0xf8, 0x01, 0xf0, 0x00, 0x00, 0x00, 0xf8, 0x01, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xe0, 0xc1, 0xff, 0x0f, 0xf8, 0x00, 0xc0, 0xe3, 0xff, 0x1f, 0x7c, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x3e, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x0f, 0x00, 0x00, 0xf6, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00 };
void draw(void)
{
u8g2.drawXBMP( 42, 0, ironman_width, ironman_height, ironman_bits);
}
void setup(void)
{
u8g2.begin();
}
void loop(void)
{
u8g2.firstPage();
do
{
draw();
}
while( u8g2.nextPage() );
delay(1000);
}