介绍 你是不是厌倦了在Arduino项目中反复使用字符LCD显示器?事实上,它们已经成为过去。进入梦幻般的OLED(有机发光二极管)显示屏!它们非常轻,几乎像纸一样薄,理论上是灵活的,可以产生更明亮、更清晰的图像。
OLED显示器有各种尺寸(例如128×64、128×32)和颜色(例如白色,蓝色和双色OLED)。一些OLED显示器具有I2C接口,而另一些则具有SPI接口。
但是,他们都有的一件事是,他们的核心是强大的单芯片CMOS OLED驱动器控制器-SSD1306,它可以处理所有RAM缓冲,因此您的Arduino几乎不需要工作。
在本教程中,我们将同时使用I2C和SPI 0.96英寸128×64 OLED显示器。不用担心您的模块是不同的尺寸或颜色;此页面上的信息仍然有用。
SPI 和 I2C 怎么选? SPI通常比I2C快,但需要更多的I/O引脚。另一方面,I2C仅需要两个引脚,并且可以与其他I2C外围设备共享。因为这是引脚和速度之间的权衡,所以选择完全取决于场景需要。
引脚连接 pin 引脚连接开发板的 gpio 接口即可:
DEV BOARD
Sensor
Pin 2
signal
5 V
+V
GND
GND
代码示例 使用 Adafruit_SSD1306 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 #include <Arduino.h> #include <Adafruit_SSD1306.h> int SDA_PIN = 8 ;int SCL_PIN = 9 ;#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET) ;void setup () { Serial.begin (9600 ); Wire.begin (SDA_PIN, SCL_PIN); display.clearDisplay (); display.setTextSize (1 ); display.setTextColor (WHITE); display.setCursor (0 ,28 ); display.println ("Hello world!" ); display.display (); delay (2000 ); display.clearDisplay (); display.setTextColor (BLACK, WHITE); display.setCursor (0 ,28 ); display.println ("Hello world!" ); display.display (); delay (2000 ); display.clearDisplay (); display.setTextColor (WHITE); display.setCursor (0 ,24 ); display.setTextSize (2 ); display.println ("Hello!" ); display.display (); delay (2000 ); display.clearDisplay (); display.setTextSize (1 ); display.setCursor (0 ,28 ); display.println (123456789 ); display.display (); delay (2000 ); display.clearDisplay (); display.setCursor (0 ,28 ); display.print ("0x" ); display.print (0xFF , HEX); display.print ("(HEX) = " ); display.print (0xFF , DEC); display.println ("(DEC)" ); display.display (); delay (2000 ); display.clearDisplay (); display.setCursor (0 ,24 ); display.setTextSize (2 ); display.write (3 ); display.display (); delay (2000 ); display.clearDisplay (); display.setCursor (0 ,0 ); display.setTextSize (1 ); display.println ("Full" ); display.println ("screen" ); display.println ("scrolling!" ); display.display (); display.startscrollright (0x00 , 0x07 ); delay (2000 ); display.stopscroll (); delay (1000 ); display.startscrollleft (0x00 , 0x07 ); delay (2000 ); display.stopscroll (); delay (1000 ); display.startscrolldiagright (0x00 , 0x07 ); delay (2000 ); display.startscrolldiagleft (0x00 , 0x07 ); delay (2000 ); display.stopscroll (); display.clearDisplay (); display.setCursor (0 ,0 ); display.setTextSize (1 ); display.println ("Scroll" ); display.println ("some part" ); display.println ("of the screen." ); display.display (); display.startscrollright (0x00 , 0x00 ); } void loop () {}
使用U8g2
如果是最小系统板,建议不要用这个库,性能要求会比较高
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #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_SSD1306_128X64_NONAME_F_SW_I2C u8g2 (U8G2_R0, 9 , 8 , U8X8_PIN_NONE) ; U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2 (U8G2_R0, U8X8_PIN_NONE) ; void setup (void ) { u8g2.begin (); } void loop (void ) { u8g2.clearBuffer (); u8g2.setFont (u8g2_font_ncenB08_tr); u8g2.drawStr (0 ,15 ,"Hello World!" ); u8g2.sendBuffer (); }
以下是 ESP32-c3-supermini 上的表现
以下为 esp8266 上演示,可以很明显看到动画的丝滑程度相差还是蛮大的….
小结 OLED 显示屏的驱动方式主要有 I2C 和 SPI 两种,I2C 方式适合于简单的应用,而 SPI 方式适合于需要更高性能的应用。在 Arduino 上,可以使用 Adafruit_SSD1306 库来驱动 OLED 显示屏,该库提供了丰富的功能,包括显示文本、数字、ASCII 字符等。在使用该库时,需要根据具体的硬件连接方式选择合适的引脚。