初学arduino时需要驱动0.96的oled屏幕,U8g2库虽然很全,但是sendBuffer时耗时较久,影响loop内的代码
遂准备使用Adafruit_SSD1306试一试,但是网上的关于四脚i2c接口oled屏幕的教程都是千篇一律从官方示例拿来的代码,只有使用硬件i2c引脚的示例,查询源码后发现使用任意gpio引脚驱动的方法,记录如下:
对象创建和官方一样
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(/*SCREEN_WIDTH*/128, /*SCREEN_HEIGHT*/64, &Wire, OLED_RESET);
setup函数中
void setup() {
Wire.begin(/*SDA*/12,/*SCL*/14);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c,false,false)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
}
关键是增加了Wire.begin(SDA,SCL)这一句来使用软件i2c引脚
display.begin中
第一个参数不知道什么意思,但不影响使用
第二个参数表示i2c地址,看很多地方都写0x3c也就这么写了,具体为啥我也不懂
第三个参数表示是否reset
第四个参数periphBegin比较关键,要为false,否则函数内部将再次调用Wire.begin();
if (periphBegin)
wire->begin();
但是为true也可以显示,不过为了保险起见,还是写false