Tìm kiếm mã

Mã Arduino và Video cho màn hình SSD1306 OLED 128 x 32 với I2C

Mã Arduino và Video cho màn hình SSD1306 OLED 128 x 32 với I2C

Trong hướng dẫn này, chúng ta sẽ khám phá cách sử dụng màn hình SSD1306 OLED 128 x 32 với giao tiếp I2C trên Arduino. Mục tiêu là hiển thị nhiều thành phần khác nhau như văn bản, hình chữ nhật và các giá trị động như điện áp và nhiệt độ trên màn hình. Thiết lập này lý tưởng cho các dự án yêu cầu giải pháp hiển thị nhỏ gọn và hiệu quả.

SSD1306 OLED 128x32

Chúng ta sẽ đi qua các thành phần phần cứng cần thiết, hướng dẫn đấu dây và mã Arduino để mọi thứ hoạt động. Để có hướng dẫn trực quan, hãy xem video đi kèm với hướng dẫn này (trong video tại 00:00).

Giải thích về Phần cứng

Các thành phần chính cho dự án này bao gồm màn hình SSD1306 OLED, một màn hình tiêu thụ điện năng thấp sử dụng giao tiếp I2C để kết nối dễ dàng. Màn hình có độ phân giải 128 x 32 pixel, phù hợp để hiển thị văn bản và đồ họa đơn giản.

Để điều khiển màn hình, chúng ta sẽ sử dụng bo mạch Arduino, bo mạch này sẽ gửi lệnh và dữ liệu qua I2C. Arduino xử lý logic hiển thị thông tin bằng cách sử dụng các thư viện như Adafruit_GFXAdafruit_SSD1306. Các thư viện này đơn giản hóa quá trình giao tiếp và cho phép vẽ các hình dạng và văn bản một cách dễ dàng.

Chi tiết từ Bảng dữ liệu

Nhà sản xuấtAdafruit
Số bộ phậnSSD1306
Điện áp Logic/IO3.3 - 5 V
Điện áp cấp nguồn3.3 - 5 V
Dòng điện tiêu thụ~20 mA (điển hình)
Độ phân giải màn hình128 x 32 pixel
Giao diệnI2C
Kích thước128 x 32 mm
Ghi chú / Biến thểCó sẵn với nhiều kích thước và giao diện khác nhau
  • Kiểm tra địa chỉ I2C, thường là 0x3C cho OLED.
  • Đảm bảo nguồn điện phù hợp để tránh hư hỏng.
  • Sử dụng điện trở kéo lên cho các đường SDA và SCL nếu cần.
  • Giữ dây nối ngắn để giảm nhiễu trong tín hiệu I2C.
  • Cân nhắc tản nhiệt nếu cấp nguồn cho nhiều mô-đun.

Hướng dẫn Đấu dây

Arduino wiring for SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32

Để đấu dây màn hình SSD1306 OLED, trước tiên kết nối chân VCC của màn hình với đầu ra 5V trên Arduino. Tiếp theo, kết nối chân GND với một trong các chân nối đất của Arduino. Đối với giao tiếp I2C, kết nối chân SDA của màn hình với chân SDA trên Arduino, là A4 đối với UNO. Sau đó, kết nối chân SCL của màn hình với chân SCL trên Arduino, là A5 đối với UNO. Nếu bạn sử dụng một mẫu Arduino khác, hãy tham khảo sơ đồ chân cụ thể cho SDA và SCL.

Đối với các thành phần bổ sung, nếu bạn có một đèn LED muốn điều khiển, hãy kết nối nó với chân 9 qua một điện trở 330 ohm. Đảm bảo kết nối đầu còn lại của điện trở với cực dương của đèn LED, trong khi cực âm nên đi đến nối đất. Thiết lập này sẽ cho phép đèn LED sáng khi chân 9 được kích hoạt.

Ví dụ Mã & Hướng dẫn Chi tiết

Trong mã Arduino, chúng ta bắt đầu bằng việc bao gồm các thư viện cần thiết cho màn hình OLED. Một định danh chính là display, một thể hiện của lớp Adafruit_SSD1306. Màn hình được khởi tạo trong hàm setup(), nơi chúng ta cũng xóa màn hình để chuẩn bị vẽ.

SSD1306 OLED 128x32
void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(2000);
  display.clearDisplay(); 
}

Trong hàm loop(), chúng ta định nghĩa một biến chuỗi vString để chứa giá trị điện áp, được cập nhật động. Hàm robojaxText() được sử dụng để hiển thị văn bản trên màn hình tại các tọa độ được chỉ định.

void loop() {
  String vString = String(count, 3);
  display.clearDisplay();
  robojaxText("Voltage:          ", 4, 3, 1, false);
  robojaxText(vString, 72, 3, 1, false);
  display.display();
  count += 0.173;
  delay(2000); 
}

Hàm robojaxText() rất quan trọng để định vị và hiển thị văn bản. Nó nhận các tham số cho chuỗi văn bản, tọa độ x và y, kích thước văn bản và một giá trị boolean để xác định xem màn hình có nên được cập nhật ngay lập tức hay không.

void robojaxText(String text, int x, int y, int size, boolean d) {
  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x, y);
  display.println(text);
  if(d) {
    display.display();
  }
}

Hàm này đặt kích thước văn bản, màu sắc và vị trí con trỏ trước khi in văn bản. Hãy nhớ xem video để có hướng dẫn chi tiết đầy đủ về mã (trong video tại 10:00).

Trình diễn / Điều gì sẽ xảy ra

Khi mã được tải lên Arduino, màn hình OLED sẽ hiển thị điện áp, nhiệt độ và giá trị dung lượng cập nhật động mỗi hai giây. Bạn cũng sẽ thấy một hình chữ nhật được vẽ xung quanh các thành phần văn bản. Nếu màn hình không hiển thị gì, hãy đảm bảo các kết nối đúng và địa chỉ I2C khớp với địa chỉ được chỉ định trong mã.

Mốc thời gian Video

  • 00:00 - Giới thiệu về dự án
  • 02:00 - Hướng dẫn đấu dây
  • 05:00 - Hướng dẫn chi tiết mã
  • 10:00 - Trình diễn đầu ra

Hình ảnh

SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32
83-Arduino code and video for SSD1306 OLED 128 x 32 display with I2C
Ngôn ngữ: C++
/*********************************************************************
This is an example for our monochrome OLEDs based on SSD1306 drivers.

This example is for a 128x32 size display using I2C.

If you get the error: Adafruit_GFX.h not found, download the Adafruit-GFX Library
https://github.com/adafruit/Adafruit-GFX-Library


Purchase this OLED module from Amazon: https://amzn.to/36zFvTb

Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, check license.txt for more information.
All text above, and the splash screen must be included in any redistribution.

 * Watch the video for this code to learn it fully.
  * Watch the video here: https://youtu.be/RjyulqVsz2o
 * This code is offered "as is" without any warranty.
 * Updated by Ahmad Shamshiri for Robojax.com video tutorial
 * on March 18, 2018 at 10:21 in Ajax, Ontario, Canada.
 * Please view other Robojax codes and videos at http://robojax.com/learn/arduino
 * If you are sharing this code, you must keep this copyright note.
 * 
*********************************************************************/

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

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
double count=0;

/*
 * PIN connection:
 * Pin connection see: https://www.arduino.cc/en/Reference/Wire
 * for UNO: SDA to A4, SCL to A5
 * for Mega2560: SDA to 20, SCL to 21
 * for Leonardo: SDA to 2, SCL to 3
 * for Due: SDA to 20, SCL to 21
 * VCC to 5V
 * GND to GND :-)
 */


// this is the Width and Height of Display which is 128 x 32
#define LOGO16_GLCD_HEIGHT 32
#define LOGO16_GLCD_WIDTH  128 


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

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

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  display.display();
  delay(2000);
   // Clear the buffer.
  display.clearDisplay(); 
}


void loop() {
  String vString =  String(count, 3);// using a float and the 
  display.clearDisplay();
  robojaxText("Voltage:          ", 4, 3, 1, false);
  robojaxText(vString, 72, 3, 1, false);
  robojaxText("V", 110, 3, 1, false);
  robojaxText("Temperature: 32C", 4, 11, 1, false);
  robojaxText("Capacity:   92.86L", 4, 21, 1, false);
  //display.drawLine(1, 37, 100, 37, WHITE);
 display.drawRect(1, 1, 126,31, WHITE);
  //display.drawCircle(63,31, 31, WHITE);
   //display.startscrollright(0x00, 0x0F);
  display.display();
  count +=0.173;
   delay(2000); 
}


/*
 * robojaxText(String text, int x, int y,int size, boolean d)
 * text is the text string to be printed
 * x is the integer x position of text
 * y is the integer y position of text
 * size is the text size, 1, 2, 3 etc
 * d is either true or false.  If true, the display is updated.
 */
void robojaxText(String text, int x, int y,int size, boolean d) {

  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x,y);
  display.println(text);
  if(d){
    display.display();
  }
  
  //delay(100);
}

Nghĩ bạn có thể cần

Tài nguyên & tài liệu tham khảo

Tập tin📁

Bảng dữ liệu (pdf)

  • SSD1306 display datasheet
    SSD1306 is a single-chip CMOS OLED/PLED driver with controller for organic / polymer light emitting diode dot-matrix graphic display system. It consists of 128 segments and 64commons. This IC is designed for Common Cathode type OLED panel. The SSD1306 embeds with contrast control, display RAM and oscillator, which reduces the number of external components and power consumption. It has 256-step brightness control. Data/Commands are sent from general MCU through the hardware selectable 6800/8000 series compatible Parallel Interface, I2C interface or Serial Peripheral Interface. It is suitable for many compact portable applications, such as mobile phone sub-display, MP3 player and calculator, etc.
    SSD1306_display_datasheet.pdf 1.79 MB

Tập tin Fritzing

  • SSD1306 128x32 OLED Wiring
    Fritzing wiring diagram for an SSD1306 128x32 OLED display, showing connections to a microcontroller (likely Arduino). Useful for breadboard prototyping and verifying I2C or SPI wiring.
    SSD1306_128x32_wiring.fzz

Wiring diagram

  • SSD1306 128x32 OLED Wiring
    Fritzing wiring diagram for an SSD1306 128x32 OLED display, showing connections to a microcontroller (likely Arduino). Useful for breadboard prototyping and verifying I2C or SPI wiring.
    SSD1306_128x32_wiring.fzz